5.3 KiB
5.3 KiB
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-типа.