From 7ab759ae4af4e33c51d6f3c0a797be8e550160d5 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Sun, 23 Aug 2026 19:51:47 +0300 Subject: [PATCH] =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=80=D1=88=D0=B8=D0=B9=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=BB=D0=B3:=20=D1=80=D0=B0=D0=B7=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D0=BA=D0=B0=20=D1=82=D1=80=D0=B5=D0=BC=D1=8F=20=D0=BE?= =?UTF-8?q?=D1=81=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=D0=BC=D0=B8,?= =?UTF-8?q?=20=D0=B2=D0=BE=D0=BF=D1=80=D0=BE=D1=81=D1=8B=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BC,=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F=20=D1=80=D0=B0?= =?UTF-8?q?=D1=81=D0=BA=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=205?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Третий заход по находкам ревью — то, что старше темы 78 и тянулось с тем 74–77. Оснований у развилки три во всех местах: конвейер называл два, а устав триажа, контракт находок, сценарий решения и журнал — три. Там же сказано, чем третье отличается: по первым двум оркестратор урезает изменение до остатка, третье отменяет одобрение и возвращает на чекпоинт. Вопросы проекта по темам достались проходам, которые эти темы закрывают: review-code, review-specs и review-autotests получили обязанность отвечать дословно и строку в блоке покрытия. Прежде конвейер обещал их каждому проходу, а знал о них только приёмник тем. Глубокое ревью приведено к уставам, которые зовёт: глубина у проходов разная — доказательство у тех двоих, что держат машину, разбор у architecture и code; у триажа три вызывающих, а не два режима, и потолка в 7 пунктов там нет. Версия раскладки поднята до 5 с записью журнала: скелет docs/review.md потерял подраздел «Триггеры метки» ещё темой 77, а миграции проектам никто не дал. Сняты остатки меток в task-track и в config-skeleton, уезжающем в чужой проект. Перечень осей досчитал три оси: глубина темы, разметка действия, род правки. Журнал — тема 81. --- README.md | 1 - av-dev/agents/review-autotests.md | 12 +++ av-dev/agents/review-code.md | 20 ++++- av-dev/agents/review-specs.md | 13 ++++ av-dev/agents/review-triage.md | 10 ++- av-dev/shared/axes.md | 11 +++ av-dev/shared/config.py | 2 +- av-dev/skills/canon/references/canon.md | 7 +- av-dev/skills/canon/references/changelog.md | 38 +++++++++ av-dev/skills/code-deep-review/SKILL.md | 16 ++-- .../references/config-skeleton.md | 4 +- av-dev/skills/code-review/SKILL.md | 47 +++++++---- .../code-review/references/project-facts.md | 3 +- av-dev/skills/doc-healthcheck/SKILL.md | 6 ++ av-dev/skills/task-track/SKILL.md | 31 ++++---- ...81-elder-debt-of-transformation-cleared.md | 78 +++++++++++++++++++ decisions/README.md | 1 + 17 files changed, 254 insertions(+), 46 deletions(-) create mode 100644 decisions/81-elder-debt-of-transformation-cleared.md diff --git a/README.md b/README.md index 6b00015..d0e4465 100644 --- a/README.md +++ b/README.md @@ -166,7 +166,6 @@ flowchart TB canon --> hc hc --> tasks docs --> rp - rp --> tasks rp -.->|"строки «отложено»"| deep deep --> tasks groom -.-> hc diff --git a/av-dev/agents/review-autotests.md b/av-dev/agents/review-autotests.md index 7ce593c..5c6906a 100644 --- a/av-dev/agents/review-autotests.md +++ b/av-dev/agents/review-autotests.md @@ -152,10 +152,22 @@ color: green ## Coverage of this pass - гейт: <прогнан здесь | переиспользован: чем, когда, отпечаток> - проверено: <перечисли выполненные команды> +- вопросы проекта по теме autotests: <вопрос → ответ, дословно — или «задание их не принесло»> - не проверялось и почему: <шаги SKIP с причинами; проверки вне гейта> - принципиально недоступно этому проходу: замысел, форма решения, архитектура ``` +## Вопросы проекта по теме + +**Вопрос по теме `autotests` из `docs/review.*` — твой**, и приходит он заданием +дословно, в форме `<тема>: <вопрос> (<откуда>)`. Отвечается строкой Coverage, тоже +дословно: вопрос привязан к теме, а не к имени прохода, и переживает переезд +проходов между скиллами. + +Задание вопросов не принесло — скажи строкой. Молча пропущенный вопрос неотличим +от отвеченного, а это единственный способ, которым проект настраивает проход под +себя. + ## Ограничения Код не правишь. Временный каталог проекта — единственное место, куда пишешь. Не diff --git a/av-dev/agents/review-code.md b/av-dev/agents/review-code.md index 1365827..d4a7aa6 100644 --- a/av-dev/agents/review-code.md +++ b/av-dev/agents/review-code.md @@ -6,7 +6,7 @@ model: opus color: yellow --- -Ты — проход по коду изменения, и у тебя **две половины**. +Ты — проход по коду изменения, и у тебя **три половины**. **Первая — технический разбор.** Прочитать дифф и найти дефект: место, где код сделает не то, что задумано. Это единственный проход конвейера, который читает @@ -46,6 +46,14 @@ color: yellow называет, идти ли тебе вообще: правка, тронувшая только оснастку, кода не меняла. Вход и потолки там те же самые — они от прогона не зависят. +**Глубокое ревью области — единственный вызов, где вход другой.** Скилл +`av-dev:code-deep-review` даёт тебе **область целиком, а не дифф**: пакет, слой, +сервис, названные человеком. Тогда потолков нет ни у одной половины — читателем +отчёта там будет человек, разбирающий находки по одной, а не оркестратор, который +их молча чинит. Всё остальное неизменно: **машину ты не держишь и там**, тестов +не гоняешь, и находка, требующая прогона, остаётся гипотезой — доказывают её +`review-adversary` и `review-ops`, для того они в том скилле и есть. + **У технической половины потолка нет намеренно.** Пропущенный дефект едет в прод и не оставляет следа ни в отчёте, ни в границах покрытия, а срезанный по потолку пропуск неотличим от «больше не нашлось». Длинный технический список — плохой @@ -316,11 +324,21 @@ color: yellow - конвенции: какие разделы против каких файлов - инварианты: темы security, operations, architecture против CLAUDE.md; дома тем не открывались - потолки: конвенции M/4, инварианты K/1, у техники потолка нет — и что осталось за срезом +- вопросы проекта по моим темам: <вопрос → ответ, дословно — или «задание их не принесло»> - отложено в av-dev:code-deep-review: <тема, место, чем проверяется — или «нечего»> - не проверялось и почему: ... - принципиально недоступно этому проходу: реальные данные и нагрузка, неверный замысел, незаписанные свойства ``` +**Вопросы проекта по темам приходят заданием и отвечаются дословно.** Их дом — +`docs/review.*`, подраздел «Вопросы по темам», форма — `<тема>: <вопрос> +(<откуда>)`. Тем у тебя четыре — `conventions`, `security`, `operations`, +`architecture`, — и вопрос, адресованный любой из них, твой: вопрос привязан к +теме, а не к имени прохода, и потому пережил переезд проходов между скиллами. +Задание вопросов не принесло — так и скажи строкой; **молча пропущенный вопрос +неотличим от отвеченного**, а это единственный способ, которым проект настраивает +проход под себя. + ## Ограничения Только чтение и анализ. Тесты не запускай, машину не держи. Код не редактируй, не diff --git a/av-dev/agents/review-specs.md b/av-dev/agents/review-specs.md index 8c56dec..aec9acc 100644 --- a/av-dev/agents/review-specs.md +++ b/av-dev/agents/review-specs.md @@ -166,6 +166,7 @@ change, `docs/architecture.md`, `docs/passport.md` и инварианты `CLAU ## Coverage of this pass - проверено: <какие Requirements, какие файлы диффа прочитаны> - источники: дельта, актуальные спеки, design/tasks, architecture, passport, инварианты — что из этого нашлось +- вопросы проекта по теме requirements: <вопрос → ответ, дословно — или «задание их не принесло»> - отложено в av-dev:code-deep-review: <что доказывается только прогоном или входом шире диффа — или «нечего»> - не проверялось и почему: ... - требование против записанного наблюдения не проверялось: docs/research/ — процессный документ, прогон его не открывает @@ -176,3 +177,15 @@ change, `docs/architecture.md`, `docs/passport.md` и инварианты `CLAU Только чтение и анализ. `openspec validate` запускать можно и нужно. Не редактируй код и спеки, не архивируй change. + +## Вопросы проекта по теме + +**`docs/review.*` держит подраздел «Вопросы по темам», и вопрос по теме +`requirements` — твой.** Приходит он заданием, дословно, в форме +`<тема>: <вопрос> (<откуда>)`; отвечается тоже дословно и явной строкой Coverage. +Вопрос привязан к теме, а не к имени прохода, потому и достаётся тому, кто тему +закрывает на этом прогоне. + +Задание вопросов не принесло — скажи строкой. Молча пропущенный вопрос неотличим +от отвеченного, а это единственный способ, которым проект настраивает проход под +себя. diff --git a/av-dev/agents/review-triage.md b/av-dev/agents/review-triage.md index 7ab5bc4..4e843ca 100644 --- a/av-dev/agents/review-triage.md +++ b/av-dev/agents/review-triage.md @@ -1,6 +1,6 @@ --- name: review-triage -description: "Обязательный финальный проход конвейера ревью — единственный, кто агрегирует. Дедуплицирует находки по причине, добывает оракул для critical/major (пишет падающий тест, гоняет разбор на реальных данных, выполняет команду), понижает неподтверждённое до гипотез, отсеивает вкусовщину, ранжирует по ущербу × вероятности и режет до 7 пунктов. Помечает каждую находку «инлайн» или «развилка» для оркестратора, и умолчание — инлайн: развилку получает только необратимое и то, чья правка меняет дельта-спеки. Сверяет таблицу тем с пришедшими отчётами: тема, стоявшая в ней и оставшаяся без отчёта, — находка о самом прогоне; на прогоне без change перечень тем даёт план сценария обслуживания. Сводит строки «отложено в av-dev:code-deep-review» в одну секцию отчёта. Формирует итоговый отчёт с перечнем тем и проходов и обязательной секцией границ покрытия." +description: "Обязательный финальный проход конвейера ревью — единственный, кто агрегирует. Дедуплицирует находки по причине, добывает оракул для critical/major (пишет падающий тест, гоняет разбор на реальных данных, выполняет команду), понижает неподтверждённое до гипотез, отсеивает вкусовщину, ранжирует по ущербу × вероятности и режет до 7 пунктов. Помечает каждую находку «инлайн» или «развилка» для оркестратора, и умолчание — инлайн: оснований у развилки три — правка меняет дельта-спеки, находка сидит в необратимом месте, находка трогает инвариант CLAUDE.md. Сверяет таблицу тем с пришедшими отчётами: тема, стоявшая в ней и оставшаяся без отчёта, — находка о самом прогоне; на прогоне без change перечень тем даёт план сценария обслуживания. Сводит строки «отложено в av-dev:code-deep-review» в одну секцию отчёта. Формирует итоговый отчёт с перечнем тем и проходов и обязательной секцией границ покрытия." tools: Read, Grep, Glob, Bash, Write model: opus color: yellow @@ -28,7 +28,7 @@ color: yellow инструмент сверки: ты единственный, кто видит и то, что заявлено, и то, что пришло. -**Откуда перечень приходит, зависит от режима, и режимов два.** +**Откуда перечень приходит, зависит от того, кто тебя позвал.** - **По change** — обычный прогон цикла задачи. Перечень постоянный, он живёт в конвейере (`av-dev:code-review`, раздел «Состав прогона») и на каждой задаче @@ -38,6 +38,12 @@ color: yellow дельта-спек нет, и перечень **фиксирован сценарием** (`av-dev:code-resolve`, `references/maintain.md`). Тема `requirements` в нём отсутствует за отсутствием предмета. +- **Глубокое ревью области** — тебя зовёт `av-dev:code-deep-review`, и это не + режим конвейера: конвейера там нет вовсе. Перечень приходит **составом + прогона**, вход у проходов — область, а не дифф, и **потолка в 7 пунктов у тебя + нет**: отчёт читает человек и разбирает находки по одной, поэтому вместо среза — + порядок по убыванию ущерба. Остальные шаги идут как обычно, включая оракул и + границы покрытия. Перечень цикла задачи — помеченная копия; дом её в конвейере, правится он, а не этот устав: diff --git a/av-dev/shared/axes.md b/av-dev/shared/axes.md index 46642c7..a0ea54c 100644 --- a/av-dev/shared/axes.md +++ b/av-dev/shared/axes.md @@ -12,6 +12,12 @@ неё не осталось ничего — так и должно быть: перечень описывает то, что ветвится сегодня. +**Трёх осей он не досчитывал и в обратную сторону.** Глубина темы, разметка +действия и род правки документа ветвили поведение годами, а в перечне их не было: +каждая живёт в своём скилле, и оттуда её видно, а отсюда — нет. Ровно за этим +перечень и заведён: вопрос «а не задаёт ли это глубину ревью» задают из скилла, +который ревью не ведёт. + **Ось — это закрытый перечень значений, по которому что-то ветвится.** Признак проверяемый, и он отсекает похожее: темы ревью и документы проекта — списки **открытые**, их пополняет проект, и перечень в плагине протух бы на первом же @@ -28,6 +34,8 @@ | сценарий | решение · обслуживание · разведка | `code-resolve/SKILL.md`, «Развилка» | | режим прогона | по change · без change | здесь, ниже | | род правки документа | отражение · новое | `doc-sync/SKILL.md`, «Два рода правок» | +| глубина темы | сверка · разбор · доказательство | `code-review/SKILL.md`, таблица тем | +| разметка действия | инлайн · развилка | `code-review/SKILL.md`, «Что происходит с находками» | | категория документа | тема · источник темы · процессный | `canon/references/canon.md` | | severity находки | `critical` `major` `minor` `nit` | `code-review/references/finding-contract.md` | | коды выхода | 0 1 2 3 4 | здесь, ниже | @@ -57,6 +65,9 @@ | категория документа | заводит ли документ направление проверки | `canon.md`, «Три категории» | | severity | что с находкой делают дальше | `code-review/SKILL.md`, «Что происходит с находками» | | род правки | спрашивают ли человека перед письмом в документ | `doc-sync/SKILL.md`, «Два рода правок» | +| глубина темы | что проход делает с домом темы и какой потолок у находок | `code-review/SKILL.md`, таблица тем | +| разметка действия | чинится находка молча или уходит человеку вопросом | `code-review/SKILL.md`, «Что происходит с находками» | +| разметка действия | возвращается ли прогон на чекпоинт — **не задаёт**: возврат старше развилки и решается признаком «меняются ли дельта-спеки» | `code-resolve/references/solve.md`, шаг 5 | | сценарий | какова доля отражения в синке: обслуживание двигает факты и потому спрашивает редко | `code-resolve/references/maintain.md`, шаг 5 | **Четыре клетки пусты, и это сказано намеренно, а не забыто.** diff --git a/av-dev/shared/config.py b/av-dev/shared/config.py index f0bd015..386d12e 100644 --- a/av-dev/shared/config.py +++ b/av-dev/shared/config.py @@ -56,7 +56,7 @@ LEGACY_TASKS = ".tasks.json" # Версия раскладки — одна на плагин. Журнал версий — references/changelog.md # скилла `canon`, повышает его операция `upgrade`. -VERSION = 4 +VERSION = 5 VERSION_KEY = "version" diff --git a/av-dev/skills/canon/references/canon.md b/av-dev/skills/canon/references/canon.md index 97a2255..6b67080 100644 --- a/av-dev/skills/canon/references/canon.md +++ b/av-dev/skills/canon/references/canon.md @@ -340,7 +340,12 @@ kebab-case.** Причина не эстетическая: имя файла с проекте нет дома, сюда не пишется: её и так называет план каждого прогона. **Журнал дефектов:** запись на каждый воспроизведённый дефект с пометкой -**проскочил / пойман ревью**. Проскочившие — проверочный набор для калибровки конвейера, +**проскочил / пойман ревью**. Запись — новое, и заводится она по слову человека +(`av-dev:doc-sync`, «Два рода правок»): «на каждый» задаёт **обязанность +предложить**, а не право записать молча. Человек отказал — записи нет, и +калибровка конвейера по этому дефекту не состоится; это его решение и его цена. + +Проскочившие — проверочный набор для калибровки конвейера, выборка по пометке. Пойманные с оракулом — лучшая опора для прохода: проектные, воспроизводимые, однажды оказавшиеся правдой. diff --git a/av-dev/skills/canon/references/changelog.md b/av-dev/skills/canon/references/changelog.md index cd35f89..cb40444 100644 --- a/av-dev/skills/canon/references/changelog.md +++ b/av-dev/skills/canon/references/changelog.md @@ -22,6 +22,44 @@ --- +## Версия 5 — 2026-08-23 + +**Метка задачи снята из процесса целиком**, и вместе с ней — подраздел «Триггеры +метки» в `docs/review.md`. Состав прогона ревью стал постоянным: он один и тот же +на всякой задаче, выбирать нечего, и признаки, по которым метка поднималась, +перестали что-либо решать. На месте подраздела — **«Когда звать глубокое ревью»**: +те же наблюдения проекта, но адресованные другому решению — звать ли +`av-dev:code-deep-review` по области кода. + +**Что переехало в проекте.** Скелет `docs/review.md`, раздел настройки конвейера: +подраздел «Триггеры метки» заменён подразделом «Когда звать глубокое ревью» — +**двумя списками**: области, которые смотрят целиком (узлы с частым возвратом, +места с историей инцидентов, код под дорогое решение), и **необратимое здесь** — +что в этом проекте после мерджа не откатывается обратной правкой. Второй список +работает и в цикле задачи: находка в таком месте уходит человеку развилкой, а не +чинится молча. Само правило — в [canon.md](canon.md), раздел `review.md`. + +**Что сделать проекту.** + +1. **Переписать подраздел в `docs/review.md`.** Заголовок «Триггеры метки» + становится «Когда звать глубокое ревью», содержимое — два списка выше. + Признаки, годные только для выбора метки («больше N файлов», «затронуто больше + одного слоя»), выбрасываются: состава прогона они не меняют. Что из прежнего + списка называло **необратимое место** — переносится во второй список дословно. +2. **Пройти по документам** — `grep -rniE "small|medium|large|метк" docs/`. + Найденное в `review.md`, `conventions/` и `adr/` правится по смыслу: описание + прошлого решения остаётся как свидетельство, действующая инструкция — + переписывается или снимается. +3. **Поднять версию** — `docs.py bump`, последним шагом. +4. `docs.py check` — до отсутствия дрейфа. + +**Чего делать не надо.** Заводить ключ `[docs] healthcheck_last` руками: он +необязательный и появится сам первым прогоном `av-dev:doc-healthcheck`. Править +прошлые записи журналов и архивные change — тоже: метка, стоявшая в них, верна +как свидетельство о том дне. + +--- + ## Версия 4 — 2026-08-13 Слово **провенанс** снято из словаря языка проектных текстов и заменено русским. diff --git a/av-dev/skills/code-deep-review/SKILL.md b/av-dev/skills/code-deep-review/SKILL.md index 76e11a1..ce8b64a 100644 --- a/av-dev/skills/code-deep-review/SKILL.md +++ b/av-dev/skills/code-deep-review/SKILL.md @@ -31,8 +31,8 @@ description: "Глубокое ревью области кода — не за **Вход этому скиллу копят проходы цикла.** Строка «отложено в `av-dev:code-deep-review`» в границах покрытия называет тему, место и запуск, которым это проверяется; триаж сводит такие строки в отдельную секцию отчёта. -Второй источник — сигнал «это изменение просит глубокого ревью», который подаёт -`review-code`. +Второй источник — сигнал «это изменение просит глубокого ревью»: его подаёт +`review-code` всегда и `review-basics`, когда запускается. ## Когда звать @@ -119,16 +119,20 @@ capability — одним адресом или несколькими. Скил ## Состав прогона -Состав **постоянный**, и глубина у всех проходов одна — **доказательство**. -Постоянен и состав цикла задачи, но он другой и мельче: разница между скиллами не -в старательности, а в том, что здесь запускают, меряют и строят путь. +Состав **постоянный**, но глубина у проходов **разная, и это не небрежность**. +Доказательство дают те двое, что держат машину: `review-adversary` прогоняет +падающий тест, `review-ops` снимает числа замером. `review-architecture` и +`review-code` машину не держат — они дают **разбор на входе шире диффа**, и +выдать доказательство им нечем. Постоянен и состав цикла задачи, но он другой и +мельче: разница между скиллами не в старательности, а в том, что здесь запускают, +меряют и строят путь. | Проход | Тема | Что делает | |---|---|---| | `review-adversary` | `security` | строит путь и **прогоняет** падающий тест | | `review-ops` | `operations` | снимает числа замером: удержание, рост, деградация | | `review-architecture` | `architecture` | концептуальная целостность на входе шире диффа | -| `review-code` | `conventions` и техника | читает код **как код**, целиком, а не диффом | +| `review-code` | `conventions`, техника, инварианты | читает код **как код**, целиком, а не диффом; потолков здесь нет | | `review-triage` | — | единственный сток: дедуп, оракулы, потолок | **Гейта здесь нет, и это не пропуск.** Гейт судит изменение — красный он или diff --git a/av-dev/skills/code-openspec/references/config-skeleton.md b/av-dev/skills/code-openspec/references/config-skeleton.md index a628fea..8d2206d 100644 --- a/av-dev/skills/code-openspec/references/config-skeleton.md +++ b/av-dev/skills/code-openspec/references/config-skeleton.md @@ -43,8 +43,8 @@ context: | Пересказа этих документов здесь нет намеренно: второй дом факта расходится с первым молча, и заметно это становится в предложении, которое уже написано. - Ревью: правило выбора метки и состав проходов здесь не пересказываем — их дом - скилл av-dev:code-review, проектная настройка — docs/review.md. + Ревью: состав проходов и глубину тем здесь не пересказываем — их дом скилл + av-dev:code-review, проектная настройка — docs/review.md. Конвенции кода: механизированное проверяет гейт, прозой остаётся docs/conventions/. Ни состав шагов гейта, ни перечень конвенций здесь не diff --git a/av-dev/skills/code-review/SKILL.md b/av-dev/skills/code-review/SKILL.md index 166e343..209d069 100644 --- a/av-dev/skills/code-review/SKILL.md +++ b/av-dev/skills/code-review/SKILL.md @@ -1,6 +1,6 @@ --- name: code-review -description: "Конвейер ревью изменения, устроенный по темам: документ проекта либо заводит тему ревью, либо питает чужую тему источником, либо процессный и в ревью не читается вовсе. Ядро тем — requirements, autotests, conventions, architecture, security, operations; список тем открытый, свои темы проект заводит документом. Состав прогона постоянный, метки у него нет: гейт (autotests), сверка со спекой (specs), разбор кода и конвенций (code), триаж; приёмник тем (basics) идёт, когда у проекта есть свои темы. Цикл задачи проверяет корректность и механику против записанного критерия — дельта-спеки, конвенции, инварианты CLAUDE.md, вывод инструментов. Темы риска и устройства — security, operations, architecture — закрыты в цикле только сверкой с записанными инвариантами: их разбор, доказательство запуском и суждение о форме решения живут в скилле av-dev:code-deep-review, который идёт по области кода и время от времени. Порядок прогона — граф зависимостей: гейт открывает проходы с мнением, триаж — единственный сток. Находки по умолчанию чинятся инлайн и молча; человеку уходит только необратимое и то, что меняет дельта-спеки, а задачи из урожая заводятся по его слову. Проектная специфика приходит из документов канона проекта. Вызывается из скилла av-dev:code-resolve после apply. Второй вызов идёт от сценария обслуживания: без change, фиксированным планом (autotests, operations, плюс conventions, если тронут код)." +description: "Конвейер ревью изменения, устроенный по темам: документ проекта либо заводит тему ревью, либо питает чужую тему источником, либо процессный и в ревью не читается вовсе. Ядро тем — requirements, autotests, conventions, architecture, security, operations; список тем открытый, свои темы проект заводит документом. Состав прогона постоянный, метки у него нет: гейт (autotests), сверка со спекой (specs), разбор кода и конвенций (code), триаж; приёмник тем (basics) идёт, когда у проекта есть свои темы. Цикл задачи проверяет корректность и механику против записанного критерия — дельта-спеки, конвенции, инварианты CLAUDE.md, вывод инструментов. Темы риска и устройства — security, operations, architecture — закрыты в цикле только сверкой с записанными инвариантами: их разбор, доказательство запуском и суждение о форме решения живут в скилле av-dev:code-deep-review, который идёт по области кода и время от времени. Порядок прогона — граф зависимостей: гейт открывает проходы с мнением, триаж — единственный сток. Находки по умолчанию чинятся инлайн и молча; человеку уходит только необратимое, трогающее инвариант CLAUDE.md и меняющее дельта-спеки, а задачи из урожая заводятся по его слову. Проектная специфика приходит из документов канона проекта. Вызывается из скилла av-dev:code-resolve после apply. Второй вызов идёт от сценария обслуживания: без change, фиксированным планом (autotests, operations, плюс conventions, если тронут код)." --- # Конвейер ревью @@ -188,7 +188,9 @@ description: "Конвейер ревью изменения, устроенны **Проектная тема закрывается `basics`**, и только она. Именных проходов конечное число, а тем — сколько заведёт проект; приёмник обязателен, иначе открытость -списка была бы обещанием без механизма. Темы **ядра** он не держит вовсе: +списка была бы обещанием без механизма. Темы **ядра** он не держит **в цикле +задачи** — на прогоне обслуживания план сценария даёт ему `operations`, и это +единственное исключение (раздел «Прогон без change»). В цикле: `requirements` закрывает `specs`, `conventions` и технику — `code`, а риск и устройство — тот же `code` сверкой с инвариантами. Отсюда правило состава: **`basics` запускается тогда и только тогда, когда ему есть что принимать** — см. @@ -322,9 +324,12 @@ charter'а, а модель потом двигает калибровка, и ## Состав прогона — постоянный -**Ступени нумерованы и наружу не выходят.** Прогон ревью один, и зовёт его +**Ступени нумерованы, и наружу выходит одна.** Прогон ревью один, и зовёт его `av-dev:code-resolve` после того, как код написан; членение внутри прогона — -ступени, и знать их снаружи не нужно. Перечень осей процесса целиком — +ступени, и знать их снаружи не нужно. Исключение единственное и названное: +**ступень 1**, автотесты, — на неё ссылаются снаружи, потому что она умеет +засчитать чужой прогон гейта по отпечатку дерева, и вызывающему надо знать, куда +этот отпечаток едет. Перечень осей процесса целиком — [shared/axes.md](../../shared/axes.md). **Состав не выводится ни из чего: он один и тот же на всякой задаче.** Гейт, @@ -487,7 +492,7 @@ flowchart TD |---|---|---| | `autotests` | да | запускает инструменты проекта — но он источник графа и один по построению | | `triage` | да | проверяет оракул `major` запуском — но он сток и тоже один | -| `specs`, `code`, `basics`, `rubric` | нет | читают и рассуждают, ничего не исполняют | +| `specs`, `code`, `basics` | нет | читают и рассуждают, ничего не исполняют | **В цикле задачи цепочки за машину нет.** Оба прохода, что её держали — `adversary` и `ops`, — переехали в скилл `av-dev:code-deep-review`; там правило @@ -504,8 +509,10 @@ flowchart TD державшихся на таких замерах; у каждого проекта они свои и лежат в журнале `docs/review.md`. -Проект вправе пометить «держит машину» и другой проход — в `docs/review.md`, -разделе настройки конвейера. Снимать пометку с перечисленных нельзя. +Проект вправе пометить «держит машину» и другой проход — строкой в подразделе +**«Недоступно проверке»** файла `docs/review.md`: своего подраздела у пометки нет, +и заводить его канон не станет ради одного проекта. Читает её тот, кто строит +порядок прогона, то есть этот скилл. Снимать пометку с перечисленных нельзя. ### Находка «переделать форму» — прогон повторяется целиком @@ -554,7 +561,7 @@ flowchart TD ## Прогон без change — сценарий обслуживания -Третий вызывающий конвейера — сценарий обслуживания скилла `av-dev:code-resolve` +Второй вызывающий конвейера — сценарий обслуживания скилла `av-dev:code-resolve` (тулчейн и сборка, зависимости, гит-хуки, перенос, чистка). Он приходит **без change**: у работы, не меняющей поведения, дельта-спек нет по построению. @@ -709,7 +716,7 @@ change**: у работы, не меняющей поведения, дельт **Технический разбор — не тема, а обязанность прохода, и он единственный.** Остальные читают код как материал для своей оптики: `specs` — против требований, -`basics` — против отказов окружения, `architecture` — против устройства. «Здесь +`basics` — против отказов окружения проекта. «Здесь ошибка в логике» не говорит больше никто, и до недавнего времени не говорил никто вовсе: `code` был проходом только по конвенциям, а дефект ловился разве что случайно. Это была самая крупная дыра конвейера, и стоила она дороже любой @@ -789,9 +796,9 @@ change»: сверять исход с планом триаж обязан и ущербу × вероятности → потолок 7 пунктов в основном списке. **Разметку действия ставит он же, и умолчание у неё одно — `инлайн`.** Развилку -получает только то, что инлайном чинить нельзя: находка по необратимому месту и -находка, чья правка меняет дельта-спеки. Остальное чинится молча — см. «Что -происходит с находками дальше». +получает только то, что инлайном чинить нельзя, и оснований у неё три: правка +меняет дельта-спеки, находка сидит в необратимом месте, находка трогает инвариант +`CLAUDE.md`. Остальное чинится молча — см. «Что происходит с находками дальше». **Он же собирает строки «отложено в `av-dev:code-deep-review`».** Проход, упёршийся в предел цикла — нужен замер, нужен прогнанный путь, нужен вход шире диффа, — @@ -821,11 +828,17 @@ change»: сверять исход с планом триаж обязан и - **`Действие: развилка`** — вопросом с вариантами и ценой каждого туда, где проект держит вопросы (это знает вызвавший скилл, а не конвейер ревью). - Помечается так **только** то, что инлайном чинить нельзя: находка по - необратимому месту (миграция, формат на диске, публичный контракт) и находка, - чья правка меняет **дельта-спеки** — то есть отменяет одобренное человеком. - Оркестратор при этом не останавливается: он урезает изменение до остатка и - доводит его. + Помечается так **только** то, что инлайном чинить нельзя, и оснований ровно + три: находка по **необратимому** месту (миграция, формат на диске, публичный + контракт), находка, трогающая **инвариант** `CLAUDE.md`, и находка, чья правка + меняет **дельта-спеки** — то есть отменяет одобренное человеком. + + По первым двум основаниям оркестратор **не останавливается**: он урезает + изменение до остатка и доводит его. Третье старше: правка, меняющая + дельта-спеки, отменяет одобрение, и оркестратор **возвращается на чекпоинт** + (`av-dev:code-resolve`, `references/solve.md`, шаг 5). Вопрос в запись при этом + остаётся, но возврата не заменяет — иначе одобренный дизайн переделывался бы + молча. - **урожай** — находка реальная, но не для этого мерджа: отложенный `major`, развилка, решённая «потом», пачка `nit`. Конвейер отдаёт её **списком** в отчёте: формулировка, оракул, откуда взялась (какой проход, какой change). diff --git a/av-dev/skills/code-review/references/project-facts.md b/av-dev/skills/code-review/references/project-facts.md index 745ee57..9c8cff0 100644 --- a/av-dev/skills/code-review/references/project-facts.md +++ b/av-dev/skills/code-review/references/project-facts.md @@ -98,7 +98,8 @@ **Кто какой документ читает — из документа не выводится, а назначается планом.** Документ питает тему (это записано на стороне канона, таблица «Роли документов и темы ревью»), а тему на этом прогоне закрывает тот, кто назван в составе прогона; вся -раскладка «тема → проход → глубина» — в `SKILL.md` этого скилла и больше нигде. +раскладка «тема → кто закрывает → против чего» — в `SKILL.md` этого скилла и +больше нигде. **Списка читателей не ведёт никто, и это не пробел.** Он жил бы на стороне канона, а документ живёт дольше, чем раскладка проходов: список разошёлся бы с конвейером молча и при этом выглядел актуальным. Однажды уже разошёлся. diff --git a/av-dev/skills/doc-healthcheck/SKILL.md b/av-dev/skills/doc-healthcheck/SKILL.md index c5f414d..e8285ee 100644 --- a/av-dev/skills/doc-healthcheck/SKILL.md +++ b/av-dev/skills/doc-healthcheck/SKILL.md @@ -150,6 +150,12 @@ check` и его скрипт; здесь начинается там, где к этого делать нечего. Его отсутствие значит «сверки не было ни разу», и синк говорит это отдельной строкой. +**Правку следа коммитит тот, кто позвал прогон.** Своего коммита у скилла нет: +он правит документы, заводит задачи и ставит след — всё это уезжает одним +коммитом разбора, и `last` в нём указывает на **прежний** `HEAD`, то есть на +состояние, которое сверяли. Оставить правку незакоммиченной нельзя: счёт пойдёт +от коммита, которого в истории нет. + **Позвал одного агента из двух — след всё равно ставится, но в докладе назван неполным.** Иначе следующая сверка отсчитывалась бы от прогона, который смотрел половину. diff --git a/av-dev/skills/task-track/SKILL.md b/av-dev/skills/task-track/SKILL.md index 1ec8e80..3f9d1a4 100644 --- a/av-dev/skills/task-track/SKILL.md +++ b/av-dev/skills/task-track/SKILL.md @@ -244,20 +244,22 @@ stateDiagram-v2 **напоминает** — беклог, заведённый до появления типа, законен, и переоформлять его «заодно» здесь не просят. -**Тип не выбирает метку ревью и глубину проверки.** Профиль выбирается по факту -изменения, а не по типу задачи: `chore` бывает миграцией схемы, `fix` — правкой -публичного контракта. Правило «предписание процесса в теле задачи снимается» -типом не отменяется, а подтверждается: он описывает работу, а не то, как её -проверять. **Стадия проекта их тоже не выбирает**: изменение на стройке ничем не -проще того же изменения на доработке, и метку ему по-прежнему назначает разметка. +**Тип не выбирает состав ревью и глубину проверки — и не выбирает их больше +никто.** Состав прогона постоянный: он один и тот же на всякой задаче +(`av-dev:code-review`, «Состав прогона»). Прежде состав считала метка `small` · +`medium` · `large`, и тогда эта строка отвечала на живой вопрос «не задаёт ли её +тип»; метки нет, и вопрос снят вместе с ней. Правило «предписание процесса в теле +задачи снимается» типом не отменяется, а подтверждается: он описывает работу, а +не то, как её проверять. **Стадия проекта состава тоже не выбирает**: изменение +на стройке ничем не проще того же изменения на доработке. **Одно исполнителю тип всё же говорит — каким сценарием работу вести, и то не один.** Скилл `av-dev:code-resolve` выбирает сценарий связкой из двух признаков: тип **предлагает** (`chore` — обслуживание, `research` — разведка), а подтверждает его предмет работы — есть ли что менять в спеках. Признаки разошлись — работа останавливается, и тип меняется здесь, командой `edit --type`, -а не переклеивается исполнителем по ходу. Метку и глубину это по-прежнему не -задаёт: их называет разметка изменения, а на прогоне без change — сам сценарий. +а не переклеивается исполнителем по ходу. Состава ревью это по-прежнему не +задаёт: он постоянный, а на прогоне без change его называет сам сценарий. ## Как написана задача @@ -567,9 +569,9 @@ python3 $tk adopt scan --from … --stage S | apply --plan … # разова **каждая давать видимую пользу**, а у штурма исход «выкинуть» — полноправный. Там же **шов**: где резать, когда допустимых мест несколько. Коротко — по -границе, которая одна поднимает метку ревью выше остальных; и не резать, когда -обе половины остаются в одной метке, потому что несокращаемый костяк проверок -платится за каждую задачу отдельно. +границе, где **меняется род работы**; и резать пореже, потому что костяк ревью +разрез удваивает **всегда** — состав прогона постоянный и от размера половин не +зависит. Выигрыш даёт не проверка, а то, что половина доводится и мерджится сама. ### Вычитка: два прохода, а не один @@ -633,9 +635,10 @@ python3 $tk adopt scan --from … --stage S | apply --plan … # разова - **свойство репозитория в рамках** — номер миграции, хеш, версия зависимости: в лежалой задаче протухает молча и становится ложной рамкой. Снимается; снимок берётся при постановке, а не при заведении; -- **предписание процесса в теле** — «делать с такой-то меткой ревью», «взять - такой-то агент»: это второй дом для правила выбора и путь понизить требования - решением, принятым до проектирования. Снимается; +- **предписание процесса в теле** — «прогнать глубоким ревью», «взять такой-то + агент», «этой задаче хватит короткой проверки»: это второй дом для правила + выбора и путь понизить требования решением, принятым до проектирования. + Снимается; - **тип, разошедшийся с задачей** — задача заводилась починкой, а после разбора оказалось, что поведение никогда и не было заявлено: это `feature`, а не `fix`. Правится `edit --type …`; тип, оставшийся от прошлой формулировки, врёт diff --git a/decisions/81-elder-debt-of-transformation-cleared.md b/decisions/81-elder-debt-of-transformation-cleared.md new file mode 100644 index 0000000..66970c5 --- /dev/null +++ b/decisions/81-elder-debt-of-transformation-cleared.md @@ -0,0 +1,78 @@ +# 81. Старший долг трансформации разобран: развилка, вопросы тем, версия 5 (2026-08-23) + +## Что было + +Тема 80 свела противоречия, внесённые темой 78, и назвала строкой С287 то, что +осталось: находки ревью, которые старше трансформации хвоста и тянутся с тем 74–77. +Этот заход разбирает их. + +Долг был четырёх родов. **Перечень, разошедшийся с исполнителем**: конвейер +называл два основания развилки, а устав триажа, контракт находок, сценарий решения +и журнал — три. **Остатки снятого устройства**: `task-track/SKILL.md` объяснял, что +метку назначает разметка, и искал шов по границе, «которая поднимает метку»; +`config-skeleton.md` увозил в конфиг чужого проекта строку про «правило выбора +метки». **Обещание без исполнителя**: конвейер обещал каждому проходу вопросы +проекта по его темам, а три прохода из четырёх о вопросах не знали и места под +ответ не имели. **Скилл, разошедшийся с уставами, которые он зовёт**: +`av-dev:code-deep-review` назначал `review-code` глубину «доказательство» и отменял +триажу потолок, ничего об этом уставам не сказав. + +Отдельно стояла **непройденная миграция**: тема 77 переписала скелет +`docs/review.md`, который уезжает в репозиторий проекта, а записи в журнале версий +канона не появилось. Проекты, приведённые к версии 4, остались с подразделом +«Триггеры метки» под словарь, которого больше нет. + +## Решено + +**Р331. Оснований у развилки три, и перечень сведён по всем местам.** Правка +меняет дельта-спеки, находка сидит в необратимом месте, находка трогает инвариант +`CLAUDE.md`. Там же названо, чем третье отличается: по первым двум оркестратор не +останавливается, а урезает изменение до остатка; третье отменяет одобрение и +**возвращает на чекпоинт**. + +**Р332. Вопросы проекта по темам достались проходам, которые эти темы закрывают.** +`review-code` (`conventions`, `security`, `operations`, `architecture`), +`review-specs` (`requirements`) и `review-autotests` (`autotests`) получили +обязанность отвечать дословно и строку в блоке покрытия. Задание вопросов не +принесло — это говорится строкой: молча пропущенный вопрос неотличим от +отвеченного, а других способов настроить проход под проект у проекта нет. + +**Р333. Глубина в глубоком ревью — не одна на всех.** Доказательство дают те двое, +что держат машину; `review-architecture` и `review-code` дают разбор на входе шире +диффа, и выдать доказательство им нечем. `review-code` получил единственную +оговорку про вызов оттуда: вход — область, потолков нет, машину он не держит и там. + +**Р334. У триажа три вызывающих, а не два режима.** Прогон по change, прогон без +change и глубокое ревью области, где перечень приходит составом прогона, а потолка +в 7 пунктов нет: отчёт читает человек и разбирает находки по одной, поэтому вместо +среза — порядок по убыванию ущерба. + +**Р335. Версия раскладки поднята до 5.** Запись журнала называет, что переехало +(подраздел «Триггеры метки» → «Когда звать глубокое ревью», двумя списками) и что +сделать проекту: переписать подраздел, пройти по документам грепом, поднять +версию, догнать `check`. Ключ `[docs] healthcheck_last` руками заводить не надо — +он появится сам. + +**Р336. Перечень осей досчитал три оси**, которые ветвили поведение годами: +глубина темы, разметка действия, род правки документа. Каждая жила в своём скилле +и оттуда была видна, а из перечня — нет; ровно за этим перечень и заведён. + +## Следствия + +**С288. След сверки коммитит тот, кто позвал прогон.** Своего коммита у +`av-dev:doc-healthcheck` нет, и незакоммиченный след означал бы счёт от коммита, +которого в истории не существует. + +**С289. Проекты на версии 4 теперь видят дрейф.** `docs.py check` называет +повышение прямо и зовёт `upgrade`; до этой темы расхождение скелета с каноном не +замечала ни машина, ни человек. + +**С290. Три прохода стали дороже ровно на то, что проект им скажет.** Вопросы по +темам — механизм настройки, который до сих пор работал только у приёмника тем; +пустой подраздел в `docs/review.*` ничего не стоит, а непустой перестал пропадать +молча. + +**С291. Ревью трансформации закрыто в три захода**, и цена его известна: одна +рабочая поломка (тема 79), четыре противоречия внутри новой темы (тема 80) и +двенадцать мест старшего долга (эта). Гейт не поймал ни одного: он судит форму, а +всё перечисленное — согласованность утверждений. diff --git a/decisions/README.md b/decisions/README.md index 118086b..134940e 100644 --- a/decisions/README.md +++ b/decisions/README.md @@ -132,3 +132,4 @@ | 78 | [Хвост задачи: отражение молча, новое — по слову](78-tail-reflection-silent-new-by-word.md) | 2026-08-23 | | 79 | [След сверки переехал в секцию docs; ключ верхнего уровня ронял скрипты](79-healthcheck-trace-moved-into-docs-section.md) | 2026-08-23 | | 80 | [Противоречия хвоста сведены: кто зовёт учёт, когда идёт третий такт](80-tail-contradictions-fixed.md) | 2026-08-23 | +| 81 | [Старший долг трансформации разобран: развилка, вопросы тем, версия 5](81-elder-debt-of-transformation-cleared.md) | 2026-08-23 |