65 lines
4.3 KiB
Markdown
65 lines
4.3 KiB
Markdown
---
|
||
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 и прочие репозитории — вне области по умолчанию, нулевое влияние.
|