hermes-hub/agents/inbox/2026-08-23-A14-antigravity-flash-accounts.md
Hermes Team a18de5d468 docs(tasks): A13 и A14 — оставшийся долг
A13 (Pro): раздел контракта о границе между учётными системами Hub и
Hermes — единственный незакрытый пункт A11; варианты связывания профилей
с ценой каждого; устранение нестабильности набора тестов (шесть корней
Tk дают до семи плавающих ошибок на прогон, мешая отличать настоящую
поломку от шума).

A14 (Flash): два невыполненных пункта A12 — компактные карточки
аккаунтов (accounts_view.py не менялся вообще) и разбор дублирующих
разделов «Провайдеры»/«Квоты» (quotas_view.py не тронут), плюс живые
скриншоты, которых не было.

Принято по A11: пропуск вызова без роли работает — замер 0.10 с без
попыток цепочки; зонд переведён на agy models; выдуманный список
gemini-2.5-* убран; refresh_codex_token появился; source квоты не
опережает данные. Релизный гейт стал зелёным, 7/7.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 15:52:07 +07:00

149 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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