From 559289d8397ef69bbcee96dbfdcfd5834105c650 Mon Sep 17 00:00:00 2001 From: Hermes Team Date: Sat, 22 Aug 2026 21:45:05 +0700 Subject: [PATCH] =?UTF-8?q?docs(task):=20B7=20=E2=80=94=20=D0=B7=D0=B0?= =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D0=B4=D0=B5=D1=84=D0=B5=D0=BA=D1=82=20?= =?UTF-8?q?=D0=BC=D0=B0=D1=81=D1=82=D0=B5=D1=80=D0=B0=20=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=82=D1=80=D0=B5=D0=B1=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D1=83=20=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=BD=D0=B5=D1=81=D1=83=D1=89=D0=B5=D1=81=D1=82=D0=B2=D1=83?= =?UTF-8?q?=D1=8E=D1=89=D0=B8=D0=B5=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлен раздел P0-0: правка _finish уже в main (7090c8a), её нельзя потерять при слиянии. Там же второй дефект того же класса — splash.py вызывает несуществующий AssetManager.get_splash_logo. Дефект «вызов несуществующего метода» встречается третий раз и под pythonw всегда молчаливый, поэтому в критерии приёмки добавлено требование механической проверки UI-слоя. Co-Authored-By: Claude Opus 5 --- .../2026-08-22-B7-codex-usability-defects.md | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/agents/inbox/2026-08-22-B7-codex-usability-defects.md b/agents/inbox/2026-08-22-B7-codex-usability-defects.md index a1f2866..84174a5 100644 --- a/agents/inbox/2026-08-22-B7-codex-usability-defects.md +++ b/agents/inbox/2026-08-22-B7-codex-usability-defects.md @@ -49,6 +49,22 @@ git checkout main; git reset --hard origin/main Каждое проверено по коду. Ниже — что относится к вам; пункты 1 (частично) и 2 уходят в backend отдельным заданием A8. +## P0-0. Уже исправлено на main — не откатите при слиянии + +Владелец сообщил: «завершить кнопка нажимается, но окно не закрывается». Найдено и исправлено ревьюером в `7090c8a`, файл вашей зоны — `add_account_wizard.py`. + +Причина: `_finish` первой строкой вызывал `EventLogService.get().log_event(...)`. Метода `log_event` у сервиса **нет** — настоящая сигнатура `log(category, message, details=None, level="info")`. `AttributeError` уходил в обработчик Tk, консоли под `pythonw` нет, и для пользователя кнопка просто не работала: окно оставалось открытым, `on_complete` не вызывался, подключённый аккаунт не попадал в маршрутизацию. + +Правка: вызов приведён к настоящему API; журналирование и `on_complete` обёрнуты так, чтобы сбой в них не запирал пользователя в мастере. Регрессия закрыта тестом `tests/test_ui_wizard_finish.py`. + +**От вас требуется:** + +1. При слиянии сохранить эту правку. Ветку создавать от свежего `origin/main` — тогда конфликта не будет. +2. Найденный тем же способом второй дефект: `ui/splash.py:40` вызывает `AssetManager.get().get_splash_logo(...)` — такого метода нет, есть `get_logo_image`. Модуль сейчас **нигде не импортируется**, то есть это мёртвый код. Либо подключить и починить, либо удалить. Решение обосновать в отчёте. +3. **Механическая проверка на весь UI-слой.** Это третий дефект класса «вызов несуществующего метода», и все они молчаливые: под `pythonw` трейсбек Tk уходит в никуда, кнопка выглядит нерабочей. Нужен тест, который статически обходит UI-слой и проверяет, что вызываемые методы существуют у своих классов. Ревьюер проверял разбором AST по образцу `Klass.get().method(...)` — этого хватило, чтобы найти оба дефекта; ваш вариант может быть шире. + +--- + ## P0-1. «Настроить» в маршрутизации не делает ничего `hermes_hub_app.py:632`: @@ -116,15 +132,17 @@ AutoAssigner.find_free_slot(self.selected_provider) or f"{self.selected_provider ## Критерии приёмки 1. Ни один файл чужой зоны не изменён. -2. «Настроить» открывает работающий редактор цепочки; изменение сохраняется и видно после перезапуска. -3. Ошибка любого действия видна пользователю в месте действия; модалка при ошибке остаётся открытой. -4. Шаг с кодом устройства содержит пронумерованную инструкцию и кнопки копирования для ссылки и кода. -5. При отсутствии свободного слота мастер объясняет причину и не подставляет выдуманный идентификатор. -6. Пустое состояние «Обзора» ведёт к подключению аккаунта. -7. Тесты на каждый пункт: редактор цепочки сохраняет порядок; ошибка действия отображается; мастер без свободных слотов не завершается молча. -8. Прогон **в обоих окружениях** — без UI-зависимостей и с `customtkinter`/`pillow`/`psutil`; обе команды и оба результата в отчёте. -9. `ruff check .` чисто; release gate не ухудшен. -10. **Скриншоты живого сценария**: подключение аккаунта, назначение роли, редактор цепочки — с реальными данными. +2. Правка `_finish` из `7090c8a` сохранена; `tests/test_ui_wizard_finish.py` проходит. +3. Есть тест, механически ловящий вызовы несуществующих методов в UI-слое; на нём проверено, что таких вызовов не осталось. +4. «Настроить» открывает работающий редактор цепочки; изменение сохраняется и видно после перезапуска. +5. Ошибка любого действия видна пользователю в месте действия; модалка при ошибке остаётся открытой. +6. Шаг с кодом устройства содержит пронумерованную инструкцию и кнопки копирования для ссылки и кода. +7. При отсутствии свободного слота мастер объясняет причину и не подставляет выдуманный идентификатор. +8. Пустое состояние «Обзора» ведёт к подключению аккаунта. +9. Тесты на каждый пункт: редактор цепочки сохраняет порядок; ошибка действия отображается; мастер без свободных слотов не завершается молча. +10. Прогон **в обоих окружениях** — без UI-зависимостей и с `customtkinter`/`pillow`/`psutil`; обе команды и оба результата в отчёте. +11. `ruff check .` чисто; release gate не ухудшен. +12. **Скриншоты живого сценария**: подключение аккаунта, назначение роли, редактор цепочки — с реальными данными. ## Порядок сдачи Передать точный `FINAL_COMMIT_SHA`.