# Задание A14 (Antigravity Flash, другой ПК): компактные аккаунты и чистка разделов

## Дата поступления
2026-08-23

## База
Проверочный HEAD на момент выдачи: **`9c0da36`**.

## Ветка
`antigravity/accounts-compact`

---

## Порядок работы с git

**Шаг 1. В начале — обновить локальную копию:**

```
cd <каталог репозитория>; git fetch origin --prune; git status
git checkout main; git pull --ff-only origin main
git checkout -b antigravity/accounts-compact
```

**Шаг 2. После первого коммита — отправить ветку:**

```
git commit -m "..."          <- сначала коммит
git push -u origin antigravity/accounts-compact
```

Именно в таком порядке. Push без коммита ничего не сохраняет: в прошлом раунде второй исполнитель отправил ветку, но забыл закоммитить, и его работа существовала только на диске.

**Шаг 3. В конце — push и проверка:**

```
git push origin antigravity/accounts-compact
git status                                              <- дерево должно быть чистым
git log --oneline -1 origin/antigravity/accounts-compact <- должен быть ваш финальный коммит
```

---

## Что принято по A12

Проверено исполнением:

- **тест достижимости службы моделей написан правильно** — импортирует согласованный путь напрямую и падает при `ImportError`, а не глотает его. Именно это и требовалось: защитный `except ImportError` в интерфейсе прячет несобранную интеграцию, и теперь есть тест, который её не пропустит;
- тесты подключения Claude и Grok;
- упорядочивание пяти провайдеров, тест `test_dashboard_renders_all_five_providers_in_order`;
- причины у `Н/Д` в `providers_view`;
- скрипт съёмки скриншотов `scripts/capture_live_a12_screenshots.py`.

Граница зоны не нарушена, слияние прошло без конфликтов.

**Два главных пункта задания не выполнены**, и это задание — про них.

---

## P0-1. Компактные карточки аккаунтов

`accounts_view.py` **не менялся вообще**. В `components.py` — только мелкие правки уже существовавших ячеек квоты (`height=5` → `height=4`). Переделки нет.

Жалобы владельца дословно: **«аккаунты должны выглядеть как у кокпит тулс, компактно»**, **«вид не тот, не надо делать раскрывающееся окно»**, **«в аккаунтах квота так и не отображается»**.

Требуется:

- плотный список **фиксированной высоты**: провайдер, идентичность, роль, состояние авторизации, квота — одной строкой, **без раскрытия**;
- **квота видна сразу**, числом и полосой, **с указанием пула и периода**. У Antigravity четыре пула, и «просто процент» вводит в заблуждение — надо `Claude/GPT — неделя`, а не `62%`;
- **шестнадцать аккаунтов читаются без прокрутки внутрь карточек**;
- **дельта-отрисовку по стабильным ключам не терять**: изменение одного аккаунта не перерисовывает остальные.

Данные настоящие и уже приходят. Замер на живых аккаунтах владельца:

```
ag-w2   Claude/GPT — неделя   осталось 37.4%   source=provider_api
ag-w3   Claude/GPT — неделя   осталось 90.1%   source=provider_api
ag-w1   Gemini — неделя       осталось 99.7%   source=provider_api
```

Где данных нет — `Н/Д` с причиной, а не ноль и не голый прочерк. У `opencode-go` и `grok` провайдер лимитов не отдаёт, причина уже лежит в `unavailable_reason`.

Про дельта-отрисовку: `COCKPIT_TOOLS_ARCHITECTURE_COMPARISON.md` в корне объясняет, почему это принципиально — при пересборке всех карточек на 50 аккаунтах выходит больше тысячи операций с виджетами в UI-потоке, и окно заметно подвисает. Документ — архитектурное сравнение, **не макет**: берите принцип обновления и плотность, не буквальную вёрстку.

**Тест:** изменение квоты одного аккаунта не пересоздаёт виджеты остальных.

## P0-2. Разобрать дублирующие разделы

`quotas_view.py` не тронут, `providers_view.py` — десять строк. Решение не принято.

Жалоба: **«провайдеры и квоты и лимиты вообще не понятно для чего нужны, там всё то же, что и в аккаунты»**.

Владелец прав: после появления квот прямо в карточках аккаунтов отдельный раздел квот потерял смысл. Нужно **решение**, а не сохранение обоих на всякий случай.

- **«Квоты и лимиты»** — убрать из навигации либо оставить только то, чего нет в «Аккаунтах»: сводка по провайдеру целиком, история расхода, ближайшие сбросы. Нет такого содержания — убрать раздел вместе с пунктом навигации.
- **«Провайдеры»** — оставить относящееся к провайдеру, а не к аккаунту: доступность runtime, обнаруженные модели, версия CLI, состояние авторизации в целом.

В отчёте перечислить, что перенесено, что удалено и почему. **Пустой раздел не оставлять**: либо содержание, либо нет пункта навигации.

## P0-3. Живая проверка со скриншотами

Скрипт съёмки написан, но **скриншотов нет**. Задание без них не принимается — это правило действует с раунда B5 и оно не формальное: пустые состояния доказывают вёрстку, но не работоспособность.

Нужны снимки **с настоящими данными**:

1. «Аккаунты» — шестнадцать аккаунтов, видимые квоты с указанием пулов;
2. подключение Grok от начала до конца: выбор провайдера, авторизация, назначение роли, завершение;
3. окно роли с цепочкой и квотами;
4. «Обзор» после чистки разделов.

По Grok: слоты уже есть, проверено — `find_free_slot("grok")` возвращает `grok-worker-1`, `find_free_slot("claude")` возвращает `claude-orch`. Мастер больше не должен упираться в «свободный слот не найден». Пройти **весь путь**, а не только выдачу слота: подключение, роль, появление в маршрутизации, тест профиля.

Жалоба владельца была **«при подключении грока ошибка»** — закрывается только пройденным вживую сценарием.

---

## Полезное к сведению

- **Релизный гейт стал зелёным**, 7/7. Не ухудшать.
- **Набор тестов нестабилен**: полный прогон даёт до семи ошибок, которые кочуют между файлами, хотя изолированно те же тесты проходят. Причина — шесть отдельных корней Tk в наборе. Это **чинит A13**, вам с этим ничего делать не нужно, но знайте: если увидите ошибки в `test_ui_*` при полном прогоне, сначала проверьте файл изолированно, прежде чем искать дефект у себя.
- Обнаружение моделей сейчас отдаёт пустой список, потому что `agy models` виснет сам по себе (проверено прямым вызовом, `rc=124` по таймауту 100 секунд). Это не дефект интерфейса. Карточка обязана честно показывать «Список моделей ещё не получен», а не пустой выпадающий список без объяснения.

## Ограничения

- Параллельно идёт **A13**. Ваши файлы: `src/antigravity_provider/router/ui/**`, `tests/test_ui_*.py` по существу, `scripts/capture_live_*`. Не ваши: `docs/**`, `tests/conftest.py`, backend вне `ui/`.
- Не выдумывать числа, идентификаторы и названия моделей.
- Три темы сохранить, дельта-отрисовку не терять.
- Мастер не ломать: шесть потоков подключения, трёхэлементная распаковка `start_profile_oauth`, `destroy()` в `_finish` выполняется всегда.
- Сеть и подпроцессы — не в UI-потоке.
- Тег `v0.1.1` не создавать.

## Критерии приёмки

1. Ветка в `origin`, финальный коммит виден через `git log origin/antigravity/accounts-compact`, `git status` чист.
2. Карточка аккаунта компактна, фиксированной высоты, без раскрытия; шестнадцать аккаунтов читаются без внутренней прокрутки.
3. Квота видна сразу, с указанием пула и периода; где данных нет — причина.
4. Дельта-отрисовка сохранена; проверено тестом.
5. Принято решение по «Провайдерам» и «Квотам»; перенесённое и удалённое перечислено; пустых разделов и висящих пунктов навигации нет.
6. **Скриншоты всех четырёх сценариев с настоящими данными приложены.**
7. Grok подключается вживую: подключение, роль, маршрутизация, тест профиля.
8. Прогон в обоих окружениях; обе команды и оба результата в отчёте.
9. `ruff check .` чисто; релизный гейт остаётся 7/7.
10. Отчёт: `START_HEAD`, `FINAL_HEAD`, `origin/main`, `git status`, точный `X passed / Y skipped / Z failed`.

## Главное

Это последний крупный визуальный долг. Квоты настоящие, роли настраиваются, Grok разблокирован, гейт зелёный. Осталось, чтобы шестнадцать аккаунтов читались с одного взгляда и в интерфейсе не было разделов, про которые владелец спрашивает «а это зачем».

## Порядок сдачи
Передать точный `FINAL_COMMIT_SHA`. **Сдано только после появления коммита в `origin`.**
