Files
orchestrator/docs/work-items/ORCH-043/10-tech-risks.md
claude-bot ad1589084b
All checks were successful
CI / test (push) Successful in 14s
architect(ET): auto-commit from architect run_id=183
2026-06-06 17:16:00 +00:00

5.3 KiB
Raw Blame History

10 — Технические риски (ORCH-043)

Merge-gate + auto-rebase + re-test. Риски, их влияние и меры снижения. Привязка к AC.

# Риск Влияние Снижение AC
R-1 Дедлок при max_concurrency=1: блокирующее ожидание merge-lock в advance_stage держит единственный worker-слот, а задаче-холдеру тот же слот нужен для merge. Полная остановка конвейера (self-hosting = все проекты). Acquire неблокирующий; busy → defer (re-enqueue с задержкой, слот освобождается), НЕ блокирующее ожидание. AC-5
R-2 Потерянный PR-merged вебхук → lease не освобождается вовремя. Следующая задача ждёт до тайм-аута. Реклейм lease по возрасту merge_lock_timeout_s; release продублирован в deploy→done и в откатах. AC-5
R-3 Краш сервиса под lease (зависший lease-файл после рестарта). Блокировка merge репо. Файловый lease с реклеймом по возрасту + pid; идемпотентный re-acquire холдером. Restart-safe. AC-5, AC-9
R-4 Долгий re-test (до 600s) держит worker-слот и блокирует прочие задачи. Замедление конвейера. Жёсткий тайм-аут merge_retest_timeout_s + kill; осознанная стоимость re-test-перед-merge. AC-6
R-5 Случайный push/force-push в main из логики гейта. Прямая порча main прод-инструмента. Код гейта НИКОГДА не пушит main; единственная force — --force-with-lease по ветке задачи; покрыто тестом-стражем. AC-7
R-6 Необработанное исключение из гейта всплывает в advance_stage. Падение авто-advance, зависшая задача. Контракт never-raise во всех функциях merge_gate.py и check_branch_mergeable: исключение → (False, reason). AC-9
R-7 Git-операции в общем clone /repos/<repo> вместо worktree → S-4-гонка параллельных задач. Порча рабочих копий, ложные конфликты. Все операции — в worktree ветки (ensure_worktree/get_worktree_path). AC-8
R-8 Defer-петля (lease вечно busy из-за залипшего холдера) → бесконечные перепрогоны staging. Зацикливание, расход токенов/CPU. merge_defer_max_attempts + Telegram-эскалация + блокировка; реклейм lease (R-2/R-3) снимает первопричину. AC-5, AC-11
R-9 rebase --force-with-lease помечает прежний approve ревьюера stale и пересоздаёт head PR. Теоретическая потеря «зелёного» статуса PR. На стадии deploy ревью повторно не проверяется; re-test в гейте — авторитетная проверка. Документировано в ADR. AC-2
R-10 Re-test-команда не подходит чужому репо (раскладка enduro-trails ≠ orchestrator). Ложный красный re-test на не-self-hosting репо. Гейт по умолчанию реален ТОЛЬКО для orchestrator; прочие — no-op; merge_retest_target параметризует цель. AC-12, BR-7
R-11 Дрейф snapshot-реестра при добавлении QG. Красные тесты / расхождение контракта. Обновить _EXPECTED_QGS (+check_branch_mergeable) осознанно; _EXPECTED_TRANSITIONS НЕ менять (стадии не трогаем). AC-10
R-12 Рестарт/падение прод-контейнера orchestrator в рамках задачи. Остановка конвейера всех проектов. Не трогаем .env*/docker-compose.yml/инфру; обязательная страховка deploy-staging (8501). AC-14
R-13 Регресс существующих тестов от изменения advance_stage/gitea.handle_pr. Поломка конвейера. pytest tests/ -q целиком зелёный; изменения аддитивны (новая ветвь на ребре, существующие пути не меняются). AC-15

Остаточные риски (принимаются)

  • Скрытый под-гейт (merge-gate не отражён в STAGE_TRANSITIONS) — плата за минимальный blast-radius; смягчён документацией (README + ADR).
  • Лишний прогон staging при defer — переиспользование очереди вместо нового job-типа.