--- work_item: ORCH-019 stage: architecture author_agent: architect status: proposed created_at: 2026-06-10 model_used: claude-opus-4-8 --- # 08 — Требования к данным (Data Requirements): ORCH-019 — Багфикс-трек Work Item: **ORCH-019** · Repo: **orchestrator** · Стадия: architecture > ⚠️ Общая прод-БД (self-hosting + enduro). Только **аддитивные, идемпотентные** миграции; > существующие контракты таблиц не меняются. --- ## 1. Новая колонка `tasks.track` | Атрибут | Значение | |---------|----------| | Таблица | `tasks` | | Колонка | `track` | | Тип | `TEXT` | | DEFAULT | `'full'` | | Допустимые значения | `'full'` (дефолт; ВСЕ существующие и не-баг задачи) \| `'bug'` | | Миграция | `_ensure_column(conn, "tasks", "track", "TEXT DEFAULT 'full'")` (идемпотентно, паттерн `tasks.cancelled_at` ORCH-090) | | Размещение | рядом с `_ensure_column(conn, "tasks", "cancel_requested_at", ...)` в init `src/db.py` | **Семантика:** тип задачи (полный цикл / багфикс). Записывается в `start_pipeline` после успешного `create_task_atomic` (`created=True`) при `is_bug_task==True`. Читается в `advance_stage` для routing-override (D3) — из БД, **никогда** из сети (NFR-4). ## 2. Хелперы доступа (`src/db.py`) | Хелпер | Контракт | |--------|----------| | `set_task_track(task_id: int, track: str) -> None` | `UPDATE tasks SET track=? WHERE id=?`; идемпотентно; never-raise на уровне вызова в `start_pipeline`/escalate | | `get_task_track(task_id: int) -> str` | `SELECT track FROM tasks WHERE id=?`; отсутствие/NULL → `'full'` (fail-safe → полный цикл) | ## 3. Что НЕ меняется - Сигнатура `create_task_atomic(plane_id, work_item_id, repo, branch, stage, title)` — **без изменений** (задача создаётся как `track='full'` по DEFAULT, тип проставляется отдельным `set_task_track`). - Существующие колонки `tasks` (прочие), таблицы `jobs`, `job_deps`, `agent_runs`, `coverage_baseline`, `repo_freeze`, `tracker_messages` — **без изменений**. - `claim_next_job` — **без изменений** (не читает `track`; сеть/маршрут в горячем claim не вводятся). ## 4. Обратная совместимость / откат - Колонка аддитивна с безопасным DEFAULT `'full'` → существующие строки и enduro-задачи ведут себя как сегодня без обратной записи. - Откат фичи (`bug_fast_track_enabled=False`) не требует удаления колонки: при выключенном флаге `track` не влияет на маршрут (`skips_architecture` → `False`). Остаточная колонка безвредна. - Полный revert PR: миграция `_ensure_column` идемпотентна; повторный запуск на БД с уже существующей колонкой — no-op. ## 5. Объём данных / производительность - Одна `TEXT`-колонка на строку `tasks` (низкая кардинальность: 2 значения). Индекс не требуется (чтение по `id` PK в `advance_stage`; агрегат для `GET /queue` — редкий read-only скан).