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