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