diff --git a/DECISIONS.md b/DECISIONS.md index fd26301..48687e4 100644 --- a/DECISIONS.md +++ b/DECISIONS.md @@ -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. **Потребитель находки — часть её цены.** Одна и та же ошибка стоит строки + чтения, если её читает человек, и разросшегося кода, если её молча реализует + оркестратор. Модель раздаётся с оглядкой на это, а не только на устройство + прохода. diff --git a/av-dev-pipeline/skills/review-pipeline/SKILL.md b/av-dev-pipeline/skills/review-pipeline/SKILL.md index c907805..6ff925d 100644 --- a/av-dev-pipeline/skills/review-pipeline/SKILL.md +++ b/av-dev-pipeline/skills/review-pipeline/SKILL.md @@ -425,6 +425,15 @@ flowchart TD Recall обоих равен длине их источника — это и есть предел applicative-проходов, ради которого существуют стадии 2 и 3. +**`specs` дороже соседа по стадии, и это не недосмотр.** По устройству он тоже +применяет записанный критерий, и по таблице моделей ему полагался бы `sonnet`. +Держит его наверху **направление `code → spec`**: там надо заметить не нарушение +записанного, а **поведение, которого в спеке нет вовсе** — тихий фолбэк, +самодеятельный дефолт, проглоченную ошибку. Заметить отсутствие дороже, чем +сверить наличие, а ошибка здесь молчит: пропущенное поведение не оставляет следа +ни в отчёте, ни в границах покрытия. Прочие опиниативные проходы держат `opus` +из-за цены **ложных** находок; этот — из-за цены пропущенных. + ## Стадия 2 — Базовый проход (только `standard`) Агент `review-basics`. Один проход, машину не держит, ничего не запускает и не diff --git a/av-dev-pm/agents/doc-code-drift.md b/av-dev-pm/agents/doc-code-drift.md index 244d612..898b5b4 100644 --- a/av-dev-pm/agents/doc-code-drift.md +++ b/av-dev-pm/agents/doc-code-drift.md @@ -2,8 +2,8 @@ name: doc-code-drift description: "Сверка документов канона с кодом по закрытому перечню проверяемых фактов: имя основной ветки и команды из CLAUDE.md, запреты с путями, testdata и временный каталог, путь миграций из .pm.json, внешние зависимости поимённо в architecture.md против манифеста, настройки с числовым значением в database.md против конфига и кода, единые точки проекта против реального числа реализаций, capability против существующих модулей. Отвечает на «этот факт ещё верен», а не «эта архитектура правильная». Читает весь репозиторий, гоняет только читающие команды. Отдаёт готовые формулировки и ничего не правит сам. Согласованность документов между собой смотрит агент doc-consistency. Использовать на сессии между спринтами, а также после приведения проекта к канону (adopt) и после повышения версии канона (upgrade). Только чтение." tools: Read, Grep, Glob, Bash -model: opus -color: yellow +model: sonnet +color: green --- Ты — **сверка документов канона с кодом**. Один вопрос: **этот факт ещё верен?** diff --git a/av-dev-pm/agents/task-form.md b/av-dev-pm/agents/task-form.md index 9e76237..618dfaa 100644 --- a/av-dev-pm/agents/task-form.md +++ b/av-dev-pm/agents/task-form.md @@ -2,8 +2,8 @@ name: task-form description: "Проверка формы записи каталога задач по существу: тип, разошедшийся с содержанием записи, форма заголовка по типу (цель — что приложение будет уметь, задача — что нужно сделать, разведка — о чём она), «зачем», пересказывающее заголовок вместо состояния и боли, раздел «Затрагивает» с замыслом вместо границ, критерий приёмки с оракулом только на словах, предписание процесса в теле, и связь задачи со строкой «Завершения» её цели. Читает файл цели, на которую ссылается задача. Отдаёт готовые формулировки на замену и ничего не правит сам. Язык текста (залог, оценки, стоп-слова, англицизмы) смотрит отдельный агент doc-wording. Использовать после заведения или разбора пачки записей, до взятия в спринт и на переоценке. Только чтение." tools: Read, Grep, Glob -model: opus -color: yellow +model: sonnet +color: green --- Ты — **проверка формы записи** каталога задач. Форма это не оформление: она diff --git a/av-dev-pm/skills/canon/SKILL.md b/av-dev-pm/skills/canon/SKILL.md index c1ab804..19a4d8d 100644 --- a/av-dev-pm/skills/canon/SKILL.md +++ b/av-dev-pm/skills/canon/SKILL.md @@ -84,9 +84,10 @@ capability: незаполненный канон это переходное с 1. `docs.py check`, при наличии базы диффа — с `--base`. 2. **Агентов на каждом `check` не зови.** Оба — `doc-consistency` и `doc-code-drift` — зовутся раз в спринт (шаг сессии), а также шагом 6 `adopt` - и шагом 6 `upgrade`, на весь канон разом. Они дороги: оба на `opus`, второй - ещё и читает репозиторий. Позвал `doc-code-drift` — передай ему раздел - запретов `CLAUDE.md`. + и шагом 6 `upgrade`, на весь канон разом. Они дороги: `doc-consistency` — тем, + что на `opus` (сличение утверждений это суждение), `doc-code-drift` — тем, что + читает репозиторий целиком, хотя сам идёт на `sonnet`. Позвал + `doc-code-drift` — передай ему раздел запретов `CLAUDE.md`. 3. Доклад: вывод скрипта строкой исхода, находки агентов поимённо, **граница покрытия** — что смотрели и чего не смотрели, и **кого из двоих позвал**: доклад, умолчавший об этом, читается как «сверено». diff --git a/av-dev-pm/skills/canon/references/canon.md b/av-dev-pm/skills/canon/references/canon.md index f1b63e9..1acf77f 100644 --- a/av-dev-pm/skills/canon/references/canon.md +++ b/av-dev-pm/skills/canon/references/canon.md @@ -395,8 +395,8 @@ kebab-case.** Причина не эстетическая: имя файла с разрез, что между `task-form` и `doc-wording`. **Зовутся оба одинаково — раз в спринт на сессии, а также после `adopt` и после -`upgrade`, на весь канон разом.** Не на синке документации: агент на `opus` по -каждой сделанной задаче не окупается, а расхождение между двумя документами по +`upgrade`, на весь канон разом.** Не на синке документации: `doc-consistency` на +`opus` по каждой сделанной задаче не окупается, а расхождение между двумя документами по определению требует двух, и на большинстве задач синк правит один. Пачка, отбираемая работой, вдобавок не видит того, чего работа не касалась, — а именно там расхождение и живёт: правка отменяет решение в одном документе, парный статус diff --git a/av-dev-pm/skills/docs/SKILL.md b/av-dev-pm/skills/docs/SKILL.md index cc13c76..92a6cc3 100644 --- a/av-dev-pm/skills/docs/SKILL.md +++ b/av-dev-pm/skills/docs/SKILL.md @@ -64,8 +64,9 @@ description: Вести содержимое документов канона **Но синк его не зовёт.** Оба судьи документов — `doc-consistency` и `doc-code-drift` — зовутся раз в спринт, шагом сессии, на весь канон разом. -Причина в цене: агент на `opus` по каждой сделанной задаче — самая дорогая -церемония процесса. К тому же расхождение между двумя документами по определению +Причина в цене: `doc-consistency` на `opus` по каждой сделанной задаче — самая +дорогая церемония процесса, а `doc-code-drift` хоть и на `sonnet`, но читает +репозиторий целиком. К тому же расхождение между двумя документами по определению требует двух документов, а на большинстве задач синк правит один. Что теряется: привязка находки к задаче, которая её породила. Что выигрывается, diff --git a/av-dev-pm/skills/session/references/cadence.md b/av-dev-pm/skills/session/references/cadence.md index e6817a5..793f4bd 100644 --- a/av-dev-pm/skills/session/references/cadence.md +++ b/av-dev-pm/skills/session/references/cadence.md @@ -66,8 +66,11 @@ ветки, команды, пути, внешние зависимости поимённо, настройки с числовым значением, единые точки проекта, capability. -Раз в спринт, а не чаще, и причина в цене: оба на `opus`, а второй ещё и читает -репозиторий. Но и не реже — **спринт это ровно то, что двигает код и документы**: +Раз в спринт, а не чаще. Дорог из них по-настоящему первый — `doc-consistency` +на `opus`: он сличает утверждения двух документов, и это суждение. Второй с +недавних пор на `sonnet` — у него закрытый перечень фактов и команда на каждый, — +но он читает репозиторий целиком, и дешёвым от смены модели не стал. Но и не +реже — **спринт это ровно то, что двигает код и документы**: переименованная цель сборки, ушедшая зависимость, второй способ делать то, что обзор объявил единственным; факт, дописанный в `architecture.md`, уже живущий в `CLAUDE.md`. Протухшее и раздвоившееся неотличимо от свежего, и по нему принимают diff --git a/av-dev-pm/skills/tasks/SKILL.md b/av-dev-pm/skills/tasks/SKILL.md index b20d4e9..2433a23 100644 --- a/av-dev-pm/skills/tasks/SKILL.md +++ b/av-dev-pm/skills/tasks/SKILL.md @@ -541,7 +541,13 @@ python3 $tk adopt scan --from … | apply --plan … # разовая адап Разделены они не по охвату, а **по глубине**. Язык проверяется по словам и фразам, поштучно; форма записи требует понять, что задача делает, и открыть цель, на которую она ссылается. Слитый проход одну половину делает дорогой, а -вторую — поверхностной. Отсюда и разные модели. +вторую — поверхностной. + +Модель у обоих одна, `sonnet`, и это не отменяет разреза. Оба судят по +**записанному правилу** — семь пунктов формы против правил языка, — а их находка +приходит готовой формулировкой, которую читает и отклоняет человек, а не молча +реализует оркестратор. Ошибка здесь стоит строки чтения, и платить за неё верхней +моделью не за что. Каждый устав отказывается от чужой половины прямо: увиденное не по своей части идёт **строкой в границах покрытия**, а не находкой. Две проверки одного места