4.7 KiB
4.7 KiB
work_item, stage, author_agent, status, created_at, model_used
| work_item | stage | author_agent | status | created_at | model_used |
|---|---|---|---|---|---|
| ORCH-027 | architecture | architect | proposed | 2026-06-10 | claude-opus-4-8 |
08 — Требования к данным: ORCH-027 — Code coverage как гейт
Work Item: ORCH-027 · Repo: orchestrator · Стадия: architecture
When-applicable / информационный (гейтом не парсится). Затрагивается схема БД — вводится одна аддитивная таблица базовой линии покрытия. Существующие таблицы не мигрируются.
Изменения схемы БД
Новая аддитивная таблица coverage_baseline (паттерн repo_freeze/job_deps —
CREATE TABLE IF NOT EXISTS в init_db, src/db.py; без ALTER/миграции существующих):
CREATE TABLE IF NOT EXISTS coverage_baseline (
repo TEXT PRIMARY KEY, -- репозиторий (напр. "orchestrator")
coverage REAL NOT NULL, -- last-known базовая линия покрытия main (%, line coverage)
source_sha TEXT, -- SHA main, на котором зафиксирована базовая линия (аудит)
updated_at TEXT NOT NULL -- ISO-таймстамп последнего ratchet/bootstrap
);
Доступ — через аддитивные read-only/мутирующие хелперы src/db.py:
get_coverage_baseline(repo) -> float | None(None ⇒ bootstrap-режим, базовой линии ещё нет);ratchet_coverage_baseline(repo, coverage, sha) -> bool— атомарный compare-and-set:INSERTпри отсутствии строки; иначеUPDATE ... SET coverage=?, source_sha=?, updated_at=? WHERE repo=? AND coverage <= ?(базовая линия никогда не понижается);set_coverage_baseline(repo, coverage, sha)— безусловная установка (ручной override D8 /POST /coverage/baseline).
Новые/изменённые сущности
coverage_baseline— одна строка на репозиторий; keyed byrepo. Инвариант:coverageмонотонно не убывает черезratchet_coverage_baseline(толькоset_coverage_baseline/ручной override может понизить — легитимный разовый случай, D8). На общей прод-БД (self-hosting) строки разных репозиториев изолированы первичным ключом.- Артефакт
18-coverage-report.md— НЕ БД-сущность: файл вdocs/work-items/<id>/, несёт frontmattercoverage_status: PASS|FAIL+measured_coverage/baseline/floor/policy/delta. Source of truth измеренного значения для ratchet (D5).
Существующие таблицы (tasks, jobs, job_deps, repo_freeze, agent_runs,
tracker_messages, …) — не изменяются (NFR-5/AC-8).
Совместимость данных / миграции
- Аддитивность: только
CREATE TABLE IF NOT EXISTS— ни один существующий столбец/таблица не трогается; миграции существующих данных нет. - Идемпотентность:
CREATE TABLE IF NOT EXISTSбезопасен при повторном старте; bootstrap (первыйINSERT) выполняется один раз на репозиторий. - Restart-safe: базовая линия персистентна; in-flight измерение при рестарте переигрывается штатным механизмом стадии (idempotent — гейт пересчитает вердикт, ratchet — атомарный compare-and-set, повтор не понизит и не задвоит).
- Атомарность / анти-гонка: ratchet — единичный SQL
UPDATE ... WHERE coverage <= ?(илиINSERT), выполняется под held merge-lease (ORCH-043, per-repo сериализация merge) → двойная защита от параллельных слияний. - Влияние на общую прод-БД: одна маленькая таблица (≤ числа репозиториев строк); нулевой
риск для enduro-trails и прочих проектов (строки изолированы по
repo, гейт для них no-op). - При
coverage_gate_enabled=Falseтаблица может существовать пустой/инертной — нулевая регрессия.