9.3 KiB
verdict, work_item, stage, author_agent, status, created_at, model_used, type, work_item_id, version
| verdict | work_item | stage | author_agent | status | created_at | model_used | type | work_item_id | version |
|---|---|---|---|---|---|---|---|---|---|
| APPROVED | ORCH-111 | review | reviewer | approved | 2026-06-15 | claude-opus-4-8 | review | ORCH-111 | 1 |
Review ORCH-111
Summary
PR добавляет в sidecar-watchdog новый opt-in сигнал proc_blocking — алерт на долго живущий
осиротевший тест-процесс (pytest), репарентированный на хост и грузящий CPU (инцидент:
test_install_lite_script.py жил >2 суток без единого алерта, валил merge-gate re-test на ORCH-109).
Изменение строго внутри наблюдателя (watchdog/** + сервис watchdog в docker-compose.yml).
Проверено по всем 4 осям — замечаний уровня P0/P1 нет. Реализация 1:1 соответствует ТЗ и ADR-001
(D1–D7), полный pytest tests/ зелёный (1933 passed), watchdog+key-sync тесты зелёные
(125 passed), src/** байт-в-байт не тронут, конвейерные контракты сохранены, документация
обновлена в том же PR. Вердикт: APPROVED.
Сверка по осям
1. Соответствие ТЗ / Acceptance Criteria — PASS.
- FR-1 (чистый builder
proc_signals, per-entity key("proc_blocking", pid), active ⇔age_s > cfg.proc_age_s, действенный RU-detail: PID + возраст + усечённый cmdline + CPU) — ✓. - FR-2 (коллектор
watchdog/collectors/proc.py, stdlib-only, read-only, never-raise →[], чистый разбор отделён от I/O) — ✓. - FR-3 (4 ключа
WATCHDOG_PROC_*, never-raise парсеры, дефолт-off, гейт наproc_enabled) — ✓. - FR-4 (только наблюдение — нет
os.kill/сигналов/subprocess/чтения/proc/<pid>/environ), подтверждено AST-тестомtest_tc04_collector_source_is_read_only— ✓. - FR-5 (диспетч через существующую
decision.decide()/AlertState; RECOVERY синтезируется без новой анти-спам-логики) — ✓. - FR-6 (без дубля с
agent_hung— по построению: cmdline-скоуп + порог возраста) — ✓. - AC-1…AC-10 покрыты тестами (TC-01 regress-якорь, TC-02 порог/граница, TC-03 конфиг/kill-switch,
TC-04 never-raise/read-only, TC-05 anti-spam→realert→recovery, TC-06 partition vs agent_hung,
TC-07 tick→dispatch + flag-off + never-raise, TC-12 compose
pid: host). - §4 (API): выбран watchdog-side путь,
GET /metrics/schema_versionне тронуты — ✓. - §7 (порог): дефолт
WATCHDOG_PROC_AGE_MIN=60(=3600s) >max(merge_retest_timeout_s=600, coverage_run_timeout_s=900)=900s(4× запас) — кросс-инвариант D2 соблюдён, анти-false-positive — ✓.
2. Соответствие ADR — PASS.
- Реализация соответствует ADR-001 D1 (watchdog-side
/procподpid: host, НЕ orch-side/metrics), D2 (анти-FP/анти-дубль по построению), D3 (коллектор), D4 (builder + синтез RECOVERY), D5 (конфиг дефолт-off), D6 (pid: hostтолько наorchestrator-watchdog), D7 (инварианты конвейера). - Сквозной ADR
docs/architecture/adr/adr-0041-...создан (архитектором, commit1d87ae5). - Трассировка (TRACEABILITY.md): правки
watchdog/{core,signals,config}.pyи сервиса watchdog в compose — аддитивные врезки, маркированные инварианты предшественников (ORCH-100 sidecar, read-only-маунты) не сломаны. Существующий тестtest_host_paths_mounted_read_onlyостаётся зелёным (pid— не volume), плюс добавлен позитивныйtest_watchdog_shares_host_pid_namespace(и проверка, что продorchestratorНЕ получаетpid). - Глобальные инварианты (AC-9):
STAGE_TRANSITIONS/QG_CHECKS/check_*/ machine-verdict / схема БД //metrics+schema_version— байт-в-байт не тронуты (подтверждено:git diffпоsrc/пуст).
3. Качество кода — PASS.
- Docstrings на всех публичных функциях (коллектор/builder/synth) — содержательные, со ссылками на D-решения ADR.
- Тесты содержательные, не тривиальные: red→green regress-якоря (TC-01 builder, TC-07 tick→dispatch
«алерт даже когда ни одна стадия не stuck»), граничные (strict
>), патологическийcommсо скобками/пробелами, гонка «процесс умер mid-scan», AST-скан read-only-контракта, полная последовательность alert→none→realert→recovery→no-repeat. - Регресс-тест дефекта (ORCH-019 BR-4 / усиление): задача эскалирована
escalate: full-cycle(прошлаarchitecture), но как баг несёт явные тест-фиксаторы дефекта — требование выполнено. - Безопасность: read-only, never-raise (per-pid + top-level),
/proc/<pid>/environне читается (секреты), cmdline усечена в алерте (анти-утечка аргументов, R-2). Привилегияpid: host— read-only, только у наблюдателя, обоснована в07-infra-requirements.md.
4. Документация — PASS.
src/**НЕ изменён → жёсткое правило «src изменён, доки нет → P0» не активируется; доки наблюдателя обновлены в том же PR независимо:CHANGELOG.md(детальная запись),docs/architecture/README.md(разделproc_blocking),docs/deployment/LITE_SETUP.md(opt-in блок), ADR work-item06-adr/ADR-001+ сквознойadr-0041,.env.watchdog.example↔ блокWATCHDOG_*.env.example(key-sync тестtest_lite_setup_doc.pyзелёный).- Стадийное владение артефактами соблюдено (rule 3/4): TRZ/AC/test-plan — analyst (
a0218a2), ADR/infra/risks/architecture-README — architect (1d87ae5), код/CHANGELOG/env/compose/LITE_SETUP — developer (6c83191). Ретроактивных правок ТЗ/ADR нет.
Findings
P0 — Blocker
- Нет.
P1 — Must fix
- Нет.
P2 — Should fix
- Нет.
P3 — Nice to have (не блокируют)
- Опечатка в комментарии
watchdog/collectors/proc.py(top-levelexcept): «one signal tih» → «one signal тих» (косметика). - Витрина
docs/overview/(ORCH-011): описывает sidecar-watchdog абстрактно («опрашивает/metrics, шлёт алерты»), каталог сигналов не перечисляет. Новый opt-in (дефолт-off) сигнал абстрактную формулировку не противоречит, машинно-проверяемые факты не меняет (tests/test_system_docs.pyзелёный) → обновление витрины не требуется. Опционально можно упомянуть новую способность наблюдателя (видимость хост-процессов) — не блокирует. - Индекс
docs/architecture/adr/README.mdне содержитadr-0041— но это предсуществующий долг (отсутствуют такжеadr-0038/0039/0040из 3 ранее влитых PR), не свойство этого PR и не per-PR-контракт. Не вменяется ORCH-111.
Документация
Документация обновлена корректно и в полном объёме в том же PR:
CHANGELOG.md— запись[Unreleased]с разбивкой по D-решениям. ✓docs/architecture/README.md— разделproc_blockingв описании sidecar-watchdog. ✓docs/deployment/LITE_SETUP.md— opt-in блок с проверкой (NFR-5). ✓docs/work-items/ORCH-111/06-adr/ADR-001-...+ сквознойdocs/architecture/adr/adr-0041-.... ✓.env.watchdog.example↔.env.example(блокWATCHDOG_*) — синхронизированы, key-sync тест зелёный. ✓
Изменения функционала наблюдателя задокументированы, конвейерные контракты не тронуты, выкат
пересобирает только orchestrator-watchdog (прод orchestrator не рестартится, NFR-3).
Документация = golden source: требование выполнено.