Матрица выбора модели: фаза × сложность
Источник истины для
scripts/model_routing.py::suggest_model. Решение Decision #112. Задачаv15mr-phase-matrix(P1).
TAUSIK рекомендует Claude-модель (применяет её пользователь вручную — Claude Code не переключает модель программно). До v1.5 выбор зависел только от сложности задачи. С v1.5 он зависит от двух осей: сложность и SDLC-фаза, в которой модель работает.
Почему фаза важна: одна и та же «простая» задача требует разной мощности в зависимости от того, что делает модель. Простой research («где определён X», поиск по символу, скан доков) — это read-only discovery, и Haiku справляется в 10–20 раз дешевле. Простой implement (правка одного файла) требует рассуждения о типах, call-site и тестах — Haiku здесь спотыкается, пол реализации = Sonnet.
Матрица
| Фаза \ Сложность | simple | medium | complex |
|---|---|---|---|
| planning | Fable 5 (Opus 4.8 alt) | Fable 5 (Opus 4.8 alt) | Fable 5 (Opus 4.8 alt) |
| implement | Sonnet 4.6 | Sonnet 4.6 | Opus 4.8 (Fable 5 alt) |
| research | Haiku 4.5 | Sonnet 4.6 | Sonnet 4.6 (Opus 4.8 alt при затыке) |
phase по умолчанию — implement (обратная совместимость с однопараметрическими вызовами suggest_model(complexity)). Неизвестная сложность или None падает в колонку medium соответствующей фазы. Неизвестная фаза → ValueError со списком допустимых значений (planning, implement, research).
Обоснование по ячейкам
planning → Fable 5 (alt Opus 4.8), независимо от сложности
Качество плана компаундируется на всю задачу: один раз потратив токены на сильный планировщик, мы экономим многократно на исполнении по чёткому плану. Поэтому даже простая задача в фазе planning получает топовую модель — сложность здесь не понижает планировщик. Fable 5 — primary (быстрый вывод на топ-качестве); Opus 4.8 — приемлемая альтернатива.
implement → пол = Sonnet 4.6
- simple → Sonnet 4.6. Даже правка одного файла требует рассуждения о типах, местах вызова и тестовой обвязке. Haiku слишком слаб для production-кода и фабрикует ошибки в этих местах. Sonnet — минимальный порог для реализации. (Это намеренное изменение относительно v1.4, где simple → Haiku. См. Decision #112.)
- medium → Sonnet 4.6. Мультифайловые изменения / рефакторинг в пределах модуля. Sonnet балансирует цену и способности.
- complex → Opus 4.8 (alt Fable 5). Кросс-модульный рефакторинг, архитектура, неоднозначные требования. Opus окупает стоимость на сложном рассуждении.
research → Haiku для лёгкого, Sonnet для глубокого
- simple → Haiku 4.5. Read-only discovery: «где X», поиск по символу/паттерну, скан документации. Haiku в 10–20 раз дешевле и достаточен — здесь живёт бывший «simple → Haiku».
- medium → Sonnet 4.6. Более глубокое исследование по подсистемам, синтез.
- complex → Sonnet 4.6 (alt Opus 4.8). Глубокий research с синтезом многих источников; эскалация на Opus вручную, только если рассуждение буксует.
Конфиг-override
Любую ячейку можно переопределить в корне .tausik/config.json под ключом model_routing. Две формы:
{
"model_routing": {
"planning": "claude-fable-5", // одна модель на все сложности фазы
"implement": { // или по-сложностный override
"simple": "claude-haiku-4-5",
"complex": "claude-opus-4-8"
}
}
}Значение — model_id (строка). Display-имя выводится из семейства модели (haiku/sonnet/opus/fable); незнакомый id используется как есть. Битые/отсутствующие записи игнорируются — побеждает базовая матрица, ошибка не выбрасывается. suggest_model(..., config=None) (по умолчанию) override не применяет — это чистый вызов; пользовательские поверхности (format_suggestion, format_task_start_banner) сами подгружают конфиг.
Сабагенты (Agent-tool)
Когда скилл порождает сабагентов через Agent-tool, рекомендуемая модель задаётся параметром model= и зависит от фазы работы сабагента (та же философия, что у матрицы). Задача v15mr-subagent-model-hints.
| Фаза сабагента | Модель | Где |
|---|---|---|
| search / exploration (read-only discovery) | Haiku 4.5 | deep-research finder'ы, explore-форки |
| code-review / verification | Sonnet 4.6 | /review 5 доменных агентов, /ship review+test, /debug gate-fixer |
| reasoning / synthesis (adversarial, многоисточниковый синтез) | Opus 4.8 (или Fable 5) | /review critic, deep-research synthesis |
Согласовано с token-economy (sonnet для поиска по коду в ревью, opus только там, где нужен сильный reasoning). model= — подсказка, не требование: если его не указать, сабагент наследует модель сессии. Легаси-вызовы без model= остаются валидными — grep-тест дрейфа проверяет наличие гайд-подсказки, а не model= в каждом вызове.
Телеметрия adherence — фаза implement
task done пишет пару recommended/actual в .tausik/routing_adherence.jsonl (tausik metrics агрегирует %). Recommended берётся из рекомендации на task start, а она всегда implement-фазы (task_start — точка входа в реализацию; в схеме задачи нет поля phase). То есть adherence калибрует именно implement-строку матрицы — «кодил ли я на правильной модели». Planning/research подсказки живут в /plan и /explore и в эту телеметрию не входят by design.
Известные ограничения
- Это рекомендация, а не переключатель: Claude Code не меняет модель программно, применяет пользователь через model picker в IDE.
/fast— не переключение (только fast-output на Opus). alt-вариант («Opus 4.8 alt») сообщается в тексте rationale, а не отдельным ключом возврата:suggest_modelвсегда отдаёт стабильный dict из трёх ключей{model, display, rationale}.