work_item: ORCH-059 title: Approve прод-деплоя через выделенный статус «Confirm Deploy» repo: orchestrator stage: analysis # Контракт-тесты: триггер прод-деплоя смещается с перегруженного `Approved` # на выделенный статус `Confirm Deploy`. Деплой и сетевые вызовы мокаются. tests: - id: TC-01 type: unit description: "_PLANE_NAME_TO_KEY содержит маппинг 'Confirm Deploy' -> 'confirm_deploy'" module: tests/test_plane_states.py expected: PASS - id: TC-02 type: unit description: >- get_project_states для проекта ORCH (мок API со статусом 'Confirm Deploy') возвращает непустой UUID под ключом 'confirm_deploy', отличный от 'approved' module: tests/test_plane_states.py expected: PASS - id: TC-03 type: unit description: >- Fail-closed: при отсутствии статуса 'Confirm Deploy' (fallback _DEFAULT_STATES / недоступный API) доступ к ключу confirm_deploy не выбрасывает исключение и не активирует ветку confirm-deploy module: tests/test_plane_states.py expected: PASS - id: TC-04 type: unit description: >- handle_issue_updated: статус 'Confirm Deploy' на задаче стадии deploy маршрутизируется на путь Фазы B (а не на обычный approve/advance) module: tests/test_plane_confirm_deploy.py expected: PASS - id: TC-05 type: unit description: >- handle_verdict/Approved на стадии deploy НЕ вызывает self_deploy.initiate_deploy (initiate_deploy замокан и не должен быть вызван) module: tests/test_plane_confirm_deploy.py expected: PASS - id: TC-06 type: unit description: >- Approved на стадии analysis по-прежнему продвигает analysis -> architecture (approved-via-status, регрессия гейта check_analysis_approved) module: tests/test_plane_confirm_deploy.py expected: PASS - id: TC-07 type: unit description: >- stage_engine: блок Фазы B (current_stage==deploy, finished_agent is None) инициирует deploy ТОЛЬКО по сигналу confirm-deploy; Approved-сигнал -> no-op module: tests/test_stage_engine_phase_b.py expected: PASS - id: TC-08 type: unit description: >- Идемпотентность: при существующем маркере 'initiated' повторный Confirm Deploy не вызывает initiate_deploy (self-deploy-already-initiated) module: tests/test_stage_engine_phase_b.py expected: PASS - id: TC-09 type: unit description: >- CTA Фазы A (_handle_self_deploy_phase_a): текст Plane-комментария и Telegram содержат 'Confirm Deploy' и не предлагают 'Approved' как триггер деплоя module: tests/test_stage_engine_phase_a_cta.py expected: PASS - id: TC-10 type: integration description: >- E2E (мок Plane API + self_deploy): задача на deploy -> webhook Confirm Deploy -> initiate_deploy вызван, deploy-finalizer поставлен, маркер initiated записан module: tests/test_confirm_deploy_integration.py expected: PASS - id: TC-11 type: integration description: >- E2E: задача на deploy -> webhook Approved -> прод-деплой НЕ инициирован, задача остаётся на deploy (нет отката, нет advance в done) module: tests/test_confirm_deploy_integration.py expected: PASS - id: TC-12 type: integration description: >- Условность: для не-self репозитория verdict-статусы на deploy не меняют поведение деплоя (self_deploy_applies == False) module: tests/test_confirm_deploy_integration.py expected: PASS regression: - id: RG-01 type: integration description: "pytest tests/ -q зелёный; STAGE_TRANSITIONS и QG_CHECKS без изменений" module: tests/ expected: PASS