--- work_item: ORCH-123 stage: architecture author_agent: architect status: proposed created_at: 2026-06-16 model_used: claude-opus-4-8 --- # 10 — Технические риски: ORCH-123 — host-side исполнение staging-раннера Work Item: **ORCH-123** · Repo: **orchestrator** · Стадия: architecture Формат: риск → вероятность/влияние → митигация (привязка к решению ADR-001 / AC). --- ## R-1 — Security: расширение поверхности атаки docker (NFR-3 / AC-9) **Влияние:** критичное (root-эквивалент на общем хосте). **Вероятность (при выбранной стратегии):** низкая. Любой вариант с docker CLI/SDK **в контейнере** поверх смонтированного `docker.sock` (rw + group_add 999, ORCH-040) превращает дремлющую возможность в активный root-эквивалентный путь, доступный worker-коду **и любому subprocess'у** (вкл. LLM-агентов). **Митигация:** выбран **host-side ssh** (ADR-001 D1/D2) — docker-операции на хосте под существующим доверенным key-gated каналом (ORCH-036/058), **без** docker CLI/SDK в контейнере и **без** расширения использования сокета. ORCH-123 поверхность ORCH-040 не трогает. Любой будущий socket/CLI-в-контейнере вариант — отдельный явный security-review. ## R-2 — Реконсилятор/reaper откатывает infra-held задачу как код-фейл (FR-2 / AC-3 / AC-11) **Влияние:** высокое (реинтродукция дефекта ORCH-123). **Вероятность:** средняя (зависит от поведения reconciler ORCH-053 на застрявшем `deploy-staging`). `permanent-env` / исчерпавшая-DEFER задача держится на `deploy-staging` (ADR-001 D4). Если reconciler/ reaper трактует «застрял на deploy-staging без running-job» как повод откатить на `development` — дефект вернётся. **Митигация:** developer **обязан** верифицировать, что reconciler/reaper трактует infra-held deploy-staging-задачу как **удержанную** (пере-выдать `deployer`-джоб для re-drive после починки окружения), а **не** откатывает в `development`. Регресс-покрытие — поведенческий тест на «held не становится rollback». Наблюдаемость (D8) делает held видимым (alert + `GET /queue` + лог). ## R-3 — Over-tolerance: реальный код-фейл сюиты замаскирован как «инфра» (BR-3 / AC-4) **Влияние:** высокое (сломанный код проходит staging-гейт). **Вероятность:** низкая. Трёхсторонняя классификация (D3) может ошибочно отнести реальный `exit≠0` сюиты к `permanent-env`/`transient-infra` (→ нет отката) при коллизии exit-кодов (`docker exec` No such container = 1, и `staging_check` fail = 1). **Митигация (D3):** дизамбигуация по **скану stderr на env-маркеры**, не по голому exit-коду: распознанный suite-exit **без** env-маркера всегда `suite-ran` (никогда не реклассифицируется в инфру — зеркало ORCH-110 BR-6). Fail-safe default при неоднозначности → `transient-infra` (DEFER), не тихий проход. Маркер-сет покрыт TC-06; reviewer проверяет анти-over-tolerance (≥P1, как ORCH-110). ## R-4 — Remote tree-kill: удалённое `docker exec`-дерево переживает таймаут (NFR-5) **Влияние:** среднее (осиротевший pytest на хосте — класс ORCH-109/110). **Вероятность:** низкая. `proc_group` tree-kill убивает **локальный** ssh-клиент при таймауте, но не гарантирует убийство удалённого `docker exec`-дерева на хосте (процессы — дети docker-демона, не ssh-сессии). **Митигация:** backstop — bounded таймаут внутри самой `staging_check.py`; это **то же** принятое допущение, что у `image_freshness.rebuild_staging_image` (синхронный ssh без remote tree-kill). Документируется как known-limitation (ADR-001 D-Последствия); не блокер. ## R-5 — Held-задача клинит serial-gate репо (NFR-5 / AC-11) **Влияние:** среднее (более поздние задачи репо ждут). **Вероятность:** средняя (при реальном environment-сбое). infra-HOLD держит задачу на `deploy-staging` → ORCH-088 serial-gate блокирует **более поздние** задачи того же репо до снятия. **Митигация:** принятый tradeoff (зеркало ORCH-110 infra-HOLD): environment-проблема, требующая оператора, **должна** остановить репо, а не молча ложно-откатывать (что было бы хуже — порча done-критериев + расход developer-retry). Скоуп **self-hosting only** (enduro не затронут). Громкий alert «инфра, НЕ дефект кода» (D8) → быстрая операторская реакция; `GET /queue` показывает held. ## R-6 — ssh-target не сконфигурирован / пустой `deploy_ssh_host` (FR-1 / D6) **Влияние:** среднее. **Вероятность:** низкая (в проде `ORCH_DEPLOY_SSH_HOST=127.0.0.1` задан compose). Config-дефолт `deploy_ssh_host=""`; на нестандартном хосте host-side стратегия без ssh-target неработоспособна. **Митигация:** пустой ssh-target → классификация `permanent-env` (D3) → infra-HOLD + alert (никогда ложный откат); preflight на старте (D5) ловит это до реальной задачи. `applies(repo)` self-hosting-only → прочие репо не затронуты. ## R-7 — Кросс-каттинг: правка маркированных блоков (CLAUDE.md §9 / ORCH-078) **Влияние:** среднее. **Вероятность:** низкая. Затрагиваются блоки с маркерами ORCH-115 (staging_runner, прямой объект), ORCH-036 (`self_deploy` ssh), ORCH-058 (`image_freshness` host-side docker), ORCH-110 (`proc_group`/infra-tolerance/classify), ORCH-101 (host-параметризация), ORCH-040 (docker.sock mount), ORCH-114 (transition-lease граница). **Митигация:** developer **перед** изменением сверяет инварианты с их `06-adr/` (CLAUDE.md §9). Блок с ≥3 маркерами агрегируется **сводным сквозным ADR** `adr-0049` (ADR-001 Сквозная регистрация). Не ломать: один транспорт LLM `_spawn` (`llm-usage-policy.md` §5), `STAGE_TRANSITIONS`/`QG_CHECKS`/ machine-verdict (NFR-1), transition-lease берётся внутри `advance_stage` (граница O1), INV-4 (мерж только через PR-merge, никогда push в `main`). ## R-8 — Регрессия конвейера / гейта (NFR-1 / AC-7) **Влияние:** критичное. **Вероятность:** очень низкая. Случайное изменение `check_staging_status`/`_parse_staging_status`/`staging_status:`/`STAGE_TRANSITIONS`/ схемы БД. **Митигация:** фикс — замена **стратегии исполнения продюсера**, не гейта (зеркало ORCH-115 NFR-1). Структурный анти-регресс-тест (TC-11) держит имена/семантику/ключи байт-в-байт; миграции БД нет (restart-safe DEFER-счётчик — маркер в `task_content`, TRZ §5). Анти-дрейф ORCH-115 (TC-14) зелёный.