---
type: test-report
work_item_id: ORCH-071
result: PASS
---

# Test Report — ORCH-071

Верификация merge-в-main как условие `done` (фантомный merge).

## Окружение
- Python: 3.12.13
- pytest: 8.3.3
- Ветка: `feature/ORCH-071-crit-bug-merge-main` (HEAD `d72b1f5`)
- Review verdict: APPROVED (`12-review.md`)
- Дата: 2026-06-08

## Smoke test API (prod 8500, read-only)
| Endpoint | Результат |
|----------|-----------|
| `GET /health` | PASS — `{"status":"ok","service":"orchestrator"}` |
| `GET /status` | PASS — отдаёт активные задачи (ORCH-071 на стадии testing) |
| `GET /queue` | PASS — counts/resilience/reconcile/reaper/post_deploy в норме, breaker=closed, preflight_ok |

## Результаты по тест-плану (`04-test-plan.yaml`)

| TC ID | Описание | Тест | Результат |
|-------|----------|------|-----------|
| TC-01 | verify True: deployed SHA — предок origin/main | test_tc01_verify_true_when_sha_is_ancestor | PASS |
| TC-02 | verify True: PR.merged==true даже без git | test_tc02_verify_true_when_pr_merged_even_without_git | PASS |
| TC-03 | verify False: фантом (не предок И merged==false) | test_tc03_verify_false_when_phantom | PASS |
| TC-04 | never-raise (AC-7): ошибка git/HTTP → False | test_tc04_verify_never_raises_on_git_error / _http_error | PASS |
| TC-05 | finalizer: SUCCESS но PR open → НЕ done + alert | test_tc05_success_but_not_merged_holds_and_alerts | PASS |
| TC-06 | finalizer: SUCCESS + merge подтверждён → done | test_tc06_success_and_merged_reaches_done | PASS |
| TC-07 | merge-актор зовёт Gitea POST /pulls/{i}/merge | test_tc07_merge_actor_calls_gitea_merge | PASS |
| TC-08 | идемпотентность: already_merged → no-op | test_tc08_idempotent_already_merged / _no_open_pr_is_not_an_error | PASS |
| TC-09 | merge-актор never-raise: ошибка Gitea → (False, reason) | test_tc09_never_raise_on_http_error / _non_2xx_is_false | PASS |
| TC-10 | smoke (AC-3): рестарт в Phase B → re-drive докатывает merge → done | test_tc10_merge_recovers_after_restart | PASS |
| TC-11 | non-self репо: новая логика = no-op | test_tc11_non_self_repo_does_not_apply / _csv_scopes_to_listed_repos | PASS |
| TC-12 | kill-switch off → прежнее поведение | test_tc12_kill_switch_disables_under_gate | PASS |
| TC-13 | self-hosting safety: нет shell-out / force-push в main | test_tc13_no_shell_out_no_force_push | PASS |
| TC-14 | Phase B только при confirm_deploy=True; Approved → no-op | test_tc14_plain_approved_on_deploy_is_noop_no_merge / _confirm_deploy_initiates_phase_b | PASS |
| TC-15 | регресс: check_deploy_status / _parse_deploy_status неизменны | test_tc15_* (7 кейсов) | PASS |
| TC-16 | регресс: STAGE_TRANSITIONS / QG_CHECKS, deploy→done на месте | test_tc16_* (4 кейса) | PASS |

Покрыты все критерии приёмки AC-1..AC-11 (`03-acceptance-criteria.md`).

## Целевой прогон модулей ORCH-071
```
tests/test_merge_verify.py ................ 8 passed
tests/test_merge_actor.py ................. 6 passed
tests/test_deploy_finalizer_merge_gate.py . 4 passed
tests/test_deploy_restart_merge_recovery.py 1 passed
tests/test_qg_checks.py ................... 13 passed
tests/test_stages.py ...................... 4 passed
======================== 36 passed, 1 warning in 0.61s =========================
```

## Полный регресс
```
pytest tests/ -v --tb=short
======================= 853 passed, 1 warning in 22.77s ========================
```
(1 warning — PydanticDeprecatedSince20 в `src/config.py`, не связан с задачей.)

## Итог
**PASS** — все 853 теста зелёные, целевые 36 тестов ORCH-071 (TC-01..TC-16) PASS,
smoke API (health/status/queue) OK. Регрессы существующих контрактов
(`STAGE_TRANSITIONS`, `QG_CHECKS`, `check_deploy_status`) не выявлены.
Задача готова к переходу на `deploy-staging`.
