---
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 скан).
</content>
