Files
orchestrator/docs/work-items/ORCH-100/10-tech-risks.md

6.2 KiB
Raw Blame History

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).