--- type: test-report work_item_id: ORCH-036 result: PASS --- # Test Report — ORCH-036 Исполняемый самодеплой стадии `deploy` (Вариант B) — дёргает хост-хук `scripts/orchestrator-deploy-hook.sh`, три фазы (A/B/C), условность по self-hosting репо. ## Окружение - Python: 3.12.13 - pytest: 8.3.3 (pluggy 1.6.0, anyio 4.13.0, asyncio 0.23.8 — mode AUTO) - Worktree: `feature/ORCH-036-orch-36-deploy-b` - Дата: 2026-06-06 - Prod (8500) во время тестов НЕ тронут: вся проверка изолированная (моки subprocess/ssh/хука). Smoke выполнялся read-only GET-запросами. ## Smoke test API (prod 8500, read-only) | Endpoint | Результат | |----------|-----------| | GET /health | `{"status":"ok","service":"orchestrator"}` — OK | | GET /status | OK (отдаёт активные задачи) | | GET /queue | OK (counts/max_concurrency/resilience; breaker=closed, preflight_ok=true) | `curl` в окружении отсутствует — smoke выполнен через `urllib.request` (эквивалент GET). ## Результаты по тест-плану (04-test-plan.yaml) | TC ID | Описание | Тест | Результат | |-------|----------|------|-----------| | TC-01 | exit 0 → deploy_status: SUCCESS | test_tc01_exit0_maps_to_success | PASS | | TC-02 | exit 1 (rolled back) → FAILED | test_tc02_exit1_rolled_back_maps_to_failed | PASS | | TC-03 | exit 2 (rollback тоже упал) → FAILED | test_tc03_exit2_rollback_also_failed_maps_to_failed | PASS | | TC-04 | DEPLOY_REQUIRE_MANUAL_APPROVE дефолт == true | test_tc04_manual_approve_default_true | PASS | | TC-05 | true и нет approve → прод-хук НЕ вызван | test_tc05_no_approve_does_not_call_prod_hook | PASS | | TC-06 | true и approve → прод-хук вызван ровно 1 раз | test_tc06_approved_calls_prod_hook_exactly_once | PASS | | TC-07 | is_self_hosting_repo: только orchestrator True | test_tc07_is_self_hosting_repo_only_orchestrator | PASS | | TC-08 | self-репо: рестарт detached host-процессом | test_tc08_self_repo_launches_detached_host_process | PASS | | TC-09 | не-self репо: прежний ssh-путь | test_tc09_non_self_repo_uses_legacy_path | PASS | | TC-10 | FAILED → откат deploy→development, blocked, release lease | test_tc10_failed_deploy_rolls_back_to_development | PASS | | TC-11 | staging_status FAILED → до deploy не доходит | test_tc11_staging_failed_never_reaches_deploy | PASS | | TC-12 | успех → Plane-коммент + Telegram | test_tc12_success_notifies_plane_and_telegram | PASS | | TC-13 | откат → Plane-коммент + Telegram | test_tc13_rollback_notifies_plane_and_telegram | PASS | | TC-14 | build-once: retag staging-образа, без build | test_tc14_deploy_command_retags_staging_image_no_build | PASS | | TC-15 | _parse_deploy_status контракт цел (проза не проходит) | test_qg_checks::test_tc15_* (5 кейсов) | PASS | | TC-16 | STAGE_TRANSITIONS deploy/deploy-staging не изменены | test_stages::test_tc16_* | PASS | | TC-17 | terminal-sync deploy→done сохранён | test_tc17_success_deploy_syncs_terminal_done | PASS | | TC-18 | merge-gate (ORCH-43) на ребре не затронут | test_merge_gate (14 кейсов) | PASS | | TC-19 | симуляция битого деплоя: авто-rollback → healthy, exit 1 | test_tc19_unhealthy_deploy_auto_rolls_back_exit1 | PASS | Доп. регрессионные тесты (review-fix): `test_clear_state_removes_all_markers_and_is_idempotent`, `test_tc11_re_deploy_after_rollback_not_wedged` — оба PASS (stale deploy-state очищается, повторный заход на deploy после отката не зависает). ## Покрытие критериев приёмки | AC | Покрыт тестами | Статус | |----|----------------|--------| | AC-1 реальный деплой (не бумажный) | TC-01..03, TC-14, TC-19 | PASS | | AC-2 self-репо рестарт detached, агент себя не убивает | TC-08 | PASS | | AC-3 deploy_status из exit-code | TC-01..03 | PASS | | AC-4 FAILED → откат на development | TC-10 | PASS | | AC-5 ручной approve реально тормозит прод | TC-05, TC-06 | PASS | | AC-6 уведомления о промоуте и откате | TC-12, TC-13 | PASS | | AC-7 build-once (образ из staging) | TC-14 | PASS | | AC-8 staging-гейт обязателен | TC-11 | PASS | | AC-9 авто-rollback восстанавливает прод (MTTR<60с) | TC-19 | PASS | | AC-10 инварианты не сломаны | TC-15..18 + полный регресс | PASS | | AC-11 условность по репо (не-self не ломается) | TC-07, TC-09 | PASS | | AC-12 флаг авто НЕ выключен (остаётся true) | TC-04 | PASS | | AC-13 документация обновлена | проверено reviewer (12-review.md, APPROVED) | PASS | ## Вывод pytest Полный регресс: ``` ======================= 568 passed, 1 warning in 15.25s ======================== ``` (единственный warning — PydanticDeprecatedSince20 в `src/config.py`, не связан с задачей) Целевые модули тест-плана: ``` ======================== 46 passed, 1 warning in 2.17s ========================= ``` ## Итог **PASS** — все 19 TC зелёные, все критерии приёмки AC-1…AC-13 покрыты, полный регресс 568/568 passed, smoke API OK, прод (8500) не тронут. Задача готова к стадии deploy-staging.