From 04d5671e1b3b3d17943de975b844c96c1d257be2 Mon Sep 17 00:00:00 2001 From: claude-bot Date: Mon, 15 Jun 2026 10:37:25 +0300 Subject: [PATCH] tester(ET): auto-commit from tester run_id=690 --- docs/work-items/ORCH-110/13-test-report.md | 91 ++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 docs/work-items/ORCH-110/13-test-report.md diff --git a/docs/work-items/ORCH-110/13-test-report.md b/docs/work-items/ORCH-110/13-test-report.md new file mode 100644 index 0000000..7a91834 --- /dev/null +++ b/docs/work-items/ORCH-110/13-test-report.md @@ -0,0 +1,91 @@ +--- +result: PASS # PASS | FAIL — машинный вердикт, UPPERCASE +work_item: ORCH-110 +stage: testing +author_agent: tester +status: pass +created_at: 2026-06-15 +model_used: claude-opus-4-8 +type: test-report +work_item_id: ORCH-110 +--- + +# Test Report — ORCH-110 + +Багфикс инцидента ORCH-109/PR#129: локальный re-test merge-gate падал по **таймауту** (инфра/CPU- +голодание от осиротевших pytest-процессов) при зелёных CI+tester+staging → ложно маршрутизировался +как код-фейл (откат `deploy-staging → development` + расход developer-retry) → manual-gate. Прогон +регресса подтверждает: инфра-таймаут толерируется (D1…D6), tree-kill устраняет утечку, красный re-test +по-прежнему откатывает. + +## Окружение +- 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-110-bug-merge-gate-local-re-test-t` +- Branch: `feature/ORCH-110-bug-merge-gate-local-re-test-t` (HEAD `5391c8b`; fix-коммит `b80edf3`) +- Дата: 2026-06-15 + +## Smoke API (read-only) +| Эндпоинт | Результат | +|----------|-----------| +| `GET /health` | `{"status":"ok","service":"orchestrator"}` — OK | +| `GET /status` | OK; задача ORCH-110 (id=100) на стадии `testing`, `agent_running=null` | +| `GET /queue` | OK; блок `serial_gate` присутствует ✓ (наряду с `auto_labels` ✓); полезная нагрузка не деградировала | + +> Прим.: блок `merge_gate` (новая наблюдаемость ORCH-110, FR-6) в проде (8500) ещё отсутствует — это +> ожидаемо, фича не задеплоена (задача на стадии `testing`). В коде ветки блок присутствует и покрыт +> тестом TC-12 (`test_tc12_queue_endpoint_includes_merge_gate_block`). Регресса смока нет. + +## Результаты (покрытие ТЗ: каждый TC из 04-test-plan.yaml ↔ 03-acceptance-criteria.md) + +| TC ID | Описание | AC | Модуль | Результат | +|-------|----------|----|--------|-----------| +| TC-01 | `retest_branch`: таймаут → `(False, 're-test timeout after s')` + tree-kill всего дерева (внуки не переживают) | AC-4 (BR-3) | test_orch110_retest_lifecycle.py | PASS | +| TC-02 | `coverage_gate.measure_coverage`: таймаут → tree-kill дерева; возврат `None` сохранён | AC-4 (BR-3) | test_orch110_retest_lifecycle.py | PASS | +| TC-03 | `classify_retest_failure`: `timeout` различим от `red`/`lock-busy`/`other` (имя/семантика `check_*` целы) | AC-2 | test_orch110_merge_gate_classify.py | PASS | +| TC-04 | Маршрутизация: инфра-таймаут → defer/повтор/инфра-alert (НЕ `_handle_merge_gate_rollback`, без developer-retry) | AC-1 | test_orch110_merge_gate_routing.py | PASS | +| TC-05 | Анти-над-толерантность: красный/конфликт re-test → откат на `development` + developer-retry + release lease (BR-6) | AC-3 | test_orch110_merge_gate_routing.py | PASS | +| TC-06 | Anti-loop: повторы лимитированы по попыткам/времени; исчерпание → один инфра-alert | AC-9 | test_orch110_merge_gate_routing.py | PASS | +| TC-07 | Kill-switch off → байт-в-байт прежнее (таймаут → rollback); not-self repo (enduro) → no-op | AC-7 | test_orch110_killswitch.py | PASS | +| TC-08 | Бюджет: malformed/непозитив → дефолт 900 + WARNING; `reaper_max_running_s (5400) > Σ+grace`; `reaper_max_running_s` не тронут | AC-5 | test_orch110_budget_invariants.py | PASS | +| TC-09 | never-raise: ошибка транзиент-пути → безопасный дефолт + WARNING; исключение не уходит в `advance_stage` | AC-8 | test_orch110_merge_gate_routing.py | PASS | +| TC-10 | РЕГРЕСС инцидента: no-op rebase → skip+advance; catch-up timeout → infra-retry (НЕ rollback); красный → rollback (red-before/green-after) | AC-10 | test_orch110_false_rollback_regression.py | PASS | +| TC-11 | Контракт необходимости re-test: no-op rebase → skip (lease HELD); HEAD сдвинулся / неопределённость SHA → re-test (fail-safe) | AC-6 | test_orch110_retest_contract.py | PASS | +| TC-12 | Наблюдаемость: счётчики + блок `merge_gate` в `GET /queue`; инфра-alert кликабелен и отличим от код-фейла; без дубля ORCH-111 | AC-9 (FR-6) | test_orch110_observability.py | PASS | + +Все 12 TC выполнены и сопоставлены с критериями приёмки AC-1…AC-10. FAIL/непокрытых TC нет. + +## Вывод pytest + +### ORCH-110-специфичные модули (verbose) +``` +collected 55 items +tests/test_orch110_retest_lifecycle.py ........ (TC-01, TC-02) +tests/test_orch110_merge_gate_classify.py ........ (TC-03) +tests/test_orch110_merge_gate_routing.py ........ (TC-04, TC-05, TC-06, TC-09) +tests/test_orch110_killswitch.py .... (TC-07) +tests/test_orch110_budget_invariants.py ......... (TC-08) +tests/test_orch110_false_rollback_regression.py ... (TC-10) +tests/test_orch110_retest_contract.py ...... (TC-11) +tests/test_orch110_observability.py ..... (TC-12) +======================== 55 passed, 1 warning in 15.17s ======================== +``` + +### Полный регресс +``` +$ cd /repos/_wt/orchestrator/feature_ORCH-110-bug-merge-gate-local-re-test-t && python3 -m pytest tests/ -q --tb=short +........................................................................ [100%] +1988 passed, 1 warning in 346.71s (0:05:46) +``` +(Единственное warning — `PydanticDeprecatedSince20` в `src/config.py:8`, предсуществующее, не связано +с ORCH-110.) + +## Итог +PASS + +- Полный регресс `pytest tests/` — **1988 passed** (0 failed). +- Все 12 TC из `04-test-plan.yaml` выполнены, сопоставлены с `03-acceptance-criteria.md` (AC-1…AC-10) — **PASS**. +- Smoke API read-only (`/health`, `/status`, `/queue`) — OK; блоки `serial_gate` и `auto_labels` присутствуют. +- Review-вердикт — `APPROVED`. + +**Вердикт: `result: PASS`** → задача переходит на `deploy-staging`.