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`.