5.7 KiB
BRD — ORCH-074: фикс модели агентов (мёртвый frontmatter → валидация имени)
Work Item ID: ORCH-074 Эпик: ORCH-052 (слой 3), под-задача ORCH-52a Приоритет: urgent Тип: доработка механизма выбора модели агентов (self-modifying).
1. Контекст и проблема
Каркас выбора модели агентов реализован в ORCH-041 и работает корректно:
src/agents/launcher.py::resolve_agent_model(agent, project_id) резолвит модель
по приоритету project-override → ORCH_AGENT_MODEL_<AGENT> → agent_model_default
→ CLI-дефолт. Все 6 агентов сейчас резолвятся в claude-opus-4-8 (через
agent_model_default).
Аудит кода (08.06) выявил два дефекта данных/валидации (НЕ дефект механизма):
-
P1. Лживый/мёртвый
model:во frontmatter.openclaw/agents/*.md. Все 6 промптов содержатmodel:в YAML-frontmatter:claude-sonnet-4-6(analyst, developer, tester, deployer) иclaude-opus-4-7(architect, reviewer). launcher НЕ читает frontmattermodel:— это мёртвая декларация, которая лжёт о реально используемой модели и нарушает принцип «документация = golden source». Мина: если кто-то «починит» launcher читать frontmatter → все агенты молча упадут на устаревшие модели. -
P2. Нет валидации ИМЕНИ модели. В отличие от effort (есть
VALID_EFFORTS-гард, невалидный effort логируется и дропается), имя модели не валидируется. Опечатка вagent_model_*/ project-override →--model <мусор>→ CLI падает или тихо деградирует. Нарушение принципа never-break.
2. Решение Славы (08.06) — фиксированный скоп
G3 model-routing НЕ включаем — ВСЕ 6 агентов остаются на
claude-opus-4-8. Скоп: G1 (убрать лживыйmodel:из frontmatter) + G2 (валидация имени модели, never-break) + опц. G4 (fallback_model— на усмотрение архитектора, НЕ routing). Эффорт НЕ трогать. AC-4 (routing) снят.
3. Бизнес-цели
| ID | Цель | Драйвер |
|---|---|---|
| G1 | Устранить лживый frontmatter: убрать model: из всех 6 .openclaw/agents/*.md. config — единственный источник правды модели. |
Наблюдаемость (frontmatter не лжёт) |
| G2 | Добавить валидацию имени модели: невалидное имя → лог + откат на default, никогда не передаётся в --model. |
Надёжность (never-break) |
| G4 | (опц., решает архитектор) Задать agent_fallback_model для страховки доступности. |
Надёжность (availability) |
4. Не-цели (явно вне скоупа)
- G3 routing НЕ включаем. Все 6 агентов остаются
claude-opus-4-8. AC-4 снят. - Эффорт НЕ трогать — уже корректно настроен (
thinking → high,tester/deployer → medium). - Не менять resolve-механизм ORCH-041 — он корректен. Меняются только данные (frontmatter, опц. config) + добавляется валидация.
- Не трогать non-self поведение — per-project override (
projects.py agent_models) для enduro-trails остаётся рабочим.
5. Заинтересованные стороны
- Owner (Слава) — зафиксировал скоп; деплой через штатный «Confirm Deploy».
- Агенты оркестратора — потребители resolve-механизма (self-hosting).
- Проект enduro-trails — НЕ должен пострадать (общий инстанс/БД/очередь).
6. Риски и инварианты
- Self-hosting: изменение применяется к БУДУЩИМ запускам агентов. НЕ ломать текущий конвейер; не ронять прод-контейнер. Деплой только через «Confirm Deploy».
- never-break: невалидная модель/эффорт НЕ должны ронять запуск агента — деградация на default/CLI-дефолт + лог.
- frontmatter автогенерация: убедиться, что инструмент (если автогенерит
frontmatter) не вернёт
model:обратно. Frontmatter остаётся описательным (name/description/tools). - enduro per-project override не должен сломаться валидацией (валидные имена проходят без изменения поведения).
7. Бизнес-эффект
- Frontmatter перестаёт лгать → меньше риск «починки», ломающей агентов.
- Опечатка в имени модели больше не роняет/деградирует запуск агента.
- (опц.) fallback повышает доступность при перегрузке основной модели.