6.2 KiB
work_item, stage, author_agent, status, created_at, model_used
| work_item | stage | author_agent | status | created_at | model_used |
|---|---|---|---|---|---|
| ORCH-100 | architecture | architect | proposed | 2026-06-10 | claude-opus-4-8 |
10 — Технические риски: ORCH-100 — FND/F1b: sidecar-watchdog
Work Item: ORCH-100 · Repo: orchestrator · Стадия: architecture
Информационный (гейтом не парсится). Реестр рисков реализации F1b и митигейшн.
Реестр рисков
| ID | Риск | Вер. | Влия. | Митигейшн |
|---|---|---|---|---|
| TR-1 | Дубль диск-алерта с disk_watchdog (ORCH-063) на одно событие переполнения. |
Сред. | Низ. | ADR-001 D6: 85% остаётся ЕДИНСТВЕННО за disk_watchdog (канал орка); sidecar НЕ дублирует порог — host_disk_crit opt-in (default off) и на другом пороге-потолке (97%, другой канал = другое событие). Структурно один владелец на порог. |
| TR-2 | Ложный orch_down на одиночной сетевой икоте /metrics (флапп). |
Сред. | Сред. | Порог WATCHDOG_ORCH_DOWN_TICKS (K подряд неудачных опросов, дефолт 3) + cooldown/recovery decide() (FR-3). Единичный transient → none. |
| TR-3 | Sidecar толстеет (память на впритык-хосте, 171Mi free) и сам становится проблемой. | Низ. | Сред. | Stdlib-only Python, один поток (D1); mem_limit: 128m + mem_reservation: 32m принудительно (D2); обязательный замер фактического RSS на staging перед прод-выкатом; OOM = ранний сигнал, не тихий рост. |
| TR-4 | Привилегии docker.sock — доступ к Docker API = потенциально мощно. | Низ. | Выс. | Mount :ro (NFR-4) + код делает ТОЛЬКО GET (list/inspect), без docker SDK — мутаций нет по построению; ревью + статпроверка (AC-6/TC-09). |
| TR-5 | Дрейф контракта /metrics (F1a расширили/сломали) роняет/искажает sidecar. |
Низ. | Сред. | Толерантный парсинг (D9): неизвестные ключи игнор, отсутствие опционального не ошибка, рост schema_version → warning не крэш; единый репо контракта (adr-0030); ломающее изменение /metrics — отдельная задача-расширение F1a, не F1b. |
| TR-6 | Шум алертов (флапп на границе порога agent_hung/stage_stuck/mem). | Сред. | Низ. | Чистая decide() с cooldown/realert/recovery (D4, образец disk_watchdog); пороги/cooldown из env (тюнинг без релиза); agent_hung требует 2 опросов + CPU-floor (не дёргается на коротких паузах). |
| TR-7 | Self-hosting: деплой sidecar задел прод-контейнер orchestrator. |
Низ. | Выс. | Отдельный сервис; docker compose up -d orchestrator-watchdog поднимает только его (07 I-3); прод-выкат через staging-гейт (8501); деплой sidecar не рестартит орк. |
| TR-8 | network_mode: host у sidecar — разделяет сетевой namespace хоста. |
Низ. | Низ. | Sidecar read-only, не слушает входящих портов (опц. liveness вне обязательного объёма); host-network нужен для достижимости /metrics и хост-интерфейсов (D2); поверхность минимальна. |
| TR-9 | Утечка/отсутствие WATCHDOG_TG_* (свой бот) → алерты не доходят/секрет в гит. |
Низ. | Сред. | Секреты только в .env* на хосте, канон без значений в .env.example (правило 8); отсутствие токена → fail-safe (лог, не падение, не шлёт); префикс WATCHDOG_ изолирует от ORCH_. |
| TR-10 | C-2: падёт весь хост/Docker → молчит и sidecar (нет внешнего плеча). | Низ. | Выс. | Принятый заказчиком риск (одна площадка); внешнее плечо L2 сознательно отложено (BRD §«Вне объёма»). Документируется, не закрывается в F1b. |
Сводный вывод
Доминирующий класс — операционно-инфраструктурный (привилегии docker.sock, память впритык,
self-hosting-безопасность), а не алгоритмический: ядро (decide/парсинг) — чистые тестируемые функции,
перенос зрелого паттерна disk_watchdog. Все мутирующие пути закрыты по построению (read-only mount +
GET-only, нет записи в БД/main), независимый алерт-канал и kill-switch дают полную обратимость.
Остаточный риск для прод-конвейера (enduro-trails и пр.) — near-zero: F1b физически вне процесса
орка и вне конвейера QG, при выключенном флаге — нулевой эффект.
Эскалация: новый компонент наблюдаемости + новый рантайм-контейнер + новый алерт-канал → лейбл
arch:major-change (консервативно). Возврат в анализ не требуется — ТЗ выполнимо в рамках
принципов (всё в Docker на одном сервере, тонкий стек, минимум зависимостей). Обязательное
предусловие приёмки developer/tester: замер фактического RSS sidecar на staging (TR-3).