--- work_item: ORCH-094 stage: architecture author_agent: architect status: proposed created_at: 2026-06-09 model_used: claude-opus-4-8 --- # 10 — Технические риски: ORCH-094 — terminal-window-aware гард deploy-статусов Work Item: **ORCH-094** · Repo: **orchestrator** · Стадия: architecture Формат: каждый риск — **вероятность × влияние**, причина, **митигейшн**, привязка к AC/ADR-решению. --- ## R-1 — Гард подавляет ЛЕГИТИМНЫЙ `Monitoring` у реально деплоящейся задачи (регресс AC-4) - **Вероятность:** средняя (без точного предиката — высокая) · **Влияние:** высокое. - **Причина:** `update_task_stage("done")` (стр. 369) выполняется **раньше** `set_issue_monitoring` (стр. 404) ⇒ в момент легитимного `Monitoring` задача в БД уже `done`. Наивный гард «stage==done → Done» затёр бы легитимную индикацию. - **Митигейшн:** предикат **«терминал И НЕ активное окно»** (D2 шаг 6) + **перенос арм-блока перед terminal-sync** (D3): `window_active==True` на стр. 404 ⇒ ALLOW. Анти-регресс — **TC-11** (рабочий цикл `Awaiting→Deploying→Monitoring→Done` без подавления) + **TC-03** (stage=deploy проходит). ## R-2 — Фактический актор флаппа — внешняя Plane-automation (вне кода орка) - **Вероятность:** низкая · **Влияние:** среднее (G1 закрыт не полностью). - **Причина:** все 273 перехода — под бот-токеном орка; гипотеза H-внешнее не исключена до инструментальной локализации (FR-1). - **Митигейшн:** гард — **буфер на стороне орка** (BR-2): если PATCH идёт через код орка — гасится; developer локализует актора (FR-1) и фиксирует в ADR/CHANGELOG (BR-7). Если актор реально внешний — это документируется как known-limitation, гард остаётся защитой от внутренних путей. ## R-3 — Перенос арм-блока ломает инвариант ORCH-021/066 - **Вероятность:** низкая · **Влияние:** высокое (self-hosting прод). - **Причина:** правка порядка внутри маркированного блока `next_stage == "done"`. - **Митигейшн:** `arm_monitor` не зависит от Plane-статуса/merge-lease (пишет sentinel + ставит отложенный job); merge-lease release остаётся после terminal-sync; идемпотентность арма по `ARMED` и инвариант ORCH-066 (`deploy→done` self ⇒ `Monitoring`) сохранены (D3). Прочитаны `adr-0010` + `06-adr/ADR-001-plane-status-model`. Тесты TC-06/TC-08 + TC-11. ## R-4 — `never-raise`-деградация маскирует флапп (fail-safe = ALLOW) - **Вероятность:** низкая · **Влияние:** низкое. - **Причина:** при ошибке лукапа стадии / сетевой ошибке гард делает ALLOW (прежнее поведение), что в теории не гасит маятник. - **Митигейшн:** БД-чтение — локальный SQLite (надёжно; ошибка редка); в штатном случае стадия читается ⇒ сходимость работает. Деградация **логируется** `warning` (D5) ⇒ видно в диагностике. NFR-1 приоритезирует «не падать/не блокировать конвейер всех проектов» над агрессивным подавлением. Тест TC-05. ## R-5 — «Зомби»-тик пост-деплой-монитора после рестарта/стейл-job шлёт статус-PATCH - **Вероятность:** низкая · **Влияние:** среднее. - **Причина:** стейл-job `post-deploy-monitor` в очереди после закрытия окна/рестарта мог бы дёрнуть `set_issue_monitoring`. - **Митигейшн:** идемпотентный страж `has_marker(...DONE)` (ранний return без PATCH/реэнкью, ~1729) + тик no-op при `cancelled` мид-окно (D4) + **гард D2** (`window_active==False` ⇒ CONVERGE_DONE). restart-safe (sentinel'ы на диске). Тесты TC-06/TC-07. ## R-6 — Стоимость лукапа `tasks` на каждый deploy-PATCH - **Вероятность:** низкая · **Влияние:** пренебрежимое. - **Причина:** новый SELECT на каждый вызов deploy-сеттера self-репо. - **Митигейшн:** тот же ряд даёт `repo` для `applies`; SQLite-чтение ничтожно против сетевого PATCH; не-self/выключенный флаг → ранний ALLOW. Без кэша (корректность > микро-оптимизация). ## R-7 — Регресс не-self репозиториев (enduro-trails) - **Вероятность:** очень низкая · **Влияние:** среднее. - **Причина:** общий инстанс/БД; правка общих сеттеров `plane_sync`. - **Митигейшн:** `applies(repo)` (D2 шаг 3, `deploy_status_guard_repos=""` → self-hosting only); для не-self deploy-фазовые статусы и так не выставляются (terminal-sync сразу `Done`). Тест TC-12. ## R-8 — Лукап по `work_item_id` не матчит (нет аксессора) - **Вероятность:** низкая · **Влияние:** низкое (деградирует в ALLOW). - **Причина:** `get_task_by_plane_id` матчит UUID-ключи, не человекочитаемый `work_item_id`. - **Митигейшн:** developer добавляет read-only `get_task_by_work_item_id` (D8, без миграции); при промахе — ALLOW (never-raise). Тумбстоны ORCH-090 (`#cancelled-`) не коллизируют с живым рядом. --- ## Сводка по инвариантам (не нарушены) | Инвариант | Статус | |-----------|--------| | `STAGE_TRANSITIONS` / `QG_CHECKS` / `check_*` / machine-verdict ключи | не тронуты (D7) | | Схема БД | без миграции (read-only аксессор) (D7/D8) | | `main` / force-push / прод-контейнер / detached-деплой | не тронуты (D7, NFR-2) | | Рабочий self-deploy (Phase A→B→C, merge-gate, freeze ORCH-088) | 1:1 (D7, AC-4) | | Реконсилятор F-1/F-2 | без изменений (гард субсумирует sync→Done) (D7) | | Обратимость (kill-switch → 1:1) | `ORCH_DEPLOY_STATUS_GUARD_ENABLED` (D6) |