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

5.8 KiB
Raw Permalink Blame History

Технические риски — ORCH-087

Зона изменений: src/notifications.py, src/db.py, src/agents/launcher.py, src/usage.py, тесты. Машина стадий и QG не затрагиваются. Контракт компонента — never-raise, карточка silent.

ID Риск Вероятность / Влияние Митигация
R-1 Self-hosting: задача правит инструмент в проде, обслуживающем enduro-trails из общей БД/очереди. Регресс пути нотификаций мог бы испортить наблюдаемость всех проектов. Низк. / Сред. never-raise сохранён по всему пути; обязательный deploy-staging (8501) гейт перед прод-деплоем; нотификации не на критическом пути конвейера (ошибка не валит стадии).
R-2 Telegram 48ч-лимит: сироты старше 48ч неудаляемы → могут остаться навсегда. Сред. / Низк. Документировано как known-limitation (ADR §Последствия, AC-1.4); _DELETE_GONE_MARKERS классифицирует как «gone» → исключает из учёта, не зацикливает ретраи. Касается только сирот ДО деплоя фикса.
R-3 Гонка (d) двух update_task_tracker (queue-worker / reconciler / reaper) → лишняя карточка на один переход. Сред. / Низк. Леджер самозалечивается на следующем bump (ADR Р-2); строго лучше текущего постоянного сиротства; кросс-процессный лок сознательно не вводится (цена > выгоды для silent-карточки).
R-4 Миграция на живой общей прод-БД (SQLite). Неаддитивная правка могла бы тронуть данные enduro. Низк. / Выс. Только CREATE TABLE IF NOT EXISTS / _ensure_column (идемпотентно, no-op при существовании); никаких DROP/ALTER DROP/переименований; логический FK без REFERENCES (не падает на pre-existing БД). TC-09 проверяет идемпотентность.
R-5 BR-G6 / merge-gate: ветка должна жить поверх свежего origin/main (ORCH-86); эрозия reconciler.py затёрла бы terminal-skip/state_uuid-dedup. Низк. / Выс. Подтверждено: origin/main — предок HEAD; 43 маркера ORCH-086 на месте; файлы ORCH-087 НЕ пересекают reconciler.py. CHANGELOG.md под .gitattributes merge=union. Явная проверка merge-gate — TC-19 (AC-6.1/6.2).
R-6 Порог tracker_brd_review_cap_s (дефолт 2ч): легитимный человеческий BRD-review длиннее 2ч отобразится как ~2ч (недо-отчёт). Сред. / Низк. Конфигурируем (env); компромисс в пользу неинтродуцирования аномального застоя в «твоё время». Маркер ~ сигнализирует отсечку. Главная метрика (агенты) остаётся точной.
R-7 Стамп эффорта в _spawn: доп. UPDATE agent_runs сразу после INSERT мог бы упасть и сорвать запуск агента. Низк. / Сред. UPDATE по существующему run_id в уже открытом соединении; в худшем случае effort=NULL → суффикс опускается (рендер не падает, AC-E.4). Эффорт — наблюдаемость, не функциональность запуска.
R-8 Регресс существующих тестов нотификаций (новый формат строки стадии с эффортом + новая done-строка времени). Сред. / Низк. Обновить ожидания в tests/test_notifications*.py; новый формат строго аддитивен (суффикс эффорта/подписи времени). TC-11…TC-15.
R-9 Live-overlay confirm_deploy: новый ключ overlay при отсутствии UUID статуса в проекте мог бы шуметь/падать. Низк. / Низк. overlay never-raise, деградирует на offline-label при отсутствии UUID/ошибке; kill-switch tracker_live_status; без base-alias (реальный отдельный статус).

Острые точки внимания для разработчика

  1. Порядок в bump: зачистка ВСЕХ открытых mid из леджера → send → INSERT+repoint ТОЛЬКО при new_mid is not None (R-3/BR-6). Ровно один send за вызов (R-4).
  2. never-raise: любая ошибка БД-леджера / Telegram внутри update_task_tracker гасится (как сейчас) — конвейер не падает (TC-16, AC-X.2).
  3. Эффорт = фактический флаг: хранить resolve_agent_effort(...) как ушло в --effort (пусто → NULL), а не пересчёт постфактум (CLI не возвращает эффорт).
  4. Не трогать reconciler.py/tests/test_reconciler.py (BR-G6).
  5. Сохранить plane_issue_link (ORCH-067) и disable_web_page_preview (ORCH-080) в payload (TC-17, AC-X.4).