diff --git a/agents/inbox/2026-08-21-A-antigravity-state-layer.md b/agents/inbox/2026-08-21-A-antigravity-state-layer.md index 7029b61..bc46a54 100644 --- a/agents/inbox/2026-08-21-A-antigravity-state-layer.md +++ b/agents/inbox/2026-08-21-A-antigravity-state-layer.md @@ -112,6 +112,39 @@ tests/test_ui_*.py --- +--- + +## P0-bis. Найдено при прогоне с установленными UI-зависимостями + +Обнаружено 2026-08-21 при проверке PHASE 1 Codex. Эти дефекты **не видны в обычном прогоне**: без `customtkinter` соответствующие тесты пропускаются, поэтому suite зелёный, а код не исполняется. + +### 1. Подмена `sys.path` заставляет тесты грузить УСТАНОВЛЕННУЮ копию плагина + +`hermes_hub_app.py:41` при импорте делает `sys.path.insert(0, ...)` для `%LOCALAPPDATA%\hermes\pluginsntigravity-provider\src`. Как только любой тест импортирует этот модуль, путь установленной копии оказывается **впереди** репозитория, и последующие импорты `antigravity_provider.*` резолвятся в развёрнутую — то есть более старую — версию. + +Проявление: `tests/test_p0_release_gate.py::test_p0_5_b1_non_router_error_fallback` и `::test_n2_error_formatter_deduplication` падают с `ImportError: format_antigravity_error` **только в полном прогоне**, а по отдельности проходят. Проверено: функция есть в `src/antigravity_provider/runtime.py` и отсутствует в установленной копии. + +Последствия шире тестов: в проде приложение может исполнять развёрнутый плагин вместо ожидаемого кода, а после обновления — смесь версий. Пакет `antigravity_provider` — namespace-типа (нет `__init__.py`), поэтому его `__path__` спокойно объединяет оба каталога. + +**Нужно:** определить единственный источник импорта. Либо приложение не трогает `sys.path` и полагается на установленный пакет, либо repo-режим явно вытесняет установленный. Смешанное состояние недопустимо. Добавить тест, фиксирующий, из какого каталога загружен `antigravity_provider`. + +### 2. `test_oauth_lifecycle.py` — два теста падают при реальном исполнении + +``` +FAILED test_e_repeated_open_browser_invariance +FAILED test_f_copy_before_open_browser + assert wizard.oauth_url is not None +E assert None is not None +``` + +Падают и по отдельности, и в полном прогоне — от порядка не зависят. То есть заявленная в `249a888` «immediate URL readiness» этими тестами не подтверждена. Разобраться: дефект в продукте или в тесте (например, мок `start_profile_oauth` не покрывает путь `_init_antigravity_oauth`). Пока не выяснено — считать функцию непроверенной. + +### 3. Заглушка в `conftest.py` слишком широкая + +`pytest_collection_modifyitems` пропускает тест, если в его имени встречается `ui`, `view` или `wizard`. Под это попадают и статические проверки, которым GUI не нужен, — из-за чего оба дефекта выше жили незамеченными. Заменить на явную маркировку (`@pytest.mark.gui`) либо на проверку реального импорта GUI-модулей. + +**Критерий приёмки:** полный `pytest` зелёный **и** в окружении без UI-зависимостей, **и** в окружении с установленными `customtkinter`/`pillow`/`psutil`. Сейчас второй вариант даёт 4 падения. + ## Критерии приёмки 1. `docs/UI_STATE_CONTRACT.md` опубликован до остальных изменений, содержит раздел «Backend gaps» и для каждого поля — признак реальности данных.