docs(task): B7 — зафиксировать исправленный дефект мастера и потребовать проверку на несуществующие методы

Добавлен раздел P0-0: правка _finish уже в main (7090c8a), её нельзя
потерять при слиянии. Там же второй дефект того же класса —
splash.py вызывает несуществующий AssetManager.get_splash_logo.

Дефект «вызов несуществующего метода» встречается третий раз и под
pythonw всегда молчаливый, поэтому в критерии приёмки добавлено
требование механической проверки UI-слоя.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Hermes Team 2026-08-22 21:45:05 +07:00
parent 7090c8ae6f
commit 559289d839

View file

@ -49,6 +49,22 @@ git checkout main; git reset --hard origin/main
Каждое проверено по коду. Ниже — что относится к вам; пункты 1 (частично) и 2 уходят в backend отдельным заданием A8. Каждое проверено по коду. Ниже — что относится к вам; пункты 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. «Настроить» в маршрутизации не делает ничего ## P0-1. «Настроить» в маршрутизации не делает ничего
`hermes_hub_app.py:632`: `hermes_hub_app.py:632`:
@ -116,15 +132,17 @@ AutoAssigner.find_free_slot(self.selected_provider) or f"{self.selected_provider
## Критерии приёмки ## Критерии приёмки
1. Ни один файл чужой зоны не изменён. 1. Ни один файл чужой зоны не изменён.
2. «Настроить» открывает работающий редактор цепочки; изменение сохраняется и видно после перезапуска. 2. Правка `_finish` из `7090c8a` сохранена; `tests/test_ui_wizard_finish.py` проходит.
3. Ошибка любого действия видна пользователю в месте действия; модалка при ошибке остаётся открытой. 3. Есть тест, механически ловящий вызовы несуществующих методов в UI-слое; на нём проверено, что таких вызовов не осталось.
4. Шаг с кодом устройства содержит пронумерованную инструкцию и кнопки копирования для ссылки и кода. 4. «Настроить» открывает работающий редактор цепочки; изменение сохраняется и видно после перезапуска.
5. При отсутствии свободного слота мастер объясняет причину и не подставляет выдуманный идентификатор. 5. Ошибка любого действия видна пользователю в месте действия; модалка при ошибке остаётся открытой.
6. Пустое состояние «Обзора» ведёт к подключению аккаунта. 6. Шаг с кодом устройства содержит пронумерованную инструкцию и кнопки копирования для ссылки и кода.
7. Тесты на каждый пункт: редактор цепочки сохраняет порядок; ошибка действия отображается; мастер без свободных слотов не завершается молча. 7. При отсутствии свободного слота мастер объясняет причину и не подставляет выдуманный идентификатор.
8. Прогон **в обоих окружениях** — без UI-зависимостей и с `customtkinter`/`pillow`/`psutil`; обе команды и оба результата в отчёте. 8. Пустое состояние «Обзора» ведёт к подключению аккаунта.
9. `ruff check .` чисто; release gate не ухудшен. 9. Тесты на каждый пункт: редактор цепочки сохраняет порядок; ошибка действия отображается; мастер без свободных слотов не завершается молча.
10. **Скриншоты живого сценария**: подключение аккаунта, назначение роли, редактор цепочки — с реальными данными. 10. Прогон **в обоих окружениях** — без UI-зависимостей и с `customtkinter`/`pillow`/`psutil`; обе команды и оба результата в отчёте.
11. `ruff check .` чисто; release gate не ухудшен.
12. **Скриншоты живого сценария**: подключение аккаунта, назначение роли, редактор цепочки — с реальными данными.
## Порядок сдачи ## Порядок сдачи
Передать точный `FINAL_COMMIT_SHA`. Передать точный `FINAL_COMMIT_SHA`.