diff --git a/agents/inbox/2026-08-21-B4-codex-restore-account-actions.md b/agents/inbox/2026-08-21-B4-codex-restore-account-actions.md new file mode 100644 index 0000000..9ffd923 --- /dev/null +++ b/agents/inbox/2026-08-21-B4-codex-restore-account-actions.md @@ -0,0 +1,97 @@ +# Задание 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`.