6.6 KiB
result, work_item, stage, author_agent, status, created_at, model_used, type, work_item_id
| result | work_item | stage | author_agent | status | created_at | model_used | type | work_item_id |
|---|---|---|---|---|---|---|---|---|
| PASS | ORCH-110 | testing | tester | pass | 2026-06-15 | claude-opus-4-8 | test-report | 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(HEAD5391c8b; 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 <T>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.