# Критерии приёмки — ORCH-074

Work Item ID: ORCH-074
Скоп (Слава 08.06): G1 + G2 + опц. G4. **G3 routing снят — AC-4 не применяется.**

Каждый критерий: чёткое условие PASS/FAIL.

---

## AC-1 — frontmatter `model:` убран из всех 6 промптов (G1)

- **PASS:** ни один файл `.openclaw/agents/*.md` не содержит строки `^model:` в
  frontmatter. Команда `grep -L "^model:" .openclaw/agents/*.md` возвращает все 6
  файлов (analyst, architect, developer, reviewer, tester, deployer).
- **FAIL:** хотя бы в одном файле осталась строка `model:`.
- Доп. инвариант: frontmatter остаётся валидным YAML; ключи `name`/`description`/`tools`
  сохранены.

## AC-2 — валидация имени модели, never-break (G2)

- **PASS:** при невалидном `agent_model_*` / project-override (мусорное имя)
  `resolve_agent_model` возвращает откат на default (или `""`), пишет
  `logger.warning`, и мусор **никогда** не попадает в `--model`. Покрыто
  unit-тестом с мусорным именем (см. `04-test-plan.yaml`, TC-03..TC-05).
- **FAIL:** мусорное имя проходит насквозь в `--model`, или валидация роняет
  запуск агента (исключение вместо graceful-деградации).

## AC-3 — resolve_agent_model осмыслен для всех 6 агентов

- **PASS:** для каждого из 6 агентов `resolve_agent_model(agent)` (без
  project_id) возвращает `claude-opus-4-8` (routing G3 выключен → intelligence-
  модель для всех). Значение документировано в README (таблица env) и `.env.example`.
- **FAIL:** хотя бы один агент резолвится в пустую/невалидную/устаревшую модель,
  либо документация не отражает фактическую модель.

## AC-4 — routing (G3) — **СНЯТ (N/A)**

- Routing НЕ включается в этой задаче. Критерий не применяется. ADR фиксирует
  отказ от G3 как осознанное решение Славы (08.06).

## AC-5 — fallback_model (G4, опционально)

- **PASS (если G4 включён):** `agent_fallback_model` задан каноничным именем,
  проходит валидацию G2, прокидывается в `--fallback-model` (launcher 374-375).
  Доп. инвариант never-break: МУСОРНЫЙ fallback НЕ попадает в `--fallback-model`
  (валидируется тем же предикатом G2; учтено, что fallback читается напрямую на
  `launcher.py:374`, минуя `resolve_agent_model` — см. TRZ §4). Задокументирован.
- **PASS (если G4 НЕ включён):** `agent_fallback_model = ""`, ADR явно фиксирует
  отказ; AC-5 помечен N/A.
- **FAIL:** fallback задан невалидным именем, ИЛИ невалидный fallback проходит в
  `--fallback-model`, ИЛИ включён без документации/ADR.

## AC-6 — синхронизация документации

- **PASS:** `docs/architecture/README.md`, `CLAUDE.md`, `.env.example`
  синхронизированы — таблица «модель по ролям» актуальна (все = `claude-opus-4-8`);
  НЕТ упоминаний `claude-sonnet-4-6` / `claude-opus-4-7` как «модели агента»
  (если они не используются). `.env.example` содержит блок
  `ORCH_AGENT_MODEL_*` / `ORCH_AGENT_EFFORT_*` / `ORCH_AGENT_FALLBACK_MODEL`.
- **FAIL:** документация противоречит config, или остались мёртвые упоминания
  sonnet/opus-4-7 как модели агента.

## AC-7 — pytest зелёный + never-break

- **PASS:** `pytest tests/ -q` зелёный. Невалидная модель/эффорт НЕ роняет запуск
  агента (graceful-деградация подтверждена тестами).
- **FAIL:** падают тесты, или невалидный вход роняет запуск.

## AC-8 — enduro per-project override не сломан

- **PASS:** валидный per-project override (`projects.py agent_models`) для не-self
  проекта (enduro) резолвится и проходит валидацию без изменения поведения
  (покрыто существующими тестами `test_resolve_agent_model.py`).
- **FAIL:** валидация ломает корректный per-project override.

## AC-9 — ADR зафиксирован

- **PASS:** ADR в `06-adr/` фиксирует: (а) выбран вариант G1 «убрать frontmatter»
  (не «читать»); (б) предикат валидации G2 (формат-чек vs allowlist) с обоснованием;
  (в) решение по G4 (вкл/выкл) и по отказу от G3.
- **FAIL:** ADR отсутствует или не покрывает эти решения.
