3.0 KiB
08 — Требования к данным / схеме БД — ORCH-053
Work Item ID: ORCH-053
Изменения схемы: НЕТ
Реконсиляция строится исключительно на существующих структурах (по образцу merge-gate ORCH-043 — «без новых колонок»):
| Структура | Использование reconciler |
|---|---|
tasks.stage |
Кандидаты F-1: stage NOT IN ('done'); created/analysis отфильтровываются (нет QG / человеческий гейт). |
tasks.updated_at |
Критерий «застряла»: age(updated_at) ≥ grace_for_stage(stage). update_task_stage уже штампует updated_at → самозатухание повторов. |
tasks.repo, tasks.branch, tasks.work_item_id, tasks.plane_id |
Аргументы advance_stage / резолв задачи. |
jobs (has_active_job_for_task) |
Active-job guard (AC-3): задача с queued/running job не трогается. |
Анти-дребезг (last_reconcile_at): НЕ вводится
На красном гейте reconciler не делает ни advance, ни нотификаций (см. ADR-001 §2),
поэтому спама нет структурно; после успешного advance обновляется updated_at →
повтор невозможен. Дополнительная колонка для дебаунса не нужна.
Идемпотентность создания (анти-дубль, AC-4)
Гонка reconciler↔webhook на создании задачи закрывается process-wide
threading.Lock вокруг SELECT-exists → INSERT (новый хелпер
db.create_task_atomic), без изменения схемы. Гарантия верна для текущей
single-process топологии (один uvicorn на одну БД; staging/prod изолированы) —
тот же допущение, что у очереди queue_worker (ORCH-1).
Будущее упрочнение (вне объёма ORCH-053)
Для multi-process деплоя (uvicorn --workers N) потребуется DB-native гарантия:
частичный UNIQUE-индекс CREATE UNIQUE INDEX ... ON tasks(plane_id) WHERE plane_id IS NOT NULL (паттерн idx_events_delivery) + INSERT OR IGNORE claim. Не вводим
сейчас: миграция может упасть на проде при наличии исторических дублей plane_id
(проверить вживую нельзя); требует отдельной задачи с аудитом данных.
Миграции
Не требуются. Если в будущем понадобится колонка — только идемпотентный
_ensure_column (как все ALTER в src/db.py), безопасный на живой прод-БД.