A2 closed the gaps that blocked the UI, but three declared gaps (4, 5, 12) vanished from the contract without being closed. Gap 12 was the instruction telling the UI to render N/A for latency, RPS and cost — it disappeared exactly as Codex starts the dashboard. The release asset still returns 404. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
8 KiB
Задание A3 (Antigravity): релиз, честность контракта, оставшиеся долги
Дата поступления
2026-08-21
База
Проверочный HEAD: 2035c14, origin/main = 2035c14. Перед началом git fetch, зафиксировать фактический BASE_SHA.
Ветка
antigravity/release-readiness. Ветки state-layer и contract-gaps влиты в main, их и связанные worktree можно удалить.
Что принято по A2
Проверено исполнением:
- граница соблюдена — в зоне Codex ни одного изменения;
- точечные события действительно появились: все 11 объявленных констант имеют публикаторов (
ACCOUNT_ADDED/UPDATED/REMOVED/AUTH_CHANGED,QUOTA_UPDATED,ROUTING_UPDATED,AGENT_UPDATED,SYSTEM_READINESS_CHANGED, триREFRESH_*), три невостребованные константы удалены. Это закрывает главный блокер интерфейса; - происхождение тарифа доведено до
ProfileViewModel(plan_code,plan_source) —PlanBadgeтеперь можно показывать осмысленно; AgentViewModelполучилsession_id,active_quota_status,active_quota_label;PipelineNode—account_identity,quota_status,failover_reason. Экраны «Команда» и «Маршрутизация» разблокированы;seqвыставлен наружу, поздний ответ отбрасывается, есть два теста с проверкой;- решение по квотам сильнее, чем требовалось: вместо имитации сбора baseline теперь
None(данных нет), а реальные значения берутся из фактических 429 черезrecord_runtime_quota_error, вызываемый изrouter_engine.py:283, с источникомruntime_eventиis_estimated=False. Честно и работоспособно без провайдерских API.
Прогон: headless 167 passed, с UI-зависимостями 204 passed, ruff чисто, release gate PASSED.
P0-1. Вернуть в контракт то, что было из него убрано
Раздел «Backend gaps» заменён на «Closed Gaps & Audit Status (v1.1)», где перечислены закрытые пробелы 1, 2, 3, 6, 7, 8, 9, 10, 11. Пробелы 4, 5 и 12 исчезли из документа, не будучи закрытыми.
- Gap 12 — «латентность, RPS, проценты ошибок, стоимость и SLA отсутствуют; UI обязан показывать
Н/Дили скрывать блок». Это была прямая инструкция интерфейсу, и она пропала ровно в тот момент, когда Codex начинает строить Dashboard. Без неё он вправе решить, что метрики существуют. - Gap 4 — поверхностная неизменяемость снапшота.
- Gap 5 — политика
is_stale. Похоже, фактически закрыт: в разделе 1 появилось «True… when background refresh is overdue (> 300s)». Если так — так и записать со ссылкой на коммит.
Документ, из которого молча исчезают незакрытые ограничения, перестаёт быть контрактом. Нужен раздел, где и закрытые, и оставшиеся пробелы видны одновременно. Правило прежнее: пробел уходит из списка только вместе с коммитом, который его закрыл.
P0-2. Релизный артефакт
package_url из живого манифеста по-прежнему отдаёт HTTP 404 — проверено на 2035c14. Это единственный пункт A2, который не сдвинулся вообще.
Порядок: build → checksum → upload artifact → verify → publish manifest → verify feed. Манифест не должен рекламировать несуществующий артефакт. dist/checksums.txt — только из scripts/build_dist.py. В GitHub Release должны лежать hermes-hub-0.1.1.zip и HermesHubSetup.exe.
Тег v0.1.1 не создавать — ставится отдельным решением после ручной проверки продукта.
P1-3. Оставшиеся долги
- Комментарии
router_profiles.yaml— 5 строк → 2 при сохранении. Либо round-trip YAML, либо явная фиксация, что файл перезаписывается приложением. HKCUв тестах установщика —Registry.CurrentUserиспользуется дважды, переменными окружения реестр не перенаправляется. Вынести реальный запуск в integration-режим либо параметризовать ключ.- Сериализация Antigravity —
_AGY_INVOCATION_LOCKдержит вызовы профилей со своим auth по одному. Либо изоляция только черезUSERPROFILEбез глобальной записиgemini:antigravity, либо осознанный долг с обоснованием. fastapi/uvicornостаются обязательными зависимостями, хотяgui_serverживёт вlegacy/и не поставляется.
P2-4. Подготовка к ручной проверке
Продукт ни разу не прогонялся человеком целиком. Подготовить то, что для этого нужно со стороны backend:
- диагностическая команда, печатающая по каждому профилю: провайдер, идентичность, состояние авторизации, состояние квоты и источник данных;
- в журнал событий писать факт переключения маршрута с причиной, чтобы failover было видно без отладчика.
Не изобретать полноценный CLI — достаточно одной команды и корректных записей в журнале.
Критерии приёмки
- Ни один файл зоны Codex не изменён.
- В контракте одновременно видны закрытые и оставшиеся пробелы; 4, 5 и 12 присутствуют с актуальным статусом.
curl -I <package_url>→ HTTP 200, sha256 совпадает с загруженным артефактом; в Release лежат оба файла.dist/checksums.txtгенерируется скриптом, ручных правок нет.- Прогон в обоих окружениях — без UI-зависимостей и с
customtkinter/pillow/psutil; обе команды и оба результата в отчёте. ruff check .чисто; release gate PASSED на финальном коммите, без функциональных коммитов после него.- Отчёт:
START_HEAD,FINAL_HEAD,origin/main,git status, точныйX passed / Y skipped / Z failed, список оставшегося.
Порядок сдачи
Ревьюеру передать точный FINAL_COMMIT_SHA и не вести разработку поверх него до вердикта.