work_item: ORCH-066 description: > Тест-план статусной модели Plane (слой B). Покрывает осмысленные статусы этапов, возврат аналитика через To Analyse, фазы self-deploy, post-deploy monitor, fail-closed деградацию и reconciler. Слой A (STAGE_TRANSITIONS) проверяется на неизменность. Все тесты — pytest; Plane API мокается (httpx), как в существующих tests/test_plane_*.py / tests/test_orch10_states.py. tests: # --- Группа A: вход и стадия анализа --- - id: TC-01 type: unit description: "To Analyse без существующего task -> handle_status_start -> start_pipeline (старт конвейера)." module: tests/test_status_trigger.py covers: [AC-1] expected: PASS - id: TC-02 type: integration description: "To Analyse при существующем task без active-job -> relaunch агента стадии (resume из Needs Input), новый task НЕ создаётся." module: tests/test_plane_to_analyse_resume.py covers: [AC-2, BR-11] expected: PASS - id: TC-03 type: unit description: "Старт/relaunch аналитика ставит Plane-статус Analysis (а не In Progress) при наличии статуса в проекте." module: tests/test_plane_status_model.py covers: [AC-3] expected: PASS - id: TC-04 type: unit description: "To Analyse при существующем task с active-job -> НЕ relaunch (busy-guard)." module: tests/test_plane_to_analyse_resume.py covers: [AC-4] expected: PASS # --- Группа B: Code-Review --- - id: TC-05 type: unit description: "Вход в стадию review -> Plane-статус Code-Review (маппинг _STAGE_TO_STATE_KEY / STAGE_VISIBILITY_STATE)." module: tests/test_plane_status_model.py covers: [AC-5] expected: PASS # --- Группа C: self-deploy фазы --- - id: TC-06 type: unit description: "_handle_self_deploy_phase_a ставит Awaiting Deploy (не In Review)." module: tests/test_deploy_approve.py covers: [AC-6, AC-13] expected: PASS - id: TC-07 type: unit description: "_handle_self_deploy_phase_b при успешном initiate_deploy ставит Deploying." module: tests/test_deploy_approve.py covers: [AC-7] expected: PASS - id: TC-08 type: integration description: "Phase C (finalizer SUCCESS) для self-hosting ставит Monitoring after Deploy, НЕ Done; армит post-deploy monitor." module: tests/test_deploy_terminal_sync.py covers: [AC-8] expected: PASS - id: TC-09 type: integration description: "Не-self репо: deploy->done ставит Done (без регресса, Monitoring не применяется)." module: tests/test_deploy_terminal_sync.py covers: [AC-9] expected: PASS # --- Группа D: post-deploy monitor --- - id: TC-10 type: unit description: "run_post_deploy_monitor HEALTHY + окно исчерпано -> Plane-статус Done." module: tests/test_post_deploy.py covers: [AC-10] expected: PASS - id: TC-11 type: unit description: "run_post_deploy_monitor DEGRADED -> Plane-статус Blocked (+ ALERT_ONLY для self)." module: tests/test_post_deploy.py covers: [AC-11] expected: PASS - id: TC-12 type: unit description: "Self-hosting тик НЕ рестартит/не откатывает прод-контейнер (ORCH-021 BR-5 сохранён)." module: tests/test_post_deploy.py covers: [AC-12] expected: PASS # --- Группа E: In Review / Needs Input / Cancelled --- - id: TC-13 type: unit description: "In Review ставится только за approve-pending конвейера (analyst BRD ready), не Phase A." module: tests/test_analyst_status_only_regression.py covers: [AC-13] expected: PASS - id: TC-14 type: unit description: "set_issue_needs_input (analyst 01-questions.md) поведение идентично прежнему; не расширено на других агентов." module: tests/test_plane_status_model.py covers: [AC-14, BR-10] expected: PASS - id: TC-15 type: unit description: "Перевод в Cancelled -> handle_issue_updated не выполняет advance/rollback (индикация, не управление)." module: tests/test_plane_webhook.py covers: [AC-15] expected: PASS # --- Группа F: fail-closed (критично) --- - id: TC-16 type: unit description: "Проект без новых статусов: get_project_states отдаёт default-алиасы (to_analyse=in_progress, code_review=review, awaiting_deploy=in_review, monitoring=done); исключений нет." module: tests/test_plane_status_failclosed.py covers: [AC-16, BR-12] expected: PASS - id: TC-17 type: unit description: "Plane API down -> get_project_states fallback на _DEFAULT_STATES; set_issue_* never-raise." module: tests/test_plane_status_failclosed.py covers: [AC-16] expected: PASS - id: TC-18 type: integration description: "enduro In Progress по-прежнему стартует конвейер через to_analyse-алиас." module: tests/test_plane_status_failclosed.py covers: [AC-17] expected: PASS - id: TC-19 type: unit description: "Резолв по имени: при наличии статуса в проекте используется его UUID, а не default-алиас." module: tests/test_orch10_states.py covers: [AC-18] expected: PASS # --- Группа G: reconciler --- - id: TC-20 type: integration description: "F-2 _reconcile_plane_project запрашивает to_analyse и маршрутизирует к handle_status_start (потерянный webhook старта/resume)." module: tests/test_reconciler_plane.py covers: [AC-19] expected: PASS - id: TC-21 type: unit description: "Guard 2: задачи в Awaiting Deploy / Deploying / Monitoring after Deploy НЕ оживляются F-1 как зависшие." module: tests/test_reconciler.py covers: [AC-20, BR-13] expected: PASS # --- Группа H: инварианты --- - id: TC-22 type: unit description: "STAGE_TRANSITIONS не изменён (явная проверка ключей/значений слоя A)." module: tests/test_plane_status_model.py covers: [AC-21] expected: PASS - id: TC-23 type: unit description: "QG_CHECKS реестр и check_deploy_status контракты не изменены." module: tests/test_plane_status_model.py covers: [AC-22] expected: PASS - id: TC-24 type: integration description: "Полный прогон pytest tests/ -q зелёный (регрессия)." module: tests/ covers: [AC-23] expected: PASS