8.8 KiB
8.8 KiB
ТЗ — ORCH-074: убрать мёртвый frontmatter model: + валидация имени модели
Work Item ID: ORCH-074
Базируется на: BRD 01-brd.md. Скоп фиксирован решением Славы (08.06):
G1 + G2 + опц. G4. G3 (routing) НЕ включаем. Эффорт НЕ трогать.
1. Задействованные модули src/ и файлы
| Файл | Изменение |
|---|---|
.openclaw/agents/analyst.md |
G1: удалить строку model: claude-sonnet-4-6 из frontmatter |
.openclaw/agents/architect.md |
G1: удалить строку model: claude-opus-4-7 |
.openclaw/agents/developer.md |
G1: удалить строку model: claude-sonnet-4-6 |
.openclaw/agents/reviewer.md |
G1: удалить строку model: claude-opus-4-7 |
.openclaw/agents/tester.md |
G1: удалить строку model: claude-sonnet-4-6 |
.openclaw/agents/deployer.md |
G1: удалить строку model: claude-sonnet-4-6 |
src/agents/launcher.py |
G2: добавить валидацию имени модели в resolve_agent_model (или helper), по образцу VALID_EFFORTS-гарда в resolve_agent_effort |
src/config.py |
G4 (опц.): задать agent_fallback_model (если архитектор решит). При G2 — возможно добавить константу/настройку валидного формата модели |
docs/architecture/README.md |
AC-6: таблица «модель/эффорт по ролям» актуализирована; нет упоминаний sonnet/opus-4-7 как «модели агента» |
.env.example |
AC-3/AC-6: добавить блок ORCH_AGENT_MODEL_* / ORCH_AGENT_EFFORT_* / ORCH_AGENT_FALLBACK_MODEL (сейчас в .env.example их НЕТ) |
CLAUDE.md |
AC-6: при необходимости — отметить, что модель агента берётся ТОЛЬКО из config (frontmatter описательный) |
CHANGELOG.md |
запись о доработке |
tests/test_resolve_agent_model.py |
AC-2: добавить кейсы валидации мусорного имени |
2. G1 — убрать мёртвый frontmatter model:
Удалить только строку model: … из YAML-frontmatter каждого из 6 файлов
.openclaw/agents/*.md. Остальные ключи (name, description, tools/model-comment)
не трогать. frontmatter остаётся валидным YAML и описательным.
Проверка (AC-1):
grep -L "^model:" .openclaw/agents/*.md # должны вернуться ВСЕ 6 файлов
(grep -L печатает файлы БЕЗ совпадения — все 6 не должны содержать ^model:.)
3. G2 — валидация имени модели (never-break)
Требование (НЕ предписывает архитектуру — выбор предиката за архитектором):
- Резолвенное имя модели валидируется ПЕРЕД возвратом из
resolve_agent_model(либо в общем helper). Невалидное имя →logger.warning(...)+ откат на следующий валидный уровень (в пределе —agent_model_default, а если и он невалиден →"", т.е. без флага--model, CLI-дефолт). Никогда не вернуть мусор, который попадёт в--model. - Поведение — точная аналогия
resolve_agent_effort(VALID_EFFORTS): валидный → как есть; невалидный → лог + дроп. - Предикат валидности (на усмотрение архитектора, рекомендация аналитика):
формат-чек
claude-*(forward-compatible — новые версии моделей не требуют правки allowlist) ЛИБО явныйVALID_MODELSallowlist (строже, но требует поддержки при выходе новых моделей). Выбор и обоснование — в ADR. - Рекомендация аналитика (форма): оформить предикат как отдельный
чистый helper (напр.
is_valid_model(name) -> boolрядом сVALID_EFFORTS), а не инлайнить вresolve_agent_model— тогда ОДИН валидатор переиспользуется и резолвом модели, и чтением fallback (G4, см. §4). Финальная форма — за архитектором. - Инвариант обратной совместимости: ВСЕ ныне используемые валидные имена
(
claude-opus-4-8, а также enduro per-project override) проходят валидацию без изменения поведения. Невалидным считается только мусор (опечатка,gpt-4, пустая строка после strip и т.п.). - Контракт уровней резолва ORCH-041 сохраняется: валидация добавляется поверх, механизм приоритетов не меняется.
4. G4 — fallback_model (опционально, решает архитектор)
src/config.py::agent_fallback_modelсейчас""(флаг не прокидывается).- Если архитектор решит включить — задать каноничное имя модели; launcher уже
прокидывает его в
--fallback-model(launcher.py:374-375, попадает в cmd на строке 388). - ⚠️ Код-факт (проверено 08.06): fallback читается НАПРЯМУЮ —
fb = settings.agent_fallback_model(launcher.py:374) — и НЕ проходит черезresolve_agent_model, значит валидация G2, добавленная внутриresolve_agent_model, его НЕ покроет. Следствие для архитектора: если G4 включается, валидацию имени модели (G2) надо применить ТАКЖЕ к fallback на его месте чтения (или вынести валидатор в отдельный helper, который вызывают ОБА: и резолв модели, и чтение fallback). Иначе опечатка вagent_fallback_modelобходит G2 и уезжает в--fallback-model— нарушение never-break. - Если архитектор решит НЕ включать — оставить
"", AC-5 помечается N/A в ADR.
5. Изменения API / схемы БД
- API (HTTP): нет.
- Схема БД: нет миграций.
- CLI-команда агента: формируется в
launcher._spawn(строки 384-392). Меняется только КАЧЕСТВО значения--model(валидное/дроп), сама структура команды не меняется.
6. Требования к QG checks
- Новых QG-чеков НЕ требуется. Валидация — это runtime-гард в launcher, не отдельный quality-gate.
7. Артефакты pipeline
Должны быть созданы/обновлены в ЭТОМ PR (golden source = код + доки):
docs/architecture/README.md— таблица «модель/эффорт по ролям»..env.example— блок переменных моделей/эффорта/fallback.CHANGELOG.md— запись.06-adr/ADR-NNN-*.md— решение по предикату валидации (G2) и по G4 (fallback вкл/выкл).- ADR архитектора фиксирует: выбран вариант G1 «убрать» (не «читать frontmatter»).
8. Эффорт — НЕ ТРОГАТЬ
agent_effort_* корректны (thinking → high, tester/deployer → medium).
Менять только при явном отдельном обосновании (вне скоупа этой задачи).
9. Грабли
- Имена моделей — каноничные строки Claude CLI; сверить с тем, что реально
принимает CLI на проде (
ORCH_CLAUDE_BIN). НЕ хардкодить версию внеconfig.py. - Если frontmatter автогенерится инструментом — убедиться, что
model:не вернётся. - Self-hosting: НЕ ронять прод-контейнер; деплой через «Confirm Deploy».