# Задание B4 (Codex): вернуть пропавшие действия и привести экраны к макетам ## Дата поступления 2026-08-21 ## База Проверочный HEAD: **`9d93a17`**, `origin/main` = `9d93a17`. `git fetch`, зафиксировать `BASE_SHA`, работать от свежего `main`. ## Ветка `codex/restore-actions` --- ## P0. Регрессия: с экрана «Аккаунты» пропали действия Пользователь установил сборку и сообщил, что часть функций перестала работать. Причина найдена и подтверждена историей файла `ui/views/accounts_view.py`: ``` 39b1f92 действий = 4 a7027b4 действий = 4 ← до редизайна d0d15ae действий = 1 ← «feat(ui): complete redesign phases 2 through 6» 9d93a17 действий = 1 ← сейчас ``` В фазах 2–6 карточка аккаунта лишилась управляющих элементов. Сейчас на ней только «Обновить» и «Удалить». Пропали: | Действие | Обработчик в приложении | Триггер в UI | |---|---|---| | `test` — «⚡ Тест» | есть | только в меню экрана «Команда» | | `set_main` — «★ Сделать основным» | есть | только в меню «Команда» | | `set_orchestrator` — «👑 Назначить оркестратором» | есть | только в меню «Команда» | | `assign_role` — «Назначить роль» | есть, вместе с модалкой `_open_assign_role_modal` | **нет нигде** | То есть backend-обработчики и модальное окно назначения роли живы, но добраться до них из интерфейса нельзя. `assign_role` недостижим полностью. **Требуется** вернуть все четыре действия на экран «Аккаунты» — в карточку и/или её меню `⋮`, как было до редизайна. Проверить заодно остальные экраны на такую же потерю: сверить список действий, которые шлёт UI, со списком, который обрабатывает `hermes_hub_app._handle_action`. Расхождений быть не должно ни в одну сторону. **Тест обязателен:** проверка, что для каждого обработчика в `_handle_action` существует хотя бы один вызывающий элемент в UI. Это ровно тот класс дефекта, который уже возникал с `assign_role` в раунде 2 и вернулся снова. --- ## P1. Соответствие макетам Владелец сравнил установленную сборку с утверждёнными макетами и оценил расхождение как значительное. Разберём честно, что из этого выполнимо. ### Что нужно и можно сделать 1. **Плотность и структура.** На макетах — многоколоночные рабочие области с чёткой сеткой: слева список, в центре схема, справа панель деталей. Сейчас экраны заметно разрежённее. Привести к более плотной компоновке с постоянной правой панелью деталей выбранного объекта. 2. **Панель деталей.** На всех четырёх макетах выбранный объект раскрывается в правой панели: аккаунт, маршрут, агент. Сейчас детали живут в модальных окнах. Перевести на постоянную боковую панель — это ближе к макету и удобнее в работе. 3. **Схема маршрутизации.** На макетах — визуальная схема «оркестратор → провайдеры → агенты» со связями. Сейчас цепочка отображается списком. Схему в упрощённом виде (узлы + линии на `CTkCanvas`) сделать реально. 4. **Строка состояния и хлебные крошки** сверху, как на первом макете. ### Что сделать нельзя — и почему Макеты содержат данные, которых **не существует**: ``` 842 rps · 98 ms P95 · 99.98% успешные · 1.23% ошибки 1.2M / 3.0M токенов · история использования в USD за 7 дней CPU 28% · Память 61% · Диск 39% · Сеть 42 Мбит/с $120.00 лимит · $45.32 использовано · 99.98% доступность ``` По контракту (`docs/UI_STATE_CONTRACT.md`, раздел 7, Gap 12) backend **не измеряет** латентность, RPS, проценты ошибок, стоимость и SLA. Тепловые карты квот по времени, графики истории в долларах, метрики CPU/памяти/диска — источников не имеют. **Эти блоки рисовать запрещено.** Либо «Н/Д», либо блок отсутствует. Требование не изменилось и не обсуждается: продукт создан, чтобы показывать правду о квотах, и первый же аудит выявил именно фабрикацию таких чисел. Если владелец хочет видеть эти показатели по-настоящему — это отдельная работа в backend (учёт токенов, замер латентности, стоимость), и она ставится отдельным заданием Antigravity, а не дорисовывается в интерфейсе. ### Как поступить с макетом Взять из макетов **композицию, плотность, типографику и визуальный язык**. Не переносить **содержимое** карточек с числами, которых нет. Там, где на макете «842 rps», должно быть либо пусто, либо честное «Н/Д», либо блок, заменённый на то, что данные реально есть: состояние авторизации, семейства моделей, позиция в цепочке отказоустойчивости. --- ## Ограничения - Граница прежняя: ваша зона — `src/antigravity_provider/router/ui/**`, `hermes_hub_app.py`, `tests/test_ui_*.py`. - Сеть и подпроцессы — не в UI-потоке. - Секреты маскировать. - Тег `v0.1.1` не создавать. ## Критерии приёмки 1. Все четыре действия (`test`, `set_main`, `set_orchestrator`, `assign_role`) доступны с экрана «Аккаунты». 2. Для каждого обработчика `_handle_action` есть вызывающий элемент в UI; закреплено тестом. 3. Приложение запускается, все девять экранов открываются без ошибок. 4. Ни одного выдуманного числа: RPS, латентность, стоимость, CPU/память/диск/сеть отсутствуют либо «Н/Д». 5. Прогон **в обоих окружениях** — без UI-зависимостей и с `customtkinter`/`pillow`/`psutil`; обе команды и оба результата в отчёте. 6. `ruff check .` чисто; release gate не ухудшен. 7. В отчёте — скриншоты основных экранов и раздел «расхождения с макетом с указанием причины». ## Порядок сдачи Передать точный `FINAL_COMMIT_SHA`.