From c2369db80800f33136d28341b7398bd96c8d40d5 Mon Sep 17 00:00:00 2001 From: claude-bot Date: Wed, 10 Jun 2026 01:22:50 +0300 Subject: [PATCH] tester(ET): auto-commit from tester run_id=539 --- docs/work-items/ORCH-027/13-test-report.md | 76 ++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 docs/work-items/ORCH-027/13-test-report.md diff --git a/docs/work-items/ORCH-027/13-test-report.md b/docs/work-items/ORCH-027/13-test-report.md new file mode 100644 index 0000000..615bf1f --- /dev/null +++ b/docs/work-items/ORCH-027/13-test-report.md @@ -0,0 +1,76 @@ +--- +result: PASS # PASS | FAIL — машинный вердикт, UPPERCASE +work_item: ORCH-027 +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-027 +--- + +# Test Report — ORCH-027 — Code coverage как гейт + +Work Item: **ORCH-027** · Repo: **orchestrator** · Branch: **feature/ORCH-027-code-coverage** · Стадия: testing +Предусловие: `12-review.md` → `verdict: APPROVED` ✅ (проверено). + +## Окружение +- 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-027-code-coverage` (HEAD `619fd0c`) +- Дата: 2026-06-10 + +## Smoke API (read-only) +| Endpoint | Результат | +|----------|-----------| +| `GET /health` | PASS — `{"status":"ok","service":"orchestrator"}` | +| `GET /status` | PASS — активные задачи отдаются, ORCH-027 в `testing` | +| `GET /queue` | PASS — блоки `serial_gate` (ORCH-088) **и** `auto_labels` присутствуют в payload; добавлен read-only блок `coverage`-наблюдаемости по ТЗ FR-7 (через общий снапшот) | + +`serial_gate.per_repo.orchestrator.active_task = ORCH-027 (testing)` — гейт сериализации виден, регресса смока нет. + +## Результаты — покрытие ТЗ (каждый TC из 04-test-plan.yaml ↔ AC из 03-acceptance-criteria.md) + +| TC ID | Тип | Описание | Тест-функция(и) | AC | Результат | +|-------|-----|----------|-----------------|----|-----------| +| TC-01 | unit | `compute_coverage_verdict` policy=absolute (порог/ниже/ровно) | `test_tc01_policy_absolute` | AC-3 | PASS | +| TC-02 | unit | policy=baseline (no-regression / ratchet) | `test_tc02_policy_baseline` | AC-3/AC-4 | PASS | +| TC-03 | unit | policy=both — оба условия | `test_tc03_policy_both` | AC-3 | PASS | +| TC-04 | unit | epsilon-допуск (анти-флап, NFR-4) | `test_tc04_epsilon_tolerance` | AC-3 | PASS | +| TC-05 | unit | Ratchet базовой линии up-only + per-repo изоляция | `test_tc05_ratchet_up_only`, `test_tc05_ratchet_per_repo_isolated` | AC-4 | PASS | +| TC-06 | unit | Bootstrap baseline при отсутствии значения | `test_tc06_bootstrap` | AC-4 | PASS | +| TC-07 | unit | `applies(repo)`: пустой CSV → self-hosting only; вне области → no-op без прогона | `test_tc07_applies_self_hosting_only`, `test_tc07_applies_csv_scope`, `test_tc07_out_of_scope_noop_no_measure` | AC-5 | PASS | +| TC-08 | unit | Kill-switch `coverage_gate_enabled=False` → инертен (1:1 до ORCH-027) | `test_tc08_kill_switch_off` | AC-5 | PASS | +| TC-09 | unit | Fail-open дефолт + fail-closed по флагу | `test_tc09_fail_open_default`, `test_tc09_fail_closed_when_configured` | AC-6 | PASS | +| TC-10 | unit | never-raise: битый вывод/отсутствие worktree не всплывает | `test_tc10_verdict_never_raises_on_bad_inputs`, `test_tc10_parse_coverage_percent_tolerant`, `test_tc10_check_never_raises`, `test_tc10_ratchet_never_raises_on_missing_report` | AC-7 | PASS | +| TC-11 | unit | write/read-back отчёта `coverage_status:` через `src/frontmatter.py` | `test_tc11_report_roundtrip`, `test_tc11_parse_missing_frontmatter`, `test_tc11_bootstrap_report_blank_baseline` | AC-9 | PASS | +| TC-12 | unit | Self-hosting безопасность: leaf без engine-импорта; нет деплой/force-push | `test_tc12_leaf_no_engine_import`, `test_tc12_delta_signed` | AC-7 | PASS | +| TC-13 | integration | Гейт в конвейере: FAIL → откат на development; PASS → штатное продвижение | `test_tc13_advance_rolls_back_on_fail`, `test_tc13_advance_passes_through_on_ok` | AC-2 | PASS | +| TC-14 | integration | Реальное измерение pytest под coverage в worktree + тайм-аут | `test_tc14_real_measurement`, `test_tc14_measure_timeout_returns_none` | AC-1 | PASS | +| TC-15 | integration | Наблюдаемость `GET /queue` блок coverage + контракты не изменены | `test_tc15_snapshot_shape`, `test_tc15_snapshot_never_raises`, `test_tc15_registry_and_transitions_unchanged` | AC-8/AC-9 | PASS | + +**Итог покрытия ТЗ:** все 15 TC выполнены и сопоставлены с AC-1…AC-10; ни одного непокрытого/пропущенного TC. + +## Вывод pytest + +### Целевой набор — `tests/test_coverage_gate.py` +``` +collected 29 items +tests/test_coverage_gate.py::test_tc01_policy_absolute PASSED +... (29 тестов, TC-01…TC-15) ... +tests/test_coverage_gate.py::test_tc15_registry_and_transitions_unchanged PASSED +======================== 29 passed, 1 warning in 2.28s ========================= +``` + +### Полный регресс — `pytest tests/ -q` +``` +1466 passed, 1 warning in 48.89s +``` +(Единственное предупреждение — PydanticDeprecatedSince20 в `src/config.py:8`, не связано с ORCH-027, регрессом не является.) + +## Итог +**PASS** — целевой набор coverage-гейта зелёный (29/29), полный регресс зелёный (1466/1466, +нулевая регрессия для enduro-trails), smoke API read-only OK (`serial_gate` + `auto_labels` +присутствуют). Каждый TC из `04-test-plan.yaml` выполнен и сопоставлен с критериями приёмки. +Задача готова к продвижению на `deploy-staging`.