5.0 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 |
08 — Требования к данным: ORCH-090 — Механизм отмены задачи (STOP)
Work Item: ORCH-090 · Repo: orchestrator · Стадия: architecture
Общая прод-БД (orchestrator + enduro). Все изменения — только аддитивные и идемпотентные (
_ensure_column); существующие таблицы-контракты не переопределяются (NFR-2, AC-9).
Изменения схемы БД
Таблица tasks — аддитивные колонки (через _ensure_column)
| Колонка | Тип | Назначение |
|---|---|---|
cancelled_at |
TEXT |
durable-метка времени отмены (аудит/наблюдаемость). NULL для неотменённых. |
cancel_requested_at |
TEXT |
durable-метка «отмена запрошена, но отложена» (STOP в критическом окне merge/deploy, ADR-001 D7). Снимается при доведении отмены до конца. |
Никаких ALTER существующих колонок. init_db идемпотентен (повторный вызов — no-op).
Без DDL-изменений (расширение допустимых значений TEXT)
jobs.status— добавляется значениеcancelledк наборуqueued|running|done|failed. Колонка ужеTEXT; DDL не меняется.claim_next_jobвыбирает толькоstatus='queued'→cancelledисключён нативно.tasks.stage— добавляется терминальное значениеcancelled(сток, параллельноdone). Колонка ужеTEXT DEFAULT 'created'; DDL не меняется.STAGE_TRANSITIONSexit-гейты рёбер не меняются —cancelledэто терминальное состояние, не новое ребро.
Без изменений
job_deps, agent_runs, repo_freeze, tracker_messages, индексы — контракты нетронуты.
QG_CHECKS / check_* — без изменений.
Новые/изменённые сущности
Тумбстон натуральных ключей отменённой задачи (ADR-001 D4)
На cancel выполняется UPDATE отменённой строки tasks:
plane_id := plane_id || '#cancelled-' || idwork_item_id := work_item_id || '#cancelled-' || idstage := 'cancelled',cancelled_at := datetime('now')plane_issue_id— сохраняется нетронутым (аудит-связь с issue Plane).
Цель: освободить натуральные ключи, чтобы повторный «To Analyse» создал свежую задачу
(get_task_by_plane_id(plane_id) → None; anti-dup create_task_atomic /
ensure_unique_work_item_id не коллизируют), сохранив строку для аудита. Формат суффикса
#cancelled-<id> детерминирован и парсится.
Отмена job'ов (ADR-001 D3)
cancel_jobs_for_task(task_id) — guarded UPDATE
SET status='cancelled', finished_at=datetime('now') WHERE task_id=? AND status IN ('queued','running').
Терминальный исход, нигде не реквью'ящийся.
Совместимость данных / миграции
- Аддитивность/идемпотентность: только
_ensure_column(no-op если колонка есть) и расширение наборов TEXT-значений; деструктивных/несовместимых миграций нет (AC-9). Повторнаяinit_dbпосле рестарта не падает. - Restart-safe (NFR-4): durable терминал =
tasks.stage='cancelled'(уже понимается терминал-скипом реконсилятора, стр. 196). После рестартаrequeue_running_jobsфлипает толькоrunning→ отменённые job'ы (cancelled) не оживают; отменённая задача не реконсилируется. - Влияние на общую прод-БД: изменения строго per-task; enduro не затрагивается, при
stop_status_enabled=Falseили отсутствии отменённых задач — поведение БД 1:1 как сейчас. - Кросс-каттинг (adr-0026): предикат «задача незавершена» в
serial_gate/task_depsрасширяетсяstage != 'done'→stage NOT IN ('done','cancelled'), иначе отменённая задача заклинит очередь репо. Чтение БД (offline hot-path) не приобретает новых сетевых вызовов (NFR-6).