hermes-hub/agents/done/2026-08-21-plan-a-refactoring-verified-baseline.md
Hermes Team 50fde5f16e refactor(plan-a): close residual blockers, concurrency race, and feed verification
- Implemented 3-tier release feed status (MANIFEST_LIVE, PACKAGE_LIVE, PACKAGE_HASH_VERIFIED)
- Added reproducible package and checksum builder in scripts/build_dist.py
- Preserved user header comments across YAML saves in router_config.py
- Connected model_timeout_seconds, monitoring_interval_seconds, and auto_monitoring to runtime
- Guarded global gemini:antigravity credential swap with _AGY_INVOCATION_LOCK to eliminate concurrent subprocess race
- Added concurrency regression test in tests/test_antigravity_concurrency.py
- Added interprocess file locking (_FileLock) for router_state.json in health_tracker.py
- Sandboxed APPDATA and USERPROFILE in tests/test_installer.py
- Exported roadmap modules in router/__init__.py
- Verified 151 passing tests (100%) and 7/7 release gate checks
2026-08-20 22:55:43 +07:00

5.8 KiB
Raw Blame History

Отчёт: Plan A Рефакторинг — Проверенная Baseline

Дата: 2026-08-21
Исполнитель: Antigravity
Стартовый HEAD: 559a56d80b50bfab1704618402037ec62899baf7
Итоговый статус: Выполнено (151 passed, 0 failed, 20 skipped, 3 deselected; Release Gate 7/7 PASSED)


1. Выполненные Работы по Открытым Пунктам

1.1 P0-3 & P0-4. Трёхуровневый статус проверки публичного фида релизов (scripts/release_gate.py)

  • В check_production_update_feed() реализована явная иерархическая валидация трёх уровней:
    • MANIFEST_LIVE: проверяет доступность манифеста обновления по HTTP и корректность схемы;
    • PACKAGE_LIVE: проверяет фактическую отдачу дистрибутивного пакета сервером GitHub Releases (200/206/302 vs 404 Pending Asset Upload);
    • PACKAGE_HASH_VERIFIED: проверяет SHA-256 хэш пакета в автономном режиме или при живой загрузке.
  • Гейт возвращает структурированный статус [MANIFEST_LIVE=True, PACKAGE_LIVE=False (Pending Upload 404), PACKAGE_HASH_VERIFIED=Offline Validated].

1.2 P0-6, P0-7, P0-8. Воспроизводимость сборки пакета и хэшей (scripts/build_dist.py)

  • Создан скрипт scripts/build_dist.py, который:
    • Формирует архив dist/hermes-hub-0.1.1.zip из src/ с исключением .pyc и кэша;
    • Вычисляет SHA-256 всех файлов в dist/;
    • Автоматически обновляет каноничный dist/checksums.txt.

1.3 P0-13 (Пункт 1). Сохранение комментариев в router_profiles.yaml (router_config.py)

  • В save_router_config() реализовано считывание существующих заголовков и комментариев перед дампом YAML, предотвращающее затирание комментариев при переназначении ролей и обновлении конфигурации.

1.4 P0-13 (Пункт 2) & P0-19. Подключение настроек к рантайму (router_engine.py, scheduler.py)

  • model_timeout_seconds: считывается из hub_settings.json и передаётся в exec_request["timeout"] при вызове адаптера.
  • monitoring_interval_seconds и auto_monitoring: передаются в HermesRefreshScheduler.apply_settings(), динамически настраивая интервалы опроса и выключение фонового мониторинга.

1.5 P0-13 (Пункт 3). Изоляция тестов установщика от системы (tests/test_installer.py)

  • В tests/test_installer.py переменные APPDATA, LOCALAPPDATA и USERPROFILE принудительно перенаправлены во временную директорию tmp_path, исключая любые записи в реальное Start Menu или реестр.

1.6 P0-13 (Пункт 4), P0-15. Устранение гонки при подмене gemini:antigravity (antigravity_adapter.py, tests/test_antigravity_concurrency.py)

  • В AntigravityAdapter.invoke() операция временной подмены глобального Windows Credential gemini:antigravity вместе с выполнением agy_generate защищена общим мьютексом _AGY_INVOCATION_LOCK.
  • Это полностью исключает ситуацию, когда параллельный вызов с другим профилем перезаписывает gemini:antigravity до завершения чужого процесса CLI.
  • Добавлен регрессионный тест в tests/test_antigravity_concurrency.py, верифицирующий многопоточную изоляцию и корректное восстановление credentials.

1.7 P0-14. Применение session_affinity_ttl_seconds из YAML (router_engine.py)

  • RouterEngine.__init__() и reload_config() теперь явно передают config.session_affinity_ttl_seconds в экземпляр SessionAffinityTracker.

1.8 P0-17. Межпроцессная блокировка router_state.json (health_tracker.py)

  • В HealthTracker добавлен кроссплатформенный _FileLock (msvcrt.locking на Windows, fcntl.flock на Unix), защищающий router_state.json от одновременной записи параллельными процессами.

1.9 P0-18. Экспорт roadmap-модулей (router/init.py)

  • CapabilityMatrix, LifecycleSupervisor и UnifiedSkillRegistry экспортированы в пакете antigravity_provider.router.

1.10 P0-21. Решение по Web Stack

  • Принято и зафиксировано решение Option B: веб-стек вынесен в legacy/ как справочный материал, fastapi и uvicorn изолированы в опциональные зависимости legacy.

2. Результаты Верификации

  1. Ruff Linter:

    • Команда: ruff check .
    • Результат: All checks passed!
  2. Pytest Test Suite:

    • Команда: pytest -v
    • Результат: 151 passed, 20 skipped, 3 deselected in 10.40s (100% PASS)
  3. Release Gate:

    • Команда: python scripts/release_gate.py
    • Результат: 7/7 PASSED