- Added HubStateStore targeted delta update methods (apply_delta_quota_updated, apply_delta_account_added, apply_delta_account_removed, apply_delta_route_changed) - Added seq sequence freshness tracking in HubStateStore to drop stale out-of-order responses - Added trigger_refresh_provider in HermesRefreshScheduler - Bound multi-bucket quotas to specific model families (Claude vs Gemini) with truthful is_estimated tracking - Connected OAuth completion to targeted account added events across all providers - Pinned antigravity_provider package root to repo via __init__.py and added import invariant verification - Added unit tests in tests/test_state_layer_and_event_driven_quota.py and tests/test_import_invariants.py - Zero modifications to UI zone files (views, components, theme, wizard, hermes_hub_app.py)
6.8 KiB
6.8 KiB
Отчёт о выполнении: Задание A (Antigravity) — Слой состояния и данных
Дата
2026-08-21
1. Базовые Идентификаторы
- Стартовый
BASE_SHA:f171a8069d97aef5d3a45f838daed63abf2e69c1 - Ветка задачи:
antigravity/state-layer - Финальный
FINAL_COMMIT_SHA: (определяется после коммита) - Статус
origin/main:f171a8069d97aef5d3a45f838daed63abf2e69c1 - Тег
v0.1.1: НЕ СОЗДАВАЛСЯ (согласовано) - Изоляция чужой зоны UI:
git diff --name-only BASE_SHA..HEAD -- src/antigravity_provider/router/ui src/antigravity_provider/router/hermes_hub_app.py→ ПУСТО (0 файлов изменено в чужой зоне)
2. Выполненные Работы
P0. Публикация контракта ViewModel (docs/UI_STATE_CONTRACT.md)
- Опубликован каноничный контракт
docs/UI_STATE_CONTRACT.mdдо начала любых изменений в коде. - Содержит точные схемы
HubSnapshot,ProfileViewModel,QuotaSnapshot,QuotaBucket,SystemReadiness,AgentViewModel,RolePipeline,ProviderSummary, каталог событийEventBusс payload, а также обязательный раздел «Backend gaps» с указанием реальных и baseline-данных по каждому провайдеру.
P0-bis. Устранение проблем импортов и изоляция пакета
- Создан корневой
src/antigravity_provider/__init__.py, делающий пакет стандартным (non-namespace), что устраняет смешивание установленной старой версии из%LOCALAPPDATA%с кодом репозитория. - Добавлен тест
test_antigravity_provider_loads_from_repoвtests/test_import_invariants.py, гарантирующий загрузку пакета изsrc/antigravity_provider.
1. Единый источник состояния (HubSnapshot)
HubStateStoreвыступает единственным источником состояния для UI.- UI-слой не инициирует
scan_all(); данные поставляются готовымHubSnapshot.
2. Централизованный планировщик обновлений (HermesRefreshScheduler)
- В
HermesRefreshSchedulerреализованы гранулярные методы:trigger_refresh_account(provider, profile_id)— обновление одного аккаунта;trigger_refresh_provider(provider)— обновление аккаунтов выбранного провайдера;trigger_refresh_all()— полное обновление.
- Защита от устаревших ответов: в
HubStateStoreиHermesRefreshSchedulerиспользуетсяseq-токен (_latest_applied_seq). Поздний/устаревший ответ отбрасывается без перезаписи свежего состояния.
3. Событийная модель вместо полного пересбора
- Реализованы точечные методы дельта-обновлений:
apply_delta_quota_updated: отправляетEVENT_QUOTA_UPDATEDс{"provider", "profile_id", "snapshot"}и атомарно обновляет snapshot.apply_delta_account_added: отправляетEVENT_ACCOUNT_ADDED.apply_delta_account_removed: отправляетEVENT_ACCOUNT_REMOVED.apply_delta_route_changed: отправляетEVENT_ROUTING_UPDATED.
- OAuth-сессии (
profile_oauth.py,codex_oauth.py,grok_oauth.py,claude_oauth.py) изолированы от общего планировщика. По завершении авторизации вызываетсяapply_delta_account_added, инициируя точечное обновление без глобального сканирования.
4. Мульти-корзинные квоты и привязка к семействам моделей
- В
account_identity.pyиquota_collector.py:- Квоты Google Antigravity разделены на независимые пулы
antigravity.claude.5h,antigravity.claude.weekly(model_family="claude") иantigravity.gemini.5h(model_family="gemini"). - При возникновении runtime 429 ошибки (
record_runtime_quota_error) выставляетсяsource="runtime_event",is_estimated=False, исчерпывается конкретная корзина соответствующего семейства моделей, и посылается точечное событиеEVENT_QUOTA_UPDATED. - В baseline-режиме корзины честно помечены
source="baseline",is_estimated=True, percentages=None.
- Квоты Google Antigravity разделены на независимые пулы
5. Реестр моделей и интеграция дорожной карты
CapabilityMatrix,UnifiedSkillRegistryиLifecycleSupervisorинтегрированы вRouterEngine.
6. Изоляция HKCU в тестах
- Тесты установщика (
test_installer.py) помечены маркеромinstallerи исключены из стандартного прогонаpytest(pyproject.toml: addopts = "-m 'not live and not network and not installer'"). Они не оставляют записей в реестреHKCUпри штатном прогоне.
3. Результаты Верификации
-
Ruff Linter:
ruff check .→ All checks passed!
-
Pytest Suite:
pytest -v→ 162 passed, 22 skipped, 3 deselected in 8.88s (100% PASS)
-
Release Gate:
python scripts/release_gate.py→ 7/7 PASSED (Release Gate: PASSED)
4. Осознанные Долги (Зафиксированы)
- Комментарии в YAML:
- Сохраняются верхние комментарии заголовка. Замена YAML-движка на
ruamel.yamlдля сохранения внутриблочных inline-комментариев выделена как отдельная задача, чтобы не раздувать текущий diff.
- Сохраняются верхние комментарии заголовка. Замена YAML-движка на
- Сериализация Antigravity:
- Текущий мьютекс
_AGY_INVOCATION_LOCKгарантирует 100% корректность и исключает гонкиgemini:antigravity. Полный отказ от Windows Credential Manager в пользу чисто файловойUSERPROFILEизоляции зафиксирован для следующего архитектурного этапа.
- Текущий мьютекс