From c93a9d1269784d984d47fca925ddac3d7bee2572 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Thu, 6 Aug 2026 19:36:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20=D1=81?= =?UTF-8?q?=D1=83=D0=B1=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=BE=D0=B2:=20?= =?UTF-8?q?=D0=B4=D0=B2=D0=BE=D0=B5=20=D0=B8=D0=B7=20=D0=B4=D0=B5=D0=B2?= =?UTF-8?q?=D1=8F=D1=82=D0=B8=20=D0=BE=D0=BF=D1=83=D1=89=D0=B5=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=BD=D0=B0=20sonnet,=20=D0=BA=D1=80=D0=B8=D1=82=D0=B5?= =?UTF-8?q?=D1=80=D0=B8=D0=B9=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Сквозной проход по тринадцати уставам с одним вопросом: кого из девяти 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) --- DECISIONS.md | 75 +++++++++++++++++++ .../skills/review-pipeline/SKILL.md | 9 +++ av-dev-pm/agents/doc-code-drift.md | 4 +- av-dev-pm/agents/task-form.md | 4 +- av-dev-pm/skills/canon/SKILL.md | 7 +- av-dev-pm/skills/canon/references/canon.md | 4 +- av-dev-pm/skills/docs/SKILL.md | 5 +- .../skills/session/references/cadence.md | 7 +- av-dev-pm/skills/tasks/SKILL.md | 8 +- 9 files changed, 109 insertions(+), 14 deletions(-) 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`, и это не отменяет разреза. Оба судят по +**записанному правилу** — семь пунктов формы против правил языка, — а их находка +приходит готовой формулировкой, которую читает и отклоняет человек, а не молча +реализует оркестратор. Ошибка здесь стоит строки чтения, и платить за неё верхней +моделью не за что. Каждый устав отказывается от чужой половины прямо: увиденное не по своей части идёт **строкой в границах покрытия**, а не находкой. Две проверки одного места