From 8628e609d999411470d3e934ac239577a9d3cbac Mon Sep 17 00:00:00 2001 From: claude-bot Date: Sun, 14 Jun 2026 14:13:44 +0300 Subject: [PATCH] tester(ET): auto-commit from tester run_id=669 --- docs/work-items/ORCH-109/13-test-report.md | 82 ++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 docs/work-items/ORCH-109/13-test-report.md diff --git a/docs/work-items/ORCH-109/13-test-report.md b/docs/work-items/ORCH-109/13-test-report.md new file mode 100644 index 0000000..d4a4a4a --- /dev/null +++ b/docs/work-items/ORCH-109/13-test-report.md @@ -0,0 +1,82 @@ +--- +result: PASS +work_item: ORCH-109 +stage: testing +author_agent: tester +status: pass +created_at: 2026-06-14 +model_used: claude-opus-4-8 +type: test-report +work_item_id: ORCH-109 +--- + +# Test Report — ORCH-109 — timeout budgets + launch-time model telemetry для developer/reviewer + +> Машинный вердикт читается ТОЛЬКО из frontmatter. Канонический ключ — `result:`. + +## Окружение +- Python: 3.12.13 +- pytest: 8.3.3 (plugins: cov-5.0.0, anyio-4.13.0, asyncio-0.23.8) +- Дата: 2026-06-14 +- Worktree: `feature/ORCH-109-orch-timeout-budgets-launch-ti` + (`/repos/_wt/orchestrator/feature_ORCH-109-orch-timeout-budgets-launch-ti/`) + +## Smoke API (read-only, прод не трогался) +| Endpoint | Результат | +|----------|-----------| +| `GET /health` | PASS — `{"status":"ok","service":"orchestrator"}` | +| `GET /status` | PASS — задача 98 (ORCH-109) в стадии `testing`, агент не запущен | +| `GET /queue` | PASS — блок `serial_gate` присутствует (ORCH-088); блок `auto_labels` присутствует (ORCH-089) | + +## Результаты + +### Полный регресс +`pytest tests/ -q` → **1899 passed, 1 warning in 516.70s (0:08:36)** (exit 0). +Единственное предупреждение — `PydanticDeprecatedSince20` (class-based config, pre-existing, +не связано с ORCH-109). Прод-контейнер не затрагивался. + +### Профильная сюита +`pytest tests/test_orch109_timeout_model.py -v` → **25 passed** (exit 0, 13.50s). +Покрывает TC-01…TC-12 (+ доп. варианты: configurable-keys, overrides-json-wins, параметризация +non-positive `[0,-5,abc]`, clean-exit advances, unstamped-killed drops suffix). + +## Сопоставление с тест-планом (`04-test-plan.yaml`) + +| TC ID | Описание | Тест-функция(и) | Результат | +|-------|----------|-----------------|-----------| +| TC-01 | `_resolve_timeout('developer'/'reviewer')` возвращает поднятый бюджет | `test_tc01_developer_reviewer_raised`, `test_tc01_dedicated_keys_are_configurable`, `test_tc01_overrides_json_wins_over_dedicated` | PASS | +| TC-02 | Прочие роли (analyst/architect/tester/deployer) → глобальный 1800 | `test_tc02_other_roles_use_global_default` | PASS | +| TC-03 | Малформный конфиг → откат на дефолт + WARNING, без исключения | `test_tc03_malformed_overrides_json_never_raises`, `test_tc03_non_positive_dedicated_falls_back[0/-5/abc]` | PASS | +| TC-04 | Launch стампит `agent_runs.model` (непустую) рядом с effort | `test_tc04_spawn_stamps_model_and_effort` | PASS | +| TC-05 | Стамп изолирован: сбой записи не пробрасывает исключение (never-raise) | `test_tc05_stamp_failure_is_isolated` | PASS | +| TC-06 | `record_usage(None)`/`model=None` НЕ затирают launch-стамп (COALESCE) | `test_tc06_record_usage_none_preserves_model`, `test_tc06_record_usage_model_none_preserves_model` | PASS | +| TC-07 | `record_usage` с непустой model уточняет/проставляет значение | `test_tc07_record_usage_nonempty_model_enriches_blank`, `test_tc07_record_usage_refines_existing_model` | PASS | +| TC-08 | Sanity reaper-инварианта: `reaper_max_running_s > max(timeout)+grace` | `test_tc08_shipped_defaults_satisfy_invariant`, `test_tc08_resolved_max_is_developer` | PASS | +| TC-09 | `_stage_line` для `exit_code=-9` рендерит ` · · ` (model не null) | `test_tc09_killed_run_renders_model_effort`, `test_tc09_unstamped_killed_run_drops_model_suffix` | PASS | +| TC-10 | `get_running_agents` отдаёт непустую model для running-job (in-flight) | `test_tc10_running_job_exposes_model` | PASS | +| TC-11 | Анти-salvage: killed developer/reviewer (`exit_code=-9`) не продвигает стадию | `test_tc11_killed_developer_run_does_not_advance`, `test_tc11_killed_reviewer_run_does_not_advance`, `test_tc11_clean_exit_advances` | PASS | +| TC-12 | Анти-регресс: STAGE_TRANSITIONS/QG_CHECKS/схема `agent_runs` не изменены | `test_tc12_stage_transitions_unchanged`, `test_tc12_agent_runs_model_effort_columns_preexist`, `test_tc12_qg_checks_registry_present` | PASS | + +**Все 12 TC выполнены и сопоставлены.** + +## Сопоставление с критериями приёмки (`03-acceptance-criteria.md`) + +| AC | Критерий | Покрытие | Результат | +|----|----------|----------|-----------| +| AC-1 | Модель стампится в `agent_runs.model` на launch | TC-04 | PASS | +| AC-2 | Постфактум-enrich не затирает launch-стамп при оборванном JSON | TC-06, TC-07 | PASS | +| AC-3 | Тайм-аут developer/reviewer поднят и конфигурируем без влияния на прочие | TC-01, TC-02 | PASS | +| AC-4 | Малформный timeout-конфиг → безопасный откат (never-break) | TC-03 | PASS | +| AC-5 | Reaper-инвариант сохранён | TC-08 | PASS | +| AC-6 | Строка стадии трекера показывает model+effort при timeout/kill | TC-09 | PASS | +| AC-7 | In-flight видимость модели в `/metrics`/`/queue` | TC-10 | PASS | +| AC-8 | Timeout-killed прогон не продвигает стадию (анти-salvage) | TC-11 | PASS | +| AC-9 | Неприкосновенность контрактов и схемы | TC-12 | PASS | +| AC-10 | Документация и полный регресс зелёный | full regress (1899 passed) + review APPROVED | PASS | + +**Все 10 AC покрыты и зелёные.** + +## Итог +**PASS** — полный регресс зелёный (1899 passed, exit 0), профильная сюита ORCH-109 зелёная +(25 passed), smoke API OK (`serial_gate`/`auto_labels` присутствуют в `/queue`), каждый TC из +тест-плана выполнен и сопоставлен с критериями приёмки. Задача переходит на `deploy-staging`.