Files
orchestrator/docs/work-items/ORCH-090/10-tech-risks.md
claude-bot 269cbde3e3
All checks were successful
CI / test (push) Successful in 30s
architect(ET): auto-commit from architect run_id=497
2026-06-09 20:37:21 +03:00

6.7 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-090 architecture architect proposed 2026-06-09 claude-opus-4-8

10 — Технические риски: ORCH-090 — Механизм отмены задачи (STOP)

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

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

ID Риск Вер. Влия. Митигейшн
TR-1 Отменённая задача клинит очередь репоserial_gate/task_deps считают cancelled «незавершённой» (stage != 'done') → serial-gate блокирует репо, dep-gate вечно держит зависимые. Выс. Выс. Расширить предикат до stage NOT IN ('done','cancelled') во ВСЕХ точках (adr-0026, исчерпывающий список). Тест: после STOP другая задача репо стартует; зависимая разблокируется.
TR-2 Гонка reaper/worker реквью — SIGTERM послан, job ещё running, reaper видит dead-pid → attempts<max → queued (авто-requeue отменённой задачи). Сред. Выс. Источник истины «не оживлять» — tasks.stage='cancelled'. reaper/worker ПЕРЕД реквью сверяют терминал задачи → помечают job cancelled, не реквью'ят. Тест: reaper не возвращает job отменённой задачи в queued.
TR-3 STOP во время merge/deploy → half-merge / порча main / рестарт прода. Низ. Крит. D7: критическое окно (INITIATED-sentinel self-deploy, держание merge-lease) → отложенная отмена; необратимый шаг доводится до честного исхода; STOP никогда не трогает main/force-push/прод-контейнер/detached-процесс. Тест/обоснование fail-safe точки.
TR-4 Коллизия натуральных ключей при повторном «To Analyse» — старая отменённая строка держит plane_id/work_item_id → anti-dup/uniqueness блокируют пере-создание. Сред. Сред. Тумбстон ключей #cancelled-<id> на cancel (D4); plane_issue_id сохранён. Тест: после STOP «To Analyse» создаёт свежую задачу без коллизии.
TR-5 Очистка прогресса в общей прод-БД задевает enduro/другие задачи. Низ. Выс. Все операции строго per-task_id; тумбстон/cancel-jobs гардятся WHERE task_id=?; аддитивные миграции; при stop_status_enabled=False — инертно. Тест: enduro-строки не тронуты.
TR-6 Закрытие дыры релонча ломает легитимный resume аналитика после Needs Input. Сред. Сред. Relaunch ограничивается стадией analysis (единственный владелец Needs-Input, ORCH-066), а не блокируется целиком (D6). Тест: To Analyse на analysis релончит аналитика; на середине пайплайна — no-op.
TR-7 STOP на «Cancelled»-группе без явного статуса STOP — fail-closed stop не в _DEFAULT_STATES может удивить (на доске нет статуса → отмены нет). Низ. Низ. Документировано как fail-safe (07-infra); инфра-предусловие — создать статус STOP (группа cancelled). Наблюдаемость: блок stop в /queue показывает enabled/repos.
TR-8 Дубль-уведомления / повторный kill при повторном STOP. Низ. Низ. Идемпотентность (BR-5/D1): stage in ("done","cancelled") → no-op до любых действий. Тест: повторный STOP не меняет состояние и не шлёт дубль.
TR-9 delete_remote_branch падает / ветка уже удалена / Gitea недоступна. Низ. Низ. never-raise хелпер: ошибка/404 логируется, отмена продолжается; worktree снимается локально независимо; main не трогается.
TR-10 Удаление feature-ветки теряет код, не влитый в main. Низ. Сред. По замыслу: STOP = сброс незавершённого прогресса (BRD §2). docs-артефакты (01..17) сохраняются; ветку можно восстановить в Gitea. Влитый в main код не откатывается (rollback вне объёма).

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

Доминирующий класс — консистентность системного терминал-набора (TR-1, TR-2): введение cancelled как первоклассного терминала обязывает синхронно обновить ВСЕ предикаты «задача завершена», иначе латентный клин очереди. Это покрыто исчерпывающим списком в adr-0026 и маркером ORCH-090. Второй класс — self-hosting safety при STOP во время merge/deploy (TR-3), покрыт отложенной отменой (D7) с жёсткими запретами (main/прод/force-push/kill detached).

Эскалация: решение вводит новое системное терминальное состояние cancelled (новая стадия-сток + новый job-статус + сквозное изменение предиката терминальности) → классифицируется как arch:major-change. Возврат в анализ не требуетсяТЗ полно, OQ-1…OQ-7 разрешены в ADR-001; реализация аддитивна, под kill-switch, с нулевой регрессией при выключенном флаге. Остаточный риск для прод-конвейера (self-hosting) — низкий при условии полного покрытия тестами TR-1/TR-2/TR-3 и обязательного staging-гейта перед прод-деплоем.