# Задание 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`.
