diff --git a/docs/work-items/ORCH-019/13-test-report.md b/docs/work-items/ORCH-019/13-test-report.md new file mode 100644 index 0000000..0ba7c3c --- /dev/null +++ b/docs/work-items/ORCH-019/13-test-report.md @@ -0,0 +1,84 @@ +--- +result: PASS # PASS | FAIL — машинный вердикт, UPPERCASE +work_item: ORCH-019 +stage: testing +author_agent: tester +status: pass +created_at: 2026-06-10 +model_used: claude-opus-4-8 +type: test-report +work_item_id: ORCH-019 +--- + +# Test Report — ORCH-019 — Багфикс-трек (упрощённый/дешёвый маршрут для багов) + +## Окружение +- Python: 3.12.13 +- pytest: 8.3.3 (plugins: cov-5.0.0, anyio-4.13.0, asyncio-0.23.8) +- Worktree: `/repos/_wt/orchestrator/feature_ORCH-019-` (ветка `feature/ORCH-019-`) +- Дата: 2026-06-10T00:53:34Z +- Предусловие: review `12-review.md` = `verdict: APPROVED` ✓ + +## Smoke API (read-only) +| Endpoint | Результат | Примечание | +|----------|-----------|------------| +| `GET /health` | PASS | `{"status":"ok","service":"orchestrator"}` | +| `GET /status` | PASS | отвечает; ORCH-019 (task 84) виден на стадии `testing` | +| `GET /queue` | PASS | блок `serial_gate` присутствует (ORCH-088) ✓; `auto_labels` присутствует ✓ | + +> Прод-контейнер (8500) исполняет код **до** ORCH-019 (фича ещё не задеплоена), поэтому блока +> `bug_fast_track` в живом `/queue` ожидаемо нет — это не регресс смока. Обязательные для смока +> блоки `serial_gate` и `auto_labels` присутствуют. Новый блок `bug_fast_track` верифицирован +> юнит/интеграционными тестами `test_queue_endpoint.py` (TC-13) на коде ветки. Smoke — read-only, +> прод-контейнер не трогался. + +## Результаты — покрытие TC из `04-test-plan.yaml` + +| TC ID | Описание (кратко) | Тип | Тесты | AC | Результат | +|-------|-------------------|-----|-------|----|-----------| +| TC-01 | `is_bug_task()` True для метки `Bug`; источник — Plane API, не payload | unit | `test_tc01_is_bug_task_true`, `test_tc01_label_from_plane_api_not_payload` | AC-1 | PASS | +| TC-02 | `is_bug_task()` False при отсутствии/неоднозначной метке/`labels=None` (fail-safe) | unit | `test_tc02_label_absent`, `test_tc02_labels_none`, `test_tc02_label_ambiguous`, `test_tc02_empty_label_config` | AC-1/AC-6 | PASS | +| TC-03 | `bug_fast_track_applies(repo)`: локальная область ПЕРВОЙ; выключенный флаг → без сети | unit | `test_tc03_empty_csv_self_hosting_only`, `test_tc03_csv_membership`, `test_tc03_killswitch_off_no_network` | AC-6 | PASS | +| TC-04 | never-raise: исключение в fetch labels → деградация в False (полный цикл) | unit | `test_tc04_is_bug_task_never_raises`, `test_tc04_applies_never_raises` | AC-6 | PASS | +| TC-05 | Маршрут: bug → next stage после analysis = `development`; не-баг = `architecture` | unit | `test_tc05_bug_task_skips_architecture`, `test_tc05_full_task_keeps_architecture`, `test_tc05_killswitch_off_bug_keeps_architecture`, `test_tc05_bug_only_affects_analysis_edge` | AC-2 | PASS | +| TC-06 | `STAGE_TRANSITIONS` структурно не изменён (анти-регресс) | unit | `test_tc06_stage_transitions_unchanged`, `test_tc06_get_next_stage_pure` | AC-2 | PASS | +| TC-07 | `QG_CHECKS`/сигнатуры `check_*`/вердикт-ключи не изменены (имя+регистр) | unit | `test_tc07_qg_checks_registry_unchanged`, `test_tc07_verdict_keys_preserved` | AC-3 | PASS | +| TC-08 | E2E багфикс-трек проходит development→…→deploy, минуя architecture, все гейты | integration | `test_tc08_bug_task_full_walk_skips_architecture` | AC-2/AC-3 | PASS | +| TC-09 | `start_pipeline`: метка Bug → bug-track; без метки → full-track | integration | `test_tc09_bug_label_creates_bug_track`, `test_tc09_no_label_creates_full_track` | AC-1 | PASS | +| TC-10 | Fail-safe: `enabled=False` → метка Bug идёт полным циклом (нулевая регрессия) | integration | `test_tc10_killswitch_off_bug_label_full_cycle` | AC-6 | PASS | +| TC-11 | Эскалация: `'bug'→'full'` → штатный маршрут с architecture | integration | `test_tc11_escalate_returns_to_full_cycle`, `test_tc11_escalate_unknown_work_item`, `test_tc11_escalate_missing_arg`, `test_tc11_escalate_idempotent_on_full` | AC-5 | PASS | +| TC-12 | `check_analysis_*` не блокирует ложно lite-пакет; не ослаблен для не-баг | unit | `test_tc12_bug_lite_package_with_all_four_passes`, `test_tc12_missing_file_still_fails_for_any_track`, `test_tc12_signature_has_no_track_param` | AC-3/FR-6 | PASS | +| TC-13 | `GET /queue` несёт read-only блок `bug_fast_track`; существующие ключи целы | integration | `test_queue_has_bug_fast_track_block_and_keeps_existing_keys`, `test_queue_bug_fast_track_counts_bug_tasks` | AC-7 | PASS | +| TC-14 | Композиция: bug-задача учтена serial-gate; autoApprove/autoDeploy применимы | integration | `test_tc14_bug_task_counts_as_active_in_serial_gate`, `test_tc14_bug_task_itself_gated_behind_predecessor`, `test_tc14_bug_task_claimable_once_predecessor_done`, `test_tc14_auto_label_applies_track_agnostic` | AC-9 | PASS | +| TC-15 | Миграция `tasks.track` аддитивна/идемпотентна; дефолт `'full'` | unit | `test_tc15_track_column_present_with_default`, `test_tc15_init_db_idempotent`, `test_tc15_helpers_round_trip`, `test_tc15_get_task_track_missing_row_failsafe` | AC-8 | PASS | + +**Итог покрытия:** все 15 TC из `04-test-plan.yaml` выполнены и сопоставлены с критериями +`03-acceptance-criteria.md` (AC-1…AC-9). Непокрытых/пропущенных TC нет. + +## Вывод pytest + +### Целевые suite ORCH-019 (6 файлов + queue/migrations) +``` +$ pytest tests/test_bug_fast_track.py tests/test_bug_fast_track_routing.py \ + tests/test_bug_fast_track_gates.py tests/test_bug_fast_track_e2e.py \ + tests/test_bug_fast_track_escalation.py tests/test_bug_fast_track_composition.py \ + tests/test_queue_endpoint.py tests/test_db_migrations.py -v +... +======================== 46 passed, 1 warning in 2.51s ========================= +``` +46/46 целевых тестов — PASS. + +### Полный регресс +``` +$ pytest tests/ -q --tb=short +........................................................................ [100%] +1551 passed, 1 warning in 56.64s +``` +1551/1551 — PASS, 0 failed. (Единственный warning — известный Pydantic V2 deprecation в +`src/config.py:8`, не относится к ORCH-019.) + +## Итог +**PASS** — полный регресс (1551 passed) и целевые suites ORCH-019 (46 passed) зелёные; smoke API +(`/health`/`/status`/`/queue` с блоками `serial_gate`+`auto_labels`) — OK; все 15 TC выполнены и +сопоставлены с AC-1…AC-9. Корневой инвариант NFR-1 (неизменность `STAGE_TRANSITIONS`/`QG_CHECKS`/ +вердикт-ключей) подтверждён анти-регресс-тестами TC-06/TC-07. → стадия переходит на `deploy-staging`.