6.7 KiB
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-гейта перед прод-деплоем.