4.6 KiB
type, work_item_id, verdict, version
| type | work_item_id | verdict | version |
|---|---|---|---|
| review | ORCH-074 | APPROVED | 1 |
Review ORCH-074
Summary
PR закрывает оба зафиксированных дефекта каркаса выбора модели (ORCH-41) в рамках скоупа G1 + G2 (+ защитный гард точки чтения fallback при выключенном G4), без изменения механизма резолва, API или схемы БД. Реализация точно соответствует ADR-001 и ТЗ; документация синхронизирована в том же PR; все 1012 тестов зелёные. Вердикт — APPROVED, P0/P1 findings нет.
Соответствие ТЗ и AC
- AC-1 (G1):
grep -L "^model:" .openclaw/agents/*.mdвозвращает все 6 файлов; ни одной строки^model:не осталось. frontmatter остаётся валидным YAML (name/description/toolsсохранены) — покрытоtest_agent_frontmatter_no_model.py. - AC-2 (G2 never-break):
resolve_agent_modelвалидирует имя черезis_valid_modelПЕРЕД возвратом, мусорный уровень логируется (logger.warning) и пропускается; при невалидных всех уровнях →""(CLI-дефолт), исключение не бросается. TC-03..05. - AC-3: все 6 агентов резолвятся в
claude-opus-4-8(TC-07), значение в README-таблице и.env.example. - AC-4 (G3): N/A — отказ зафиксирован в ADR.
- AC-5 (G4):
agent_fallback_model=""(выкл); тот же предикат гардит inline-чтение fallback в_spawn(код-факт TRZ §4 учтён) — мусорный fallback дропается. ADR помечает N/A. - AC-6 (доки): README (новая секция «Модель и эффорт по ролям» + валидация),
CLAUDE.md,.env.exampleсинхронизированы; стале-упоминанийclaude-sonnet-4-6/claude-opus-4-7как модели агента в актуальных доках нет (grepпуст). - AC-7:
pytest tests/ -q→ 1012 passed. - AC-8: валидный enduro per-project override проходит без изменения поведения (TC-08).
- AC-9: ADR-001 фиксирует G1 «убрать», предикат G2 (формат-чек vs allowlist с обоснованием), решения по G4 и G3.
Соответствие ADR
Реализация 1:1 с ADR-001: is_valid_model + _MODEL_NAME_RE (^claude-[a-z0-9.-]+$)
рядом с VALID_EFFORTS; один предикат, две точки вызова (резолв модели и чтение
fallback); каскад приоритетов ORCH-41 сохранён (рефакторинг на генератор
_agent_model_candidates с валидацией-со-скипом); версия модели по-прежнему живёт
только в config.py::agent_model_default. Глобальные ADR не нарушены.
Качество кода
is_valid_modelкорректно обрабатываетNone/пустое/whitespace (if not name), никогда не бросает; содержательные docstrings с обоснованием формат-чека.- never-break соблюдён в обеих точках;
if fbshort-circuit сохраняет нулевую регрессию для текущего пустого fallback. - Тесты содержательные: предикат (accept/reject), каскад-скип, граничные кейсы, регрессия per-project override, выключенный G4.
Findings
P0 — Blocker
- нет
P1 — Must fix
- нет
P2 — Should fix
- нет
Документация
Обновлена полностью в этом же PR: docs/architecture/README.md (компонент Agent
Launcher + новая секция «Модель и эффорт по ролям» с таблицей и описанием валидации),
CLAUDE.md (строка про источник модели и валидацию), .env.example (блок
ORCH_AGENT_MODEL_*/ORCH_AGENT_EFFORT_*/ORCH_AGENT_FALLBACK_MODEL),
CHANGELOG.md (запись по задаче), ADR 06-adr/ADR-001-model-name-validation.md.
Требование «изменён src/ → обновлена документация» выполнено.