# 01 — BRD (бизнес-требования): ORCH-076 — ORCH-52c: протокол handoff + frontmatter-контракт (writer/валидатор/схема)

Work Item: **ORCH-076** · Repo: **orchestrator** · Стадия: analysis

## 1. Бизнес-контекст и проблема

Это **слой 2 эпика ORCH-52** (стандартизация документного конвейера). Слой 1 (ORCH-52b /
ORCH-075) уже в `main`: создан **описательный** стандарт `docs/_standards/PIPELINE_DOCS.md`
+ копируемые скелеты `docs/_templates/*`. Стандарт честно фиксирует карту «стадия → агент →
документ → гейт → frontmatter machine-key», но прямо помечен как слой описательный:
«Машинная проверка соответствия шаблонам/frontmatter — отдельная задача ORCH-52c».

Установленные факты (проверено в репо на ветке задачи):

- **`src/frontmatter.py` = ТОЛЬКО reader.** Единственная функция
  `read_frontmatter_value(path, key) -> str | None` (single-key, ~2.6 KB). В docstring
  модуля прямой коммент: *«merging into a single parser is a follow-up task»* — это и есть
  ORCH-52c. Контракт reader — **never raises** (любая ошибка → `None` + `logger.debug`).
- **Протокол вердиктов размазан по отдельным парсерам с дублированной ~10-строчной
  YAML-frontmatter-логикой:**
  - `src/qg/checks.py::check_reviewer_verdict` — читает `verdict:` из `12-review.md`;
  - `src/qg/checks.py::_parse_tests_verdict` — читает `result:`/`verdict:`/`status:` из
    `13-test-report.md` (три равноранговых поля, ORCH-047);
  - `src/qg/checks.py::_parse_deploy_status` — читает `deploy_status:` из `14-deploy-log.md`;
  - `src/qg/checks.py::_parse_staging_status` — читает `staging_status:` из `15-staging-log.md`;
  - `src/security_gate.py::parse_security_status` — читает `security_status:` из `17-security-report.md`;
  - `src/post_deploy.py` — пишет/читает `post_deploy_status:` в `16-post-deploy-log.md`;
  - `src/review_parse.py` — defensive-извлечение прозы (`_strip_frontmatter`).
  Каждый парсер заново реализует `content.startswith("---")` → `split("---", 2)` →
  `yaml.safe_load`. Единого контракта нет → риск рассинхрона (разная обработка ошибок,
  разный набор токенов, разный регистр).
- **Нет формальной спеки handoff:** нигде не зафиксировано «что КАЖДАЯ стадия ОБЯЗАНА
  оставить на выходе» (полный список артефактов + обязательные frontmatter-ключи) как
  единый контракт передачи между стадиями.

**Боль/риск:** без единого контракта чтения вердиктов и без обязательной схемы frontmatter
каждая правка одного парсера может разойтись с остальными; новый агентский документ легко
написать с неверным ключом/регистром (гейт упадёт ложно), а отсутствие машинной проверки
схемы оставляет соблюдение стандарта на ручную дисциплину reviewer'а.

**⚠️ Self-hosting.** Задача меняет КОД, читающий вердикты НА ГЕЙТАХ (review/staging/security/
tester/deploy) в инструменте, который сейчас обслуживает прод (enduro-trails) из общего
инстанса. Любой регресс чтения вердикта = остановка конвейера всех проектов. Поэтому
рефакторинг обязан быть строго обратно совместимым и fail-safe.

## 2. Объём (scope)

### В объёме
- **Спека handoff** в `docs/_standards/` (рядом с `PIPELINE_DOCS.md`): формальный контракт
  «стадия → обязательный выход» (какие документы + какие frontmatter-ключи обязательны на
  выходе каждой стадии), согласованный с манифестом ORCH-52b.
- **Расширение `src/frontmatter.py`:** к существующему reader добавить **writer** (запись
  YAML-frontmatter) и **валидатор** обязательной схемы. Обязательная схема:
  `work_item`, `stage`, `author_agent`, `status`, `created_at`, `model_used`.
- **Единый контракт вердиктов в одном месте** (док + единый frontmatter-API): гейты
  (reviewer→`verdict:`, tester→`result:`, deployer→`deploy_status:`, staging→`staging_status:`,
  security→`security_status:`) читают СТАНДАРТНЫЕ поля через единый frontmatter-API, а не
  через разрознённые ad-hoc парсеры.
- Обновление документации (CLAUDE.md, architecture/README, ADR — глобальный и per-work-item,
  CHANGELOG).

### Вне объёма
- **Правка промптов агентов** (`.openclaw/agents/*.md`), чтобы те эмитили новую полную схему
  — это **ORCH-52d** (слой 3).
- **Ретро-фит старых документов** (дописывание новой схемы в уже существующие work-items).
- Изменение `STAGE_TRANSITIONS` и **состава** `QG_CHECKS` (какие гейты существуют).
- Изменение **семантики** вердиктов (какое значение → какой переход) — только КАК они
  читаются.
- Включение hard-fail валидации схемы по умолчанию (дефолт — warning; hard-fail только под
  явно включённым kill-switch).

## 3. Заинтересованные стороны

- **Заказчик / Owner** — Слава (homenet542): подтверждает BRD (ручной гейт остаётся ручным).
- **Самообслуживаемый инструмент (self-hosting)** — оркестратор правит сам себя; задача —
  первый боевой тест `autoDeploy` (см. примечание ниже).
- **Затрагиваемые роли конвейера** — reviewer / tester / deployer / security-гейт (их
  вердикты теперь читаются через единый API); architect/analyst (новая обязательная схема
  для будущих документов, фактическое внедрение — ORCH-52d).
- **Другие проекты (enduro-trails)** — НЕ должны почувствовать изменений (нулевая регрессия).

## 4. Бизнес-требования (BR)

- **BR-1** — `src/frontmatter.py` предоставляет полный набор операций над YAML-frontmatter:
  **reader** (сохранён без изменения контракта), **writer** (сериализация frontmatter в
  документ), **валидатор** (проверка обязательной схемы).
- **BR-2** — Обязательная схема frontmatter определена и проверяема: поля `work_item`,
  `stage`, `author_agent`, `status`, `created_at`, `model_used`.
- **BR-3** — Создана формальная спека handoff в `docs/_standards/`, согласованная с
  `PIPELINE_DOCS.md`: для каждой стадии указано, какие документы и какие frontmatter-ключи
  она обязана оставить на выходе.
- **BR-4** — Контракт вердиктов сведён в ОДНО место; все пять гейтов-вердиктов
  (review/staging/security/tester/deploy) читают стандартные поля через единый
  frontmatter-API, а не через разрознённые парсеры.
- **BR-5** — Семантика вердиктов неизменна: то же значение → тот же переход/откат, что и
  сейчас (включая трёх-полевой контракт tester'а ORCH-047 и токен-логику BLOCKED/FAILED).

## 5. Нефункциональные требования (NFR)

- **NFR-1 (обратная совместимость, критично self-hosting)** — Существующие документы-вердикты
  БЕЗ новой полной схемы ПРОДОЛЖАЮТ читаться гейтами (fallback на текущее поведение). Старый
  `12/13/14/15/17`-док без `work_item/stage/...` парсится по вердикт-ключу как раньше.
- **NFR-2 (never-raise / fail-safe)** — Ошибка writer'а или валидатора НЕ роняет конвейер
  (тот же контракт, что у reader: любая ошибка → лог + безопасное значение, исключение
  наружу не выходит).
- **NFR-3 (валидатор не self-block)** — Валидатор обязательной схемы НЕ является hard-fail
  на гейте по умолчанию (иначе сама ORCH-52c заблокировала бы себя на собственном деплое,
  т.к. её документы и документы соседей ещё без полной схемы). Дефолт — warning/лог;
  жёсткость — под kill-switch (флаг).
- **NFR-4 (нулевая регрессия для enduro)** — Поведение для не-self-hosting репозиториев и
  всех существующих гейтов остаётся 1:1; полный регресс `tests/` зелёный.
- **NFR-5 (обратимость)** — Поведенческие изменения (если есть, напр. строгая валидация)
  закрываются kill-switch с дефолтом, эквивалентным прежнему поведению.

## 6. Допущения и ограничения

- Frontmatter везде в каноне — ведущий YAML-блок между `---` … `---` (как в `qg/checks.py`
  и `frontmatter.py`).
- Источник истины о поведении гейтов остаётся КОД (`src/stages.py`, `src/qg/checks.py`,
  `src/stage_engine.py`); спека/манифест документируют, а не управляют (правило ORCH-075).
- `model_used` в схеме — это модель, которой документ создан; фактический источник значения
  для агентских доков — резолв `resolve_agent_model` (ORCH-41); проставление в реальные
  документы агентами — ORCH-52d, вне scope.
- `pyyaml` уже зависимость проекта (используется во всех существующих парсерах).
- Реализационные решения (одна функция-парсер vs класс, точная сигнатура writer/валидатора,
  имя модуля контракта вердиктов) — прерогатива архитектора (06-adr), здесь не предрешаются.

## 7. Критерии успеха

Задача успешна, если: `src/frontmatter.py` несёт reader+writer+валидатор обязательной схемы;
спека handoff создана и согласована с `PIPELINE_DOCS.md`; все пять гейтов-вердиктов читают
через единый frontmatter-API; старые доки-вердикты продолжают проходить гейты (анти-регресс);
ошибка writer/валидатора не роняет конвейер, hard-fail валидации под kill-switch (дефолт —
warning); `STAGE_TRANSITIONS` и состав `QG_CHECKS` не изменены, семантика вердиктов неизменна;
документация обновлена; **сама ORCH-52c проходит свои гейты** (включая первый боевой
`autoDeploy`). Детальные PASS/FAIL — `03-acceptance-criteria.md`.

## 8. Риски

- **Регресс чтения вердикта на гейте** → остановка конвейера всех проектов (главный риск
  self-hosting). Митигация — строгая обратная совместимость + полный регресс тестов гейтов.
- **Самоблокировка валидатором** на собственном деплое (документы без полной схемы).
  Митигация — NFR-3 (валидатор не hard-fail по умолчанию).
- **Расхождение спеки handoff с фактом кода** → «лживый» стандарт. Митигация — согласование
  с `PIPELINE_DOCS.md` и явная пометка «источник истины — код».
- **Первый боевой `autoDeploy`** — авто-подтверждение прод-деплоя орка (см. примечание).
  Детали митигации/наблюдения — задача архитектора (`10-tech-risks.md`).

> **Примечание (АВТО-ДЕПЛОЙ).** На этой задаче выставлен лейбл `autoDeploy` (ORCH-089): орк
> САМ подтверждает прод-деплой после зелёного staging + всех тех-гейтов. BRD-гейт остаётся
> ручным (Слава подтверждает BRD). Это первый боевой тест `autoDeploy`.
