---
work_item: ORCH-027
stage: architecture
author_agent: architect
status: proposed
created_at: 2026-06-10
model_used: claude-opus-4-8
---

# 07 — Инфраструктурные требования: ORCH-027 — Code coverage как гейт

Work Item: **ORCH-027** · Repo: **orchestrator** · Стадия: architecture

> When-applicable. Топология **не меняется** (всё в существующем Docker-контейнере на одном
> сервере mva154, SQLite, собственная очередь). Затрагивается только зависимостный и
> конфигурационный слой.

## Топология / окружение

- **Без изменений топологии** — никаких новых контейнеров/сервисов/нод. Гейт исполняется внутри
  существующего процесса оркестратора, измерение — в per-branch worktree (`ensure_worktree`),
  как merge-gate re-test. `docs/operations/INFRA.md` — без правок.
- **Self-hosting безопасность (NFR-3):** гейт не вызывает деплой-хук, не рестартит прод-контейнер
  `orchestrator` (8500), не пушит в `main`. Прод-деплой ORCH-027 — **только** через
  staging-гейт (8501) → выделенный статус «Confirm Deploy» (ORCH-059), без рестарта прод
  случайным approve.

## Зависимости

| Зависимость | Где | Назначение |
|-------------|-----|-----------|
| `pytest-cov` (обёртка `coverage.py`) | `requirements.txt` | измерение line coverage прогоном `pytest --cov=src --cov-report=json`. Offline (сеть при измерении не нужна). Попадает в прод-образ при пересборке. |

- Версия фиксируется совместимой с текущим `pytest` (см. `requirements.txt`/`pytest.ini`).
- Новых системных пакетов в `Dockerfile` не требуется (чистый pip-пакет).

## Конфигурация (env, `.env` на хосте)

Новые флаги (`config.py`, префикс `ORCH_COVERAGE_*`; дефолты безопасны — нулевая регрессия):

| Env | Дефолт | Назначение |
|-----|--------|-----------|
| `ORCH_COVERAGE_GATE_ENABLED` | `false` (раскат поэтапный) | kill-switch |
| `ORCH_COVERAGE_GATE_REPOS` | пусто → только self-hosting | CSV область применения |
| `ORCH_COVERAGE_MIN_PERCENT` | консервативно (напр. backstop) | абсолютный порог-floor |
| `ORCH_COVERAGE_POLICY` | `both` | `absolute\|baseline\|both` |
| `ORCH_COVERAGE_EPSILON` | малый (напр. `0.5`) | допуск на шум измерения |
| `ORCH_COVERAGE_TOOL_FAIL_CLOSED` | `false` | поведение при сбое инструмента |
| `ORCH_COVERAGE_RUN_TIMEOUT_S` | по образцу `merge_retest_timeout_s` | тайм-аут прогона |

## Эксплуатационные предусловия

- **Bootstrap базовой линии:** при первом merge применимого репо базовая линия `main`
  засевается автоматически фактическим измеренным покрытием (D5). Ручной первичный замер не
  обязателен; при необходимости — `POST /coverage/baseline?repo=orchestrator&value=<%>` (D8).
- **Раскат:** включать `ORCH_COVERAGE_GATE_ENABLED=true` только после прод-деплоя кода и
  прогона на staging (8501); стартовая область — только `orchestrator`.
- **Override (легитимное снижение покрытия):** `POST /coverage/baseline` (по образцу
  `POST /serial-gate/unfreeze`) либо временный `ORCH_COVERAGE_POLICY=absolute`.

## Секреты / сеть

- Новых секретов нет. Сетевого доступа при измерении нет (coverage offline).
- enduro-trails и прочие репозитории — вне области по умолчанию, нулевое влияние.
