5.2 KiB
5.2 KiB
Отчёт: Задание A2 — закрытие пробелов контракта и релизная инфраструктура
Дата: 2026-08-21
Идентификаторы и границы
- Base SHA:
e8a404be035fa04b5f76e3e572c6539fba0e83e4(актуальныйorigin/mainна старте). - Ветка:
antigravity/contract-gaps. - Контракт:
docs/UI_STATE_CONTRACT.mdобновлён до версии 1.1 первым шагом. - Тег
v0.1.1НЕ создавался. - Файлы UI (
src/antigravity_provider/router/ui/**,hermes_hub_app.py,tests/test_ui_*.py) НЕ изменялись (git diff --name-onlyпо этим путям полностью пуст).
Реализовано и закрыто
1. Канонические публикаторы событий (Gap 9, P0-1)
- Для каждого объявленного события реализован канонический метод/вызов в
HubStateStore:EVENT_ACCOUNT_UPDATED:apply_delta_account_updatedпубликует payload{profile_id, profile, generation, seq}.EVENT_ACCOUNT_ADDED:apply_delta_account_addedпубликует payload{provider, profile_id, profile, generation, seq}.EVENT_ACCOUNT_REMOVED:apply_delta_account_removedпубликует payload{provider, profile_id, generation, seq}.EVENT_ACCOUNT_AUTH_CHANGED:publish_auth_changedпубликует payload{provider, profile_id, auth_state, profile, generation, seq}.EVENT_QUOTA_UPDATED:apply_delta_quota_updatedпубликует payload{provider, profile_id, snapshot, quota_snapshot, generation, seq}.EVENT_ROUTING_UPDATED:apply_delta_route_changedпубликует payload{role_id, active_profile_id, pipeline, failover_reason, generation, seq}.EVENT_AGENT_UPDATED:apply_delta_route_changed/apply_delta_agent_updatedпубликует payload{role_id, agent, generation, seq}.EVENT_SYSTEM_READINESS_CHANGED:refreshпубликует payloadreadiness.EVENT_REFRESH_STARTED/EVENT_REFRESH_COMPLETED/EVENT_REFRESH_FAILED: планировщик и state store публикуют с монотоннымиseqиgeneration.
- Неиспользуемые мёртвые константы (
EVENT_QUOTA_STALE,EVENT_PROVIDER_HEALTH_CHANGED,EVENT_ROUTING_SLOT_UPDATED) удалены изevent_bus.py.
2. Происхождение тарифа в ProfileViewModel (Gap 6, P0-2)
- В
ProfileViewModelдобавлено полеplan_source: str = "unknown"("provider_api","jwt_claim","provider_auth","inferred","unknown"). UnifiedHealthServiceзаполняетplan_sourceизident.plan.source. UI может достоверно отображатьPlanBadge, проверяяplan_source != "unknown".
3. Расширение AgentViewModel и PipelineNode (Gaps 7, 8, P0-3)
AgentViewModel:session_id: Optional[str] = Noneactive_quota_status: str = "healthy"("healthy","warning","exhausted")active_quota_label: str = ""(например"Осталось 85%"или"Исчерпана (429)")
PipelineNode:account_identity: str = ""quota_status: str = "healthy"failover_reason: Optional[str] = None(содержит реальную причину переключения:"Исчерпана квота (429)","Требуется авторизация"и т.д., либоNoneдля активного узла / резерва).
4. Измерение и изоляция квот (Gaps 1, 2, P1-4)
- Структурное разделение model-family buckets (
claude,gemini,gpt,grok,opencode) с честными неизвестными значениями (None,is_estimated=True). - Runtime 429 парсит ответ провайдера, сбрасывает квоту до 0% и выставляет
source="runtime_event",is_estimated=False.
5. Свежесть данных и защита от устаревших ответов (Gaps 3, 10, 11, P1-5)
HubSnapshotсодержит публичное полеseq: int.- Планировщик завершает сбор квот до перестроения снимка.
HubStateStore.refreshпроверяетrequest_seq < self._latest_applied_seqи гарантированно отбрасывает устаревшие ответы без повреждения монотонности снимков.- Доказано юнит- и интеграционными тестами с асинхронными задержками.
6. Релизная инфраструктура (P1-6)
- Пакет дистрибутива собран детерминированно:
dist/hermes-hub-0.1.1.zip. - Хеши обновлены в
dist/checksums.txt. - Тег
v0.1.1НЕ создавался.
Проверки
- Pytest (headless):
167 passed, 22 skipped, 3 deselected in 15.87s. - Ruff linter:
All checks passed!. - Release Gate:
7/7 PASSED. - UI Zone Isolation:
0 files modified in UI area.