work_item: ORCH-074 # Скоп (Слава 08.06): G1 + G2 + опц. G4. G3 routing снят (no routing tests). # Эффорт не трогаем (no new effort tests beyond never-break regression). tests: # ---- G1: frontmatter `model:` убран из всех 6 промптов (AC-1) ---- - id: TC-01 type: integration description: > Ни один .openclaw/agents/*.md не содержит строки `^model:` во frontmatter. Тест итерирует по 6 файлам, ассертит отсутствие model:-строки. module: tests/test_agent_frontmatter_no_model.py expected: PASS - id: TC-02 type: integration description: > frontmatter каждого из 6 промптов остаётся валидным YAML и сохраняет ключи name/description (парсинг между первыми двумя '---' без ошибок). module: tests/test_agent_frontmatter_no_model.py expected: PASS # ---- G2: валидация имени модели, never-break (AC-2, AC-7) ---- - id: TC-03 type: unit description: > Мусорное имя в agent_model_ (напр. 'gpt-4' или 'claud-opus-typo') -> resolve_agent_model откатывается на default (claude-opus-4-8) и НЕ возвращает мусор. Проверяется также warning в логах (caplog). module: tests/test_resolve_agent_model.py expected: PASS - id: TC-04 type: unit description: > Мусорное имя в project-override (agent_models) -> resolve_agent_model откатывается на следующий валидный уровень (default), мусор не передаётся. module: tests/test_resolve_agent_model.py expected: PASS - id: TC-05 type: unit description: > Невалиден И override, И default -> resolve_agent_model возвращает "" (без флага --model, CLI-дефолт). never-break: исключение НЕ бросается. module: tests/test_resolve_agent_model.py expected: PASS - id: TC-06 type: unit description: > Валидное каноничное имя (claude-opus-4-8) проходит валидацию без изменения: resolve_agent_model('developer') == 'claude-opus-4-8'. Регрессия ORCH-041. module: tests/test_resolve_agent_model.py expected: PASS # ---- AC-3: все 6 агентов резолвятся в осмысленную модель ---- - id: TC-07 type: unit description: > Для всех 6 агентов (analyst/architect/developer/reviewer/tester/deployer) resolve_agent_model(agent) == 'claude-opus-4-8' (routing выключен). module: tests/test_resolve_agent_model.py expected: PASS # ---- AC-8: enduro per-project override не сломан валидацией ---- - id: TC-08 type: unit description: > Валидный per-project override (agent_models у не-self проекта) резолвится и проходит валидацию без изменения поведения (регрессия ORCH-041). module: tests/test_resolve_agent_model.py expected: PASS # ---- G4: fallback_model (опц.) — условный тест ---- - id: TC-09 type: unit description: > ЕСЛИ G4 включён архитектором: agent_fallback_model задан валидным именем и проходит валидацию G2. ЕСЛИ выключен: agent_fallback_model == "" (тест подтверждает дефолт). Финальная форма теста зависит от решения в ADR. 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 description: > Полный pytest зелёный; невалидная модель/эффорт не роняет запуск агента (graceful-деградация). Регрессия resolve_agent_effort (VALID_EFFORTS) цела. module: tests/ expected: PASS