Files
orchestrator/docs/work-items/ORCH-115/10-tech-risks.md
claude-bot f120e4bd8f
All checks were successful
CI / test (push) Successful in 1m9s
architect(ET): auto-commit from architect run_id=733
2026-06-16 01:37:27 +03:00

6.5 KiB
Raw Blame History

work_item, stage, author_agent, status, created_at, model_used
work_item stage author_agent status created_at model_used
ORCH-115 architecture architect proposed 2026-06-16 claude-opus-4-8

10 — Технические риски: ORCH-115 — детерминированный staging-раннер

Work Item: ORCH-115 · Repo: orchestrator · Стадия: architecture

Информационный (гейтом не парсится). Риски реализации + их митигейшн; нумерация наследует R-1…R-5 из BRD §8 и добавляет производные.

Реестр рисков

ID Риск Вер. Влия. Митигейшн
TR-1 (R-1) Перехват «до _spawn» перехватит не тот джоб (прод-deployer вместо staging) Низ. Выс. Дискриминатор = стадия задачи (tasks.stage=="deploy-staging") И applies(repo), не только имя роли (ADR D1). Для self-hosting прод-ребро deployer не спавнит; для не-self applies==False. Покрытие TC-05/TC-06. should_intercept never-raise → False → штатный _spawn.
TR-2 (R-2) После вердикта не инициирован advance_stage → задача зависает на deploy-staging (нет «финиша агента») Низ. Выс. Раннер сам вызывает advance_stage(current_stage="deploy-staging", finished_agent="deployer") (зеркало run_deploy_finalizer, ADR D7). На исключении джоб → mark_job(failed) → reaper/worker по существующим контрактам; никогда тихий advance. Покрытие TC-07.
TR-3 (R-3) Таймаут/изоляция docker-subprocess; утечка процессов (инцидент ORCH-110) Сред. Сред. proc_group.run_in_process_group (tree-kill SIGTERM→grace→SIGKILL всего дерева), staging_runner_timeout_s; малформ/непозитив → дефолт + WARNING. Покрытие TC-11; запрет сирот согласован с ORCH-110.
TR-4 (R-4) Конфликт с transition-lease (ORCH-114) / serial-gate (ORCH-088) на side-effectful ребре Низ. Выс. Граница O1: lease берётся внутри advance_stage — раннер его не трогает (ADR D7). serial-gate гейтит analyst-job claim, не deployer-job. Код ORCH-112/114 не модифицируется.
TR-5 (R-5) Откат FAILED (developer-retry cap) расходится с LLM-путём Низ. Сред. Реальный ≠0 exit → тот же advance_stage-откат (stage_engine.py:932, тот же cap MAX_DEVELOPER_RETRIES), что у FAILED-вердикта LLM. Покрытие TC-07.
TR-6 Инфра-сбой как код-фейл (docker down / staging недоступен / таймаут → откат + расход developer-retry → петля) — анти-паттерн ORCH-110 Сред. Выс. Двухуровневый исход D5: сюита исполнилась → verdict; tool-error/таймаут → bounded defer (staging_runner_infra_max_retries) → fail-closed FAILED + alert на исчерпании. Не жжёт developer-retry на инфре. Покрытие TC-10.
TR-7 Скоуп-дрейф: случайная правка STAGE_TRANSITIONS/QG_CHECKS/check_*/machine-key/схемы БД Низ. Выс. NFR-1 — замена только продюсера. Анти-дрейф структурный тест TC-09; reviewer ловит ≥P1. Раннер пишет тот же staging_status: key, читается неизменённым _parse_staging_status.
TR-8 Сквозной бюджет времени (reaper_max_running_s) превышен суммой работ на ребре Низ. Сред. Таймаут 600s ≤ прежнего LLM-окна (315 мин) → Σ(работ на ребре) не растёт → инвариант ORCH-065/109/110 сохранён без правки reaper_max_running_s (ADR D9).
TR-9 Рассинхрон карты LLM (llm-call-sites.md/roadmap/policy) с реализацией → красные анти-дрейф-тесты Сред. Сред. Норматив сопровождения NFR-6 (ADR D11): точная спека правок + test_llm_call_site_inventory.py/test_llm_determinization_docs.py обновляются атомарно с кодом в development. Инвариант «ровно один first_slice» держать корректным. Покрытие TC-14.
TR-10 Self-hosting safety: раннер случайно рестартит 8500 / force-push в main / правит инфру Низ. Выс. BR-7/AC-8: argv не содержит запрещённых литералов (TC-12); лог пишется в worktree + push в фичеветку (не main PR-merge, ADR D6); только чтение + staging-сюита (8501).

Сводный вывод

Доминирующий класс — корректность диспетчеризации и обработки инфра-сбоев (TR-1/TR-2/TR-6) на side-effectful ребре общего прод-инстанса (self-hosting). Все сняты опорой на доказанные прецеденты (D1/D2 перехват, run_deploy_finalizer, proc_group, transition-lease внутри advance_stage) и двухуровневым исходом D5, явно адресующим RCA-класс ORCH-110. Изменение аддитивное, never-raise, под kill-switch с байт-в-байт откатом; гейт/ребро/ схема БД неизменны. Остаточный риск для прод-конвейера — низкий.

Эскалация не требуется: это не новая стадия/QG/смена БД (лейбл arch:major-change не ставится), ТЗ удовлетворяется без нарушения принципов (возврат в анализ не нужен). Единственное инфра-предусловие для включения в проде — доступность docker exec в orchestrator-staging (уже выполнено LLM-путём); до включения флага поведение байт-в-байт прежнее.