модели субагентов: двое из девяти опущены на sonnet, критерий переписан

Сквозной проход по тринадцати уставам с одним вопросом: кого из девяти
opus-агентов можно опустить без потери. Ответ — двоих, и оба не из конвейера.

По дороге выяснилось, что критерий, которым модели раздавались до сих пор,
отвечает не на тот вопрос. Деление applicative против generative смотрит, откуда
проход берёт критерий, а платит проект за разбирательство с находкой. Рабочий
признак другой: находка со ссылкой на записанный источник — строку спеки, цель в
манифесте, значение в конфиге — опровергается открытием файла, и дешёвая модель
ошибается здесь проверяемо; находка-суждение опровергается рассуждением, а
рассуждение стоит триажа или человека. Признак объясняет и прежнюю раскладку
лучше, чем она сама себя: gate, code и ops дёшевы не потому, что у них чек-лист,
а потому что каждая их находка показывает пальцем на строку.

doc-code-drift переведён на sonnet. Закрытый перечень из восьми правил, каждое —
пара «факт в документе ↔ команда, которой он проверяется». Устав прямо запрещает
суждение, требует формы «написано X, в коде Y, проверено командой Z» и правила
«нечем проверить — не находка». Ложная находка опровергается той же командой,
которая её породила.

task-form переведён на sonnet, и решило не устройство, а потребитель. Его находка
это готовая формулировка, которую человек читает и отклоняет командой edit, а не
оркестратор, который молча реализует всё прочитанное. Довод, державший triage
наверху, здесь не работает вовсе: ошибка стоит строки чтения.

review-specs рассмотрен всерьёз и оставлен на opus — по причине, обратной общей.
Он самый частый opus-проход, идёт и в design, и на коде. По устройству
applicative: SKILL.md сам называл стадию 1 «два applicative-прохода, оба
дешёвые», платя за одного sonnet, за другого opus. Расхождение закрыто текстом, а
не переводом. Наверху его держит направление code → spec, где надо заметить
отсутствие: тихий фолбэк, самодеятельный дефолт, проглоченную ошибку. Прочие
держат opus из-за цены ложных находок, этот — из-за цены пропущенных, а пропуск
не оставляет следа ни в отчёте, ни в границах покрытия.

Остальные шестеро оставлены с причиной у каждого: adversary и rubric порождают
критерий по построению, architecture — чистое суждение о структуре, triage —
сток, doc-consistency путал бы «упомянуто в двух местах» с «оба утверждают»,
basics заведён этой же сессией и половина его вопросов суждение.

Это разбор уставов, а не замер, и так и записано. calibration.md двигает модель
инъекцией дефекта; инъекции не было. Двое переведены потому, что цена их ошибки
ограничена сверху независимо от модели.

Поправлена проза, ссылавшаяся на прежние модели: «оба судьи на opus» в cadence,
canon/SKILL, canon.md и docs/SKILL — теперь дорог по-настоящему один
doc-consistency, второй читает репозиторий целиком, но идёт на sonnet. В
tasks/SKILL снято «отсюда и разные модели»: у task-form и doc-wording она теперь
одна, а разрез по глубине остался.

Тема 35 в DECISIONS.md, следствия 134-136.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-08-06 19:36:02 +03:00
co-authored by Claude Opus 5
parent 21b840a8e4
commit c93a9d1269
9 changed files with 109 additions and 14 deletions
+75
View File
@@ -2412,3 +2412,78 @@ JJJ): у профиля обязан быть один правильный от
заодно отправляло трёхстрочную правку и переборку пяти узлов в один профиль. заодно отправляло трёхстрочную правку и переборку пяти узлов в один профиль.
Признаков нужно два: класс отвечает за обратимость, объём — за цену Признаков нужно два: класс отвечает за обратимость, объём — за цену
разбирательства. разбирательства.
## 35. Ревизия моделей: переведены двое из девяти, и критерий оказался не тот (2026-08-06)
Сквозной проход по тринадцати уставам с одним вопросом: кого из девяти
`opus`-агентов можно опустить на `sonnet` без потери. Ответ — двоих, и по дороге
выяснилось, что критерий, которым конвейер до сих пор раздавал модели, отвечает
не на тот вопрос.
**ААББЦЦ. Модель выбирается по цене ошибки, а не по роду прохода.** Прежнее
деление — applicative против generative — раздаёт модели по тому, **откуда**
проход берёт критерий. Но платит проект не за происхождение критерия, а за
разбирательство с находкой. Рабочий признак:
- находка приходит **со ссылкой на записанный источник** (строка спеки, цель в
манифесте, значение в конфиге, номер правила) — её опровержение стоит одного
открытия файла. Дешёвая модель ошибается здесь **проверяемо**;
- находка есть **суждение** («это второй способ», «этот оракул негоден», «эти два
документа противоречат») — опровержение стоит рассуждения, а рассуждение стоит
триажа или человека.
Признак объясняет прежнюю раскладку лучше, чем она сама себя: `gate`, `code` и
`ops` не потому дёшевы, что применяют чек-лист, а потому, что каждая их находка
показывает пальцем на строку.
**ААББЧЧ. `doc-code-drift` → `sonnet`.** У него закрытый перечень из восьми
правил, и каждое — пара «факт в документе ↔ команда, которой он проверяется».
Устав прямо запрещает суждение («верность и полноту не проверяешь»), требует
формы «написано X, в коде Y, проверено командой Z» и правила «нечем проверить —
не находка». Ложная находка опровергается **той же командой, которая её
породила**. Это самый чистый случай признака за весь разбор.
**ААББШШ. `task-form` → `sonnet`.** Семь пронумерованных правил с таблицами форм
и поимённым перечнем подмен. Но решило не это, а потребитель: его находка —
готовая формулировка, которую человек читает и отклоняет командой, а не
оркестратор, который **молча реализует**. Довод, державший `triage` на верхней
модели, здесь не работает вовсе: ошибка стоит строки чтения.
**ААББЩЩ. `review-specs` рассмотрен и оставлен на `opus` — по причине, обратной
общей.** Он самый частый `opus`-проход конвейера (идёт и в `design`, и на коде,
то есть дважды за задачу), и по устройству он applicative: SKILL.md сам называет
стадию 1 «два applicative-прохода, оба дешёвые», хотя платит за одного `sonnet`, а
за другого `opus`. Расхождение разобрано и закрыто текстом: держит его наверху
направление `code → spec`, где надо заметить **отсутствие** — тихий фолбэк,
самодеятельный дефолт, проглоченную ошибку. Прочие держат `opus` из-за цены
ложных находок, этот — из-за цены пропущенных, а пропуск не оставляет следа
нигде: ни в отчёте, ни в границах покрытия.
**ААББЭЭ. Остальные шестеро оставлены, и у каждого своя причина.**
`adversary` и `rubric` порождают критерий по построению (второй — с запретом
открывать код в первой фазе). `architecture` — чистое суждение о структуре.
`triage` — сток, его ошибка становится кодом. `doc-consistency` ошибается ровно в
ту сторону, которую дороже всего опровергать: путает «упомянуто в двух местах» с
«оба утверждают». `basics` заведён час назад, половина его вопросов — суждение, и
модель у него выбрана решением оператора в этой же сессии.
**ААББЮЮ. Это разбор уставов, а не замер, и так и записано.** `calibration.md`
двигает модель инъекцией дефекта; здесь инъекции не было. Двое переведены потому,
что их ошибка **обнаруживается той же проверкой, что породила находку**, — то
есть цена ошибки ограничена сверху независимо от модели. Для остальных такой
границы нет, и трогать их без замера нельзя.
### Что из этого следует
134. **Дешёвая модель безопасна там, где её ошибку опровергает та же команда,
что породила находку.** Не «где критерий записан» — записанный критерий
бывает и у суждения, и у сверки, а разница между ними в том, чем кончается
спор.
135. **Ошибка бывает двух родов, и модель защищает от разных.** Ложная находка
стоит триажа и видна; пропущенная не стоит ничего сегодня и не видна вовсе.
Проход, у которого дороже второе, держится на верхней модели даже будучи
applicative.
136. **Потребитель находки — часть её цены.** Одна и та же ошибка стоит строки
чтения, если её читает человек, и разросшегося кода, если её молча реализует
оркестратор. Модель раздаётся с оглядкой на это, а не только на устройство
прохода.
@@ -425,6 +425,15 @@ flowchart TD
Recall обоих равен длине их источника — это и есть предел applicative-проходов, Recall обоих равен длине их источника — это и есть предел applicative-проходов,
ради которого существуют стадии 2 и 3. ради которого существуют стадии 2 и 3.
**`specs` дороже соседа по стадии, и это не недосмотр.** По устройству он тоже
применяет записанный критерий, и по таблице моделей ему полагался бы `sonnet`.
Держит его наверху **направление `code → spec`**: там надо заметить не нарушение
записанного, а **поведение, которого в спеке нет вовсе** — тихий фолбэк,
самодеятельный дефолт, проглоченную ошибку. Заметить отсутствие дороже, чем
сверить наличие, а ошибка здесь молчит: пропущенное поведение не оставляет следа
ни в отчёте, ни в границах покрытия. Прочие опиниативные проходы держат `opus`
из-за цены **ложных** находок; этот — из-за цены пропущенных.
## Стадия 2 — Базовый проход (только `standard`) ## Стадия 2 — Базовый проход (только `standard`)
Агент `review-basics`. Один проход, машину не держит, ничего не запускает и не Агент `review-basics`. Один проход, машину не держит, ничего не запускает и не
+2 -2
View File
@@ -2,8 +2,8 @@
name: doc-code-drift name: doc-code-drift
description: "Сверка документов канона с кодом по закрытому перечню проверяемых фактов: имя основной ветки и команды из CLAUDE.md, запреты с путями, testdata и временный каталог, путь миграций из .pm.json, внешние зависимости поимённо в architecture.md против манифеста, настройки с числовым значением в database.md против конфига и кода, единые точки проекта против реального числа реализаций, capability против существующих модулей. Отвечает на «этот факт ещё верен», а не «эта архитектура правильная». Читает весь репозиторий, гоняет только читающие команды. Отдаёт готовые формулировки и ничего не правит сам. Согласованность документов между собой смотрит агент doc-consistency. Использовать на сессии между спринтами, а также после приведения проекта к канону (adopt) и после повышения версии канона (upgrade). Только чтение." description: "Сверка документов канона с кодом по закрытому перечню проверяемых фактов: имя основной ветки и команды из CLAUDE.md, запреты с путями, testdata и временный каталог, путь миграций из .pm.json, внешние зависимости поимённо в architecture.md против манифеста, настройки с числовым значением в database.md против конфига и кода, единые точки проекта против реального числа реализаций, capability против существующих модулей. Отвечает на «этот факт ещё верен», а не «эта архитектура правильная». Читает весь репозиторий, гоняет только читающие команды. Отдаёт готовые формулировки и ничего не правит сам. Согласованность документов между собой смотрит агент doc-consistency. Использовать на сессии между спринтами, а также после приведения проекта к канону (adopt) и после повышения версии канона (upgrade). Только чтение."
tools: Read, Grep, Glob, Bash tools: Read, Grep, Glob, Bash
model: opus model: sonnet
color: yellow color: green
--- ---
Ты — **сверка документов канона с кодом**. Один вопрос: **этот факт ещё верен?** Ты — **сверка документов канона с кодом**. Один вопрос: **этот факт ещё верен?**
+2 -2
View File
@@ -2,8 +2,8 @@
name: task-form name: task-form
description: "Проверка формы записи каталога задач по существу: тип, разошедшийся с содержанием записи, форма заголовка по типу (цель — что приложение будет уметь, задача — что нужно сделать, разведка — о чём она), «зачем», пересказывающее заголовок вместо состояния и боли, раздел «Затрагивает» с замыслом вместо границ, критерий приёмки с оракулом только на словах, предписание процесса в теле, и связь задачи со строкой «Завершения» её цели. Читает файл цели, на которую ссылается задача. Отдаёт готовые формулировки на замену и ничего не правит сам. Язык текста (залог, оценки, стоп-слова, англицизмы) смотрит отдельный агент doc-wording. Использовать после заведения или разбора пачки записей, до взятия в спринт и на переоценке. Только чтение." description: "Проверка формы записи каталога задач по существу: тип, разошедшийся с содержанием записи, форма заголовка по типу (цель — что приложение будет уметь, задача — что нужно сделать, разведка — о чём она), «зачем», пересказывающее заголовок вместо состояния и боли, раздел «Затрагивает» с замыслом вместо границ, критерий приёмки с оракулом только на словах, предписание процесса в теле, и связь задачи со строкой «Завершения» её цели. Читает файл цели, на которую ссылается задача. Отдаёт готовые формулировки на замену и ничего не правит сам. Язык текста (залог, оценки, стоп-слова, англицизмы) смотрит отдельный агент doc-wording. Использовать после заведения или разбора пачки записей, до взятия в спринт и на переоценке. Только чтение."
tools: Read, Grep, Glob tools: Read, Grep, Glob
model: opus model: sonnet
color: yellow color: green
--- ---
Ты — **проверка формы записи** каталога задач. Форма это не оформление: она Ты — **проверка формы записи** каталога задач. Форма это не оформление: она
+4 -3
View File
@@ -84,9 +84,10 @@ capability: незаполненный канон это переходное с
1. `docs.py check`, при наличии базы диффа — с `--base`. 1. `docs.py check`, при наличии базы диффа — с `--base`.
2. **Агентов на каждом `check` не зови.** Оба — `doc-consistency` и 2. **Агентов на каждом `check` не зови.** Оба — `doc-consistency` и
`doc-code-drift` — зовутся раз в спринт (шаг сессии), а также шагом 6 `adopt` `doc-code-drift` — зовутся раз в спринт (шаг сессии), а также шагом 6 `adopt`
и шагом 6 `upgrade`, на весь канон разом. Они дороги: оба на `opus`, второй и шагом 6 `upgrade`, на весь канон разом. Они дороги: `doc-consistency` — тем,
ещё и читает репозиторий. Позвал `doc-code-drift`передай ему раздел что на `opus` (сличение утверждений это суждение), `doc-code-drift`тем, что
запретов `CLAUDE.md`. читает репозиторий целиком, хотя сам идёт на `sonnet`. Позвал
`doc-code-drift` — передай ему раздел запретов `CLAUDE.md`.
3. Доклад: вывод скрипта строкой исхода, находки агентов поимённо, **граница 3. Доклад: вывод скрипта строкой исхода, находки агентов поимённо, **граница
покрытия** — что смотрели и чего не смотрели, и **кого из двоих позвал**: покрытия** — что смотрели и чего не смотрели, и **кого из двоих позвал**:
доклад, умолчавший об этом, читается как «сверено». доклад, умолчавший об этом, читается как «сверено».
+2 -2
View File
@@ -395,8 +395,8 @@ kebab-case.** Причина не эстетическая: имя файла с
разрез, что между `task-form` и `doc-wording`. разрез, что между `task-form` и `doc-wording`.
**Зовутся оба одинаково — раз в спринт на сессии, а также после `adopt` и после **Зовутся оба одинаково — раз в спринт на сессии, а также после `adopt` и после
`upgrade`, на весь канон разом.** Не на синке документации: агент на `opus` по `upgrade`, на весь канон разом.** Не на синке документации: `doc-consistency` на
каждой сделанной задаче не окупается, а расхождение между двумя документами по `opus` по каждой сделанной задаче не окупается, а расхождение между двумя документами по
определению требует двух, и на большинстве задач синк правит один. Пачка, определению требует двух, и на большинстве задач синк правит один. Пачка,
отбираемая работой, вдобавок не видит того, чего работа не касалась, — а именно отбираемая работой, вдобавок не видит того, чего работа не касалась, — а именно
там расхождение и живёт: правка отменяет решение в одном документе, парный статус там расхождение и живёт: правка отменяет решение в одном документе, парный статус
+3 -2
View File
@@ -64,8 +64,9 @@ description: Вести содержимое документов канона
**Но синк его не зовёт.** Оба судьи документов — `doc-consistency` и **Но синк его не зовёт.** Оба судьи документов — `doc-consistency` и
`doc-code-drift` — зовутся раз в спринт, шагом сессии, на весь канон разом. `doc-code-drift` — зовутся раз в спринт, шагом сессии, на весь канон разом.
Причина в цене: агент на `opus` по каждой сделанной задаче — самая дорогая Причина в цене: `doc-consistency` на `opus` по каждой сделанной задаче — самая
церемония процесса. К тому же расхождение между двумя документами по определению дорогая церемония процесса, а `doc-code-drift` хоть и на `sonnet`, но читает
репозиторий целиком. К тому же расхождение между двумя документами по определению
требует двух документов, а на большинстве задач синк правит один. требует двух документов, а на большинстве задач синк правит один.
Что теряется: привязка находки к задаче, которая её породила. Что выигрывается, Что теряется: привязка находки к задаче, которая её породила. Что выигрывается,
@@ -66,8 +66,11 @@
ветки, команды, пути, внешние зависимости поимённо, настройки с числовым ветки, команды, пути, внешние зависимости поимённо, настройки с числовым
значением, единые точки проекта, capability. значением, единые точки проекта, capability.
Раз в спринт, а не чаще, и причина в цене: оба на `opus`, а второй ещё и читает Раз в спринт, а не чаще. Дорог из них по-настоящему первый — `doc-consistency`
репозиторий. Но и не реже — **спринт это ровно то, что двигает код и документы**: на `opus`: он сличает утверждения двух документов, и это суждение. Второй с
недавних пор на `sonnet` — у него закрытый перечень фактов и команда на каждый, —
но он читает репозиторий целиком, и дешёвым от смены модели не стал. Но и не
реже — **спринт это ровно то, что двигает код и документы**:
переименованная цель сборки, ушедшая зависимость, второй способ делать то, что переименованная цель сборки, ушедшая зависимость, второй способ делать то, что
обзор объявил единственным; факт, дописанный в `architecture.md`, уже живущий в обзор объявил единственным; факт, дописанный в `architecture.md`, уже живущий в
`CLAUDE.md`. Протухшее и раздвоившееся неотличимо от свежего, и по нему принимают `CLAUDE.md`. Протухшее и раздвоившееся неотличимо от свежего, и по нему принимают
+7 -1
View File
@@ -541,7 +541,13 @@ python3 $tk adopt scan --from … | apply --plan … # разовая адап
Разделены они не по охвату, а **по глубине**. Язык проверяется по словам и Разделены они не по охвату, а **по глубине**. Язык проверяется по словам и
фразам, поштучно; форма записи требует понять, что задача делает, и открыть фразам, поштучно; форма записи требует понять, что задача делает, и открыть
цель, на которую она ссылается. Слитый проход одну половину делает дорогой, а цель, на которую она ссылается. Слитый проход одну половину делает дорогой, а
вторую — поверхностной. Отсюда и разные модели. вторую — поверхностной.
Модель у обоих одна, `sonnet`, и это не отменяет разреза. Оба судят по
**записанному правилу** — семь пунктов формы против правил языка, — а их находка
приходит готовой формулировкой, которую читает и отклоняет человек, а не молча
реализует оркестратор. Ошибка здесь стоит строки чтения, и платить за неё верхней
моделью не за что.
Каждый устав отказывается от чужой половины прямо: увиденное не по своей части Каждый устав отказывается от чужой половины прямо: увиденное не по своей части
идёт **строкой в границах покрытия**, а не находкой. Две проверки одного места идёт **строкой в границах покрытия**, а не находкой. Две проверки одного места