--- type: test-report work_item_id: ORCH-061 result: PASS --- # Test Report — ORCH-061 BUG: устранение петли `deploy-staging → development` при self-hosting self-deploy. Реализован Direction (б) из ADR-001: классификация staging-проверок на `REAL` (fail-closed) и `SANDBOX_INFRA` (allowlist `{C9a, C9b}`, waivable) + толерантный, но fail-closed вердикт (`src/staging_verdict.py`), kill-switch `staging_infra_tolerance_enabled` (env `ORCH_STAGING_INFRA_TOLERANCE_ENABLED`). ## Окружение - Python: 3.12.13 - pytest: 8.3.3 - Дата: 2026-06-07T13:19Z - Ветка: `feature/ORCH-061-bug-deploy-staging-development` - Review verdict: APPROVED (12-review.md) ## Smoke test API (prod 8500, read-only) | Endpoint | Результат | |----------|-----------| | GET /health | HTTP 200 `{"status":"ok","service":"orchestrator"}` | | GET /status | HTTP 200 (ORCH-061 в стадии `testing`) | | GET /queue | HTTP 200 (counts/resilience/reconcile present) | > Прод-контейнер 8500 не перезапускался и не трогался (self-hosting safety, AC-12). ## Результаты по тест-плану (04-test-plan.yaml) | TC ID | Описание | Тест | Результат | |-------|----------|------|-----------| | TC-01 | Корректный self-deploy: staging SUCCESS → advance к deploy, без отката | `test_stage_engine.py::test_tc01_healthy_self_deploy_advances_no_rollback` | PASS | | TC-02 | Страховка ORCH-35: реальный FAIL → откат deploy-staging→development | `test_stage_engine.py::test_tc02_real_staging_failed_rolls_back` | PASS | | TC-03 | Классификация REAL vs SANDBOX_INFRA (C9a/C9b отличимы) | `test_staging_check_b6.py::test_tc03_classify_infra_checks` (+ records/override/strict) | PASS | | TC-04 | Падают только C9a/C9b → итог не-FAILED (нет ложного отката) | `test_qg_checks.py::test_tc04_only_infra_failures_waived_to_success` | PASS | | TC-05 | Падает реальная pipeline-проверка → FAILED (fail-closed) | `test_qg_checks.py::test_tc05_any_real_failure_fails_closed` (+ `_even_alone`) | PASS | | TC-06 | no-changes на action-стадии (deploy-staging/deploy) не есть недовыполнение | `test_launcher.py::test_tc06_deploy_staging_self_deploy_returns_note` / `test_tc06_deploy_self_deploy_returns_note` | PASS | | TC-07 | regression-guard: на code-стадии (development) поведение прежнее | `test_launcher.py::test_tc07_development_stage_returns_none` | PASS | | TC-08 | Не-self-hosting репо: check_staging_status остаётся (True, "N/A …") | `test_qg.py` (no-op N/A) | PASS | | TC-09 | Kill-switch выкл → 1:1 прежнее строгое поведение, безопасный дефолт | `test_qg_checks.py::test_tc09_infra_failure_strict_mode_fails_closed` + `test_config.py::test_staging_infra_tolerance_*` | PASS | | TC-10 | БАГ-8: deploy_status FAILED → откат deploy→development | `test_deploy_rollback.py` | PASS | | TC-11 | Снапшот QG_CHECKS / STAGE_TRANSITIONS не изменён; frontmatter-контракты целы | `test_qg_registry_snapshot.py` | PASS | | TC-12 | never-raise: вердикт-логика при мусоре → безопасный детерминированный FAILED | `test_qg_checks.py::test_tc12_compute_verdict_never_raises_on_garbage` + `test_stage_engine.py::test_tc12_retry_and_rollback_behavior_unchanged` | PASS | | TC-13 | Сквозной self-deploy: deploy-staging→deploy→done без единого отката | `test_stage_engine.py::test_tc13_end_to_end_self_deploy_no_single_rollback` | PASS | | TC-14 | Наблюдаемость: «зелёный с допущением» отличим от честного зелёного | `test_stage_engine.py::test_tc14_waived_green_distinguishable_from_honest_green` | PASS | Все 14 TC присутствуют и зелёные. ## Сопоставление с критериями приёмки (03-acceptance-criteria.md) | AC | Критерий | Покрытие | Статус | |----|----------|----------|--------| | AC-1 | Проход self-deploy без петли | TC-01, TC-13 | PASS | | AC-2 | Инфра-FAIL (C9a/C9b) не откатывает | TC-03, TC-04 | PASS | | AC-3 | Реальный провал staging откатывает | TC-02, TC-05 | PASS | | AC-4 | no-changes на action-стадии ≠ недовыполнение | TC-06, TC-07 | PASS | | AC-5 | БАГ-8: провал прод-деплоя откатывает | TC-10 | PASS | | AC-6 | Условность self-hosting сохранена | TC-08 | PASS | | AC-7 | Kill-switch возвращает прежнее поведение | TC-09 | PASS | | AC-8 | Контракты не сломаны (реестр/frontmatter/exit-code) | TC-11 | PASS | | AC-9 | Схема БД не меняется | миграций нет (флаг — конфиг) | PASS | | AC-10 | never-raise | TC-12 | PASS | | AC-11 | Наблюдаемость (INFRA-WAIVED / waived list) | TC-14 | PASS | | AC-12 | Безопасность self-hosting (прод 8500 не трогается) | smoke + код пути | PASS | | AC-13 | Документация обновлена (golden source) | подтверждено в 12-review.md | PASS | | AC-14 | Регрессионные тесты зелёные | `pytest tests/ -q` → 670 passed | PASS | ## Вывод pytest ``` $ python -m pytest tests/ -v --tb=short ... ======================= 670 passed, 1 warning in 12.15s ======================== ``` Единственный warning — PydanticDeprecatedSince20 (class-based Config в `src/config.py`), не относится к ORCH-061, существовал ранее. ## Итог **PASS** — полный регресс зелёный (670 passed, 0 failed), все 14 TC из плана и все 14 критериев приёмки выполнены. Страховка цела (реальный регресс staging и БАГ-8 откатывают), условность self-hosting сохранена, kill-switch работает, never-raise покрыт. Smoke API prod — 200, прод-контейнер не затронут. Задача готова к переходу на стадию **deploy-staging**.