ORCH-109: timeout budgets developer/reviewer + launch-time model telemetry #129

Merged
admin merged 11 commits from feature/ORCH-109-orch-timeout-budgets-launch-ti into main 2026-06-14 20:47:32 +03:00
Owner

ORCH-109 — timeout budgets + launch-time model telemetry (developer/reviewer)

Две аддитивные изолированные правки подсистемы запуска агентов (инцидент ORCH-104, runs 658/659/660), без касания STAGE_TRANSITIONS / QG_CHECKS / check_* / machine-verdict / схемы БД.

Что сделано

  1. Launch-стамп модели (D1, FR-1): резолвенная resolve_agent_model(...) пишется в agent_runs.model в момент launch объединённым UPDATE agent_runs SET model=?, effort=? WHERE id=? рядом со стампом эффорта (ORCH-087) в launcher._spawn. Модель присутствует с launch, переживает timeout-kill (exit_code=-9), видна in-flight в GET /metrics/GET /queue и в строке Telegram-карточки. Постфактум record_usage (model=COALESCE(?, model)) остаётся обогащением. Пустой резолв → NULL. never-raise.
  2. Поднятые per-role бюджеты (D3/D4, FR-3): выделенные ключи agent_timeout_developer_s=3600 / agent_timeout_reviewer_s=3000 (env ORCH_AGENT_TIMEOUT_DEVELOPER_S/_REVIEWER_S). Лестница _resolve_timeout: agent_timeout_overrides_json[agent] → выделенный ключ роли → agent_timeout_seconds=1800 (прочие роли — байт-в-байт). Малформный/непозитивный конфиг → дефолт + WARNING (never-break). Инвариант reaper ORCH-065 сохранён синхронным поднятием reaper_max_running_s 3600 → 5400 (5400 > 3600+20=3620).
  3. FR-4/NFR-6 (видимость при kill / in-flight) и FR-5 (анти-salvage) — структурно уже выполнены существующим кодом (продвижение гейтится if exit_code == 0; timeout-kill → _finalize_job retry/fail, не advance); зафиксированы регресс-тестами, новых ветвей нет.

Покрытие

  • Новый tests/test_orch109_timeout_model.py (TC-01…TC-12, детерминированный, без сети/CLI) — 25 тестов, зелёные.
  • Обновлены tests/test_config.py (reaper-дефолт 5400) и tests/test_launcher.py (ладдер _resolve_timeout).
  • Полный регресс pytest tests/ — 1898 passed.

Документация (в том же PR)

.env.example (блок agent-timeout + reaper), паспорт config.py, CHANGELOG.md, CLAUDE.md, docs/architecture/README.md + internals.md (per-role бюджеты). Также исправлена дублированная вставка тела записи ORCH-105 в CHANGELOG.md.

AC

AC-1…AC-10 покрыты (см. docs/work-items/ORCH-109/03-acceptance-criteria.md).

ADR: docs/work-items/ORCH-109/06-adr/ADR-001-agent-timeout-budgets-and-launch-model-stamp.md, сквозной docs/architecture/adr/adr-0040-agent-timeout-budgets-and-launch-model-stamp.md.

Refs: ORCH-109

🤖 Generated with Claude Code

## ORCH-109 — timeout budgets + launch-time model telemetry (developer/reviewer) Две аддитивные изолированные правки подсистемы запуска агентов (инцидент **ORCH-104**, runs 658/659/660), **без** касания `STAGE_TRANSITIONS` / `QG_CHECKS` / `check_*` / machine-verdict / схемы БД. ### Что сделано 1. **Launch-стамп модели (D1, FR-1):** резолвенная `resolve_agent_model(...)` пишется в `agent_runs.model` в момент launch объединённым `UPDATE agent_runs SET model=?, effort=? WHERE id=?` рядом со стампом эффорта (ORCH-087) в `launcher._spawn`. Модель присутствует с launch, переживает timeout-kill (`exit_code=-9`), видна in-flight в `GET /metrics`/`GET /queue` и в строке Telegram-карточки. Постфактум `record_usage` (`model=COALESCE(?, model)`) остаётся обогащением. Пустой резолв → `NULL`. never-raise. 2. **Поднятые per-role бюджеты (D3/D4, FR-3):** выделенные ключи `agent_timeout_developer_s=3600` / `agent_timeout_reviewer_s=3000` (env `ORCH_AGENT_TIMEOUT_DEVELOPER_S`/`_REVIEWER_S`). Лестница `_resolve_timeout`: `agent_timeout_overrides_json[agent]` → выделенный ключ роли → `agent_timeout_seconds=1800` (прочие роли — байт-в-байт). Малформный/непозитивный конфиг → дефолт + WARNING (never-break). Инвариант reaper ORCH-065 сохранён синхронным поднятием `reaper_max_running_s` 3600 → **5400** (`5400 > 3600+20=3620`). 3. **FR-4/NFR-6 (видимость при kill / in-flight) и FR-5 (анти-salvage)** — структурно уже выполнены существующим кодом (продвижение гейтится `if exit_code == 0`; timeout-kill → `_finalize_job` retry/fail, не advance); зафиксированы регресс-тестами, новых ветвей нет. ### Покрытие - Новый `tests/test_orch109_timeout_model.py` (TC-01…TC-12, детерминированный, без сети/CLI) — 25 тестов, зелёные. - Обновлены `tests/test_config.py` (reaper-дефолт 5400) и `tests/test_launcher.py` (ладдер `_resolve_timeout`). - Полный регресс `pytest tests/` — 1898 passed. ### Документация (в том же PR) `.env.example` (блок agent-timeout + reaper), паспорт `config.py`, `CHANGELOG.md`, `CLAUDE.md`, `docs/architecture/README.md` + `internals.md` (per-role бюджеты). Также исправлена дублированная вставка тела записи ORCH-105 в `CHANGELOG.md`. ### AC AC-1…AC-10 покрыты (см. `docs/work-items/ORCH-109/03-acceptance-criteria.md`). ADR: `docs/work-items/ORCH-109/06-adr/ADR-001-agent-timeout-budgets-and-launch-model-stamp.md`, сквозной `docs/architecture/adr/adr-0040-agent-timeout-budgets-and-launch-model-stamp.md`. Refs: ORCH-109 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Author
Owner

Адресован единственный P1-finding ревью (12-review.md): README.md раздел «### Watchdog» приведён в соответствие с docs/architecture/internals.md — per-role бюджеты (developer 60м / reviewer 50м / прочие 30м дефолт, _resolve_timeout, ORCH-109) + Tier-3 backstop reaper_max_running_s=90м. CHANGELOG-список доков синхронизирован. Docs-only: src/** не тронут; локально test_system_docs.py/test_config.py/test_launcher.py/test_orch109_timeout_model.py — 104 passed. Commit 91d56fe.

Адресован единственный P1-finding ревью (12-review.md): `README.md` раздел «### Watchdog» приведён в соответствие с `docs/architecture/internals.md` — per-role бюджеты (developer 60м / reviewer 50м / прочие 30м дефолт, `_resolve_timeout`, ORCH-109) + Tier-3 backstop `reaper_max_running_s`=90м. CHANGELOG-список доков синхронизирован. Docs-only: `src/**` не тронут; локально `test_system_docs.py`/`test_config.py`/`test_launcher.py`/`test_orch109_timeout_model.py` — 104 passed. Commit 91d56fe.
admin added 9 commits 2026-06-14 14:26:21 +03:00
Two additive, isolated launch-subsystem fixes from incident ORCH-104, without
touching STAGE_TRANSITIONS / QG_CHECKS / check_* / machine-verdict / DB schema.

D1 — launch-time model stamp: write the resolved model into agent_runs.model in
the SAME UPDATE as the effort stamp (ORCH-087), so the model is present from
launch, survives a timeout-kill (exit_code=-9), and is visible in-flight in
/metrics & /queue. record_usage stays an enrichment (model=COALESCE preserves the
launch stamp when the usage JSON model is None). never-raise (isolated try/except).

D3/D4 — dedicated per-role budgets: agent_timeout_developer_s=3600 /
agent_timeout_reviewer_s=3000 with a deterministic _resolve_timeout ladder
(overrides_json[agent] > dedicated role key > agent_timeout_seconds=1800; other
roles byte-for-byte). Malformed/non-positive config falls back to the global
default + WARNING (never-break). reaper_max_running_s raised 3600 -> 5400 in
lockstep to keep the ORCH-065 invariant (5400 > 3600 + 20 = 3620).

FR-4 (kill / in-flight visibility) and FR-5 (anti-salvage) are structural in the
existing code; pinned here by regression tests (tests/test_orch109_timeout_model.py,
TC-01..TC-12). Docs: .env.example, config passport, CHANGELOG, CLAUDE.md
(README/internals authored by architect in this branch).

Refs: ORCH-109

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
When the ORCH-109 entry was inserted above the ORCH-105 entry, the
ORCH-105 bullet had its body accidentally duplicated (the same
"слайдо-источник …" paragraph appeared twice in one bullet). Restore
the ORCH-105 entry to its canonical single-bodied form (byte-for-byte
identical to origin/main); the legitimate ORCH-109 additions are
untouched.

Refs: ORCH-109

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Front-page README «### Watchdog» по-прежнему утверждал «timeout 30 минут»,
что стало неверным после ORCH-109 (per-role бюджеты: developer 60м /
reviewer 50м / прочие 30м дефолт, `_resolve_timeout`). Приведено в
соответствие с docs/architecture/internals.md + добавлен Tier-3 backstop
reaper_max_running_s=90м. Закрывает P1-finding reviewer (12-review.md).

Docs-only: src/**/STAGE_TRANSITIONS/QG_CHECKS/схема БД не тронуты.

Refs: ORCH-109
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
tester(ET): auto-commit from tester run_id=669
All checks were successful
CI / test (push) Successful in 4m27s
CI / test (pull_request) Successful in 4m8s
8628e609d9
admin force-pushed feature/ORCH-109-orch-timeout-budgets-launch-ti from 781cdd6a6a to 8628e609d9 2026-06-14 14:26:21 +03:00 Compare
admin added 1 commit 2026-06-14 20:10:28 +03:00
reviewer(ET): auto-commit from reviewer run_id=671
All checks were successful
CI / test (push) Successful in 3m39s
CI / test (pull_request) Successful in 4m23s
2028b6cb14
admin added 1 commit 2026-06-14 20:47:31 +03:00
deploy(ORCH-036): finalize SUCCESS for ORCH-109
All checks were successful
CI / test (push) Successful in 3m7s
CI / test (pull_request) Successful in 3m9s
f5c93aa3cc
admin merged commit fc1d3db505 into main 2026-06-14 20:47:32 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: admin/orchestrator#129