diff --git a/docs/work-items/ORCH-074/01-brd.md b/docs/work-items/ORCH-074/01-brd.md index b8add45..e28939c 100644 --- a/docs/work-items/ORCH-074/01-brd.md +++ b/docs/work-items/ORCH-074/01-brd.md @@ -5,6 +5,18 @@ Work Item ID: ORCH-074 Приоритет: **urgent** Тип: доработка механизма выбора модели агентов (self-modifying). +## 0. История ревизий + +- **rev.1 (08.06):** первичный пакет аналитики по фиксированному скоупу Славы. +- **rev.2 (08.06, текущая):** задача возвращена стейкхолдером в In Progress. + Проверены последние комментарии и описание issue в Plane — НОВЫХ субстантивных + ответов/изменений скоупа нет (только bot-комменты + служебный маркер + «Агент перезапущен с ответами стейкхолдера»). Скоуп остаётся прежним + (G1 + G2 + опц. G4; G3 снят; эффорт не трогаем). Пакет переподтверждён против + фактического кода (`launcher.py`, `config.py`); уточнён код-факт по G4: fallback + читается напрямую на `launcher.py:374` мимо `resolve_agent_model`, поэтому + валидация G2 должна покрыть и fallback (детали — ТЗ §4, AC-5, TC-11). + ## 1. Контекст и проблема Каркас выбора модели агентов реализован в ORCH-041 и **работает корректно**: diff --git a/docs/work-items/ORCH-074/02-trz.md b/docs/work-items/ORCH-074/02-trz.md index cf0152d..3287cd0 100644 --- a/docs/work-items/ORCH-074/02-trz.md +++ b/docs/work-items/ORCH-074/02-trz.md @@ -49,6 +49,11 @@ grep -L "^model:" .openclaw/agents/*.md # должны вернуться ВС формат-чек `claude-*` (forward-compatible — новые версии моделей не требуют правки allowlist) ЛИБО явный `VALID_MODELS` allowlist (строже, но требует поддержки при выходе новых моделей). **Выбор и обоснование — в ADR.** +- **Рекомендация аналитика (форма):** оформить предикат как отдельный + чистый helper (напр. `is_valid_model(name) -> bool` рядом с `VALID_EFFORTS`), + а не инлайнить в `resolve_agent_model` — тогда ОДИН валидатор переиспользуется + и резолвом модели, и чтением fallback (G4, см. §4). Финальная форма — за + архитектором. - Инвариант обратной совместимости: ВСЕ ныне используемые валидные имена (`claude-opus-4-8`, а также enduro per-project override) проходят валидацию без изменения поведения. Невалидным считается только мусор (опечатка, @@ -60,8 +65,16 @@ grep -L "^model:" .openclaw/agents/*.md # должны вернуться ВС - `src/config.py::agent_fallback_model` сейчас `""` (флаг не прокидывается). - Если архитектор решит включить — задать каноничное имя модели; launcher уже - прокидывает его в `--fallback-model` (строки 374-375 launcher.py). Имя fallback - ТОЖЕ должно проходить валидацию G2 (или быть гарантированно валидным). + прокидывает его в `--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 / схемы БД diff --git a/docs/work-items/ORCH-074/03-acceptance-criteria.md b/docs/work-items/ORCH-074/03-acceptance-criteria.md index 139d744..e180778 100644 --- a/docs/work-items/ORCH-074/03-acceptance-criteria.md +++ b/docs/work-items/ORCH-074/03-acceptance-criteria.md @@ -41,11 +41,14 @@ Work Item ID: ORCH-074 ## AC-5 — fallback_model (G4, опционально) - **PASS (если G4 включён):** `agent_fallback_model` задан каноничным именем, - проходит валидацию G2, прокидывается в `--fallback-model` (launcher 374-375), - задокументирован. + проходит валидацию 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 задан невалидным именем, ИЛИ включён без документации/ADR. +- **FAIL:** fallback задан невалидным именем, ИЛИ невалидный fallback проходит в + `--fallback-model`, ИЛИ включён без документации/ADR. ## AC-6 — синхронизация документации diff --git a/docs/work-items/ORCH-074/04-test-plan.yaml b/docs/work-items/ORCH-074/04-test-plan.yaml index d1effdb..337746c 100644 --- a/docs/work-items/ORCH-074/04-test-plan.yaml +++ b/docs/work-items/ORCH-074/04-test-plan.yaml @@ -82,6 +82,17 @@ tests: module: tests/test_resolve_agent_model.py expected: PASS + # ---- G4 never-break: fallback читается напрямую (launcher.py:374), мимо + # resolve_agent_model — валидация G2 должна покрыть и его (см. TRZ §4) ---- + - id: TC-11 + type: unit + description: > + ЕСЛИ G4 включён: мусорное agent_fallback_model НЕ попадает в --fallback-model + (валидируется тем же предикатом G2, дропается с warning, never-break). + ЕСЛИ G4 выключен: кейс помечается N/A в test-report (синхронно с ADR). + module: tests/test_resolve_agent_model.py + expected: PASS + # ---- AC-7: общий зелёный прогон / never-break regression ---- - id: TC-10 type: integration