7.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-063 | review | reviewer | approved | 2026-06-09 | claude-opus-4-8 | review | ORCH-063 | 1 |
Review ORCH-063 — INFRA: disk-watchdog мониторинг диска mva154 + алерт при ≥85%
Машинный вердикт читается ТОЛЬКО из
verdict:во frontmatter.APPROVED→ дальше по конвейеру.
Summary
PR реализует disk-watchdog — фоновый daemon-поток src/disk_watchdog.py по канону
reconciler/job_reaper, точно по ТЗ 02-trz.md и ADR-001/adr-0024. Все 9 критериев приёмки
(03-acceptance-criteria.md AC-1..AC-9) выполнены и покрыты содержательными тестами
(tests/test_disk_watchdog.py, TC-01..TC-12, 18 кейсов). Полный регресс зелёный: 1296 passed.
Инварианты соблюдены: STAGE_TRANSITIONS/QG_CHECKS/check_*/схема БД — не тронуты (проверено
git diff — src/stages.py/src/stage_engine.py/src/qg/ без изменений), миграций нет. Документация
обновлена как golden source в том же work-item. Блокеров (P0/P1) нет → APPROVED.
Оси проверки
1. Соответствие ТЗ / Acceptance Criteria
- AC-1 (heartbeat-демон):
DiskWatchdog(threading.Thread(daemon=True) + threading.Event),_stop.wait(interval)(чистый stop, без блокирующегоtime.sleep), контрактstart()/stop(timeout)/status(). Старт вmain.lifespanпослеreaper.start(), стоп первым вfinally(reverse) —src/main.py. ✓ - AC-2 (алерт ≥ порога):
format_alert_messageнесёт host/путь/used_pct/свободно (ГБ+%)/порог; отправкаsend_telegram(..., disable_notification=False)— notifying. Подтверждено TC-08. ✓ - AC-3 (анти-спам): чистая
decide_action(used_pct, threshold, prev, now, realert_s), cooldowndisk_monitor_realert_s, время инъецируетсяnow_provider. TC-02/TC-03 + e2e. ✓ - AC-4 (recovery): переход «выше→ниже» → ровно одно recovery-сообщение + сброс
alerting; ниже порога молчит. TC-04 + e2e (test_tick_antispam_then_realert_then_recovery). ✓ - AC-5 (config + kill-switch): 5 флагов
disk_monitor_*(envORCH_DISK_MONITOR_*,env_prefix=ORCH_)- defensive-валидаторы (порог 1..100, интервалы > 0 → дефолт + warning).
enabled=False→start()no-op (TC-09),.env.exampleобновлён. ✓
- defensive-валидаторы (порог 1..100, интервалы > 0 → дефолт + warning).
- AC-6 (never-raise): три уровня — per-path (
_measure_one), per-tick (_runouter try/except), per-send (_send). TC-07 (битый путь / падениеsend_telegram). ✓ - AC-7 (наблюдаемость): аддитивный блок
disk_monitorвGET /queue;status()never-raise (минимум{"enabled": …}при ошибке). TC-11 проверяет сохранность всех существующих ключей. ✓ - AC-8 (источник = хост-ФС): дефолт
/repos,/app/dataчерезshutil.disk_usage, не overlay/, не субпроцессdf; дедуп поst_dev. TC-06. ✓ - AC-9 (документация): см. секцию «Документация». ✓
2. Соответствие ADR / инвариантам
- Реализация 1:1 с ADR-001 D1–D8: stdlib-замер (D1), дедуп
st_devfail-open (D2), puredecide_action+ in-memory state (D3), прямойsend_telegramбез helper (D4), один порог 85% (D5), lifecycle/врезки (D6), config (D7), инварианты (D8). Сквознойadr-0024зарегистрирован в рядуreconciler/job_reaper. - Трассировка: врезки в
main.lifespanи@app.get("/queue")— строго аддитивные (новый импорт + один вызовdisk_watchdog.start()/stop()+ ключ"disk_monitor"); зафиксированные инварианты соседних маркеров не сломаны.STAGE_TRANSITIONS/QG_CHECKSне затронуты — подтверждено.
3. Качество кода
- Docstrings на всех публичных функциях/классе; чистая leaf-логика отделена от потока (тестируемо).
- Defensive-граничные случаи покрыты:
total == 0→0.0, пустой CSV → дефолт,os.statfail → fail-open. - Тесты содержательные (не тривиальные): юнит-решения, измерение/дедуп, e2e цикл alert→silent→realert→
recovery, интеграция
/queue. Полный suite зелёный (1296).
4. Документация (golden source)
docs/architecture/README.md— компонент «Disk-watchdog» + описание блока/queue. ✓docs/operations/INFRA.md— что мониторится / порог / как отключить / реакция на алерт. ✓.env.example— 5 дескрипторовORCH_DISK_MONITOR_*. ✓CHANGELOG.md— записьfeat:. ✓docs/work-items/ORCH-063/06-adr/ADR-001-disk-watchdog.md+ сквознойadr-0024. ✓src/изменён → документация обновлена в том же work-item. Ось пройдена.
Findings
P0 — Blocker
- (нет)
P1 — Must fix
- (нет)
P2 — Should fix
- (нет)
P3 — Nice-to-have
- Косметика: хвостовые артефакты тул-обёртки
</content>/</invoke>, протёкшие в текст golden-source доков, авторизованных на стадии architecture (НЕ в developer-коммите):06-adr/ADR-001-disk-watchdog.md(строки 195–196),docs/architecture/adr/adr-0024-disk-watchdog.md(стр. 59),07-infra-requirements.md(стр. 63),10-tech-risks.md(стр. 39). На парсинг frontmatter/QG не влияют (находятся в конце файла), функциональность не затрагивают — поэтому P3. Рекомендуется зачистить при следующем касании этих доков (правка чужой стадии — по согласованию, CLAUDE.md §3). Не блокирует вердикт.
Документация
Обновлена полностью в том же work-item: architecture/README.md (компонент + блок /queue),
operations/INFRA.md (мониторинг/порог/отключение/реакция), .env.example (новые ORCH_DISK_*),
CHANGELOG.md (feat:), задачный ADR-001 + сквозной adr-0024. Обзорная витрина (README «Известные
ограничения») этим PR не затрагивается. Ось документации пройдена — оснований для REQUEST_CHANGES нет.