Files
orchestrator/docs/work-items/ORCH-053/08-data-requirements.md

3.0 KiB
Raw Blame History

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), безопасный на живой прод-БД.