diff --git a/docs/work-items/ORCH-061/13-test-report.md b/docs/work-items/ORCH-061/13-test-report.md new file mode 100644 index 0000000..b5e039c --- /dev/null +++ b/docs/work-items/ORCH-061/13-test-report.md @@ -0,0 +1,85 @@ +--- +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**.