--- 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`.