av-dev-pipeline стал av-dev-code, review-pipeline — review

Имя описывало устройство, а не предмет: «пайплайн» говорит, что внутри
конвейер, — а плагин занят кодом по задачам, и с появлением чекпоинтов
он уже не конвейер в чистом виде. Набор имён стал параллельным:
docs / tasks / code / git, каждое называет материал.

Заодно review-pipeline стал review — слово ушло из плагина целиком, а
не наполовину; скиллы выровнялись: resolve / review / openspec.

Журнал версий канона переписан вместе со всеми, DECISIONS.md — нет.
Разрез по типу высказывания, а не файла: наблюдение и причина
неприкосновенны, предписание и адрес обязаны оставаться исполнимыми.
Запись версии 10 велит «проверить, что плагин av-dev-pipeline
установлен» — проект, дошедший до неё, выполнил бы невыполнимое.
This commit is contained in:
av
2026-08-09 15:43:03 +03:00
parent c5e6883461
commit 53cf6baedf
40 changed files with 145 additions and 109 deletions
+2 -2
View File
@@ -16,8 +16,8 @@
"description": "Задачи и цели каталогом markdown-файлов, у каждой записи тип, и тип задаёт её схему. Спринт под одну цель, ритуал между спринтами, проверка согласованности скриптом tasks.py. Задача выполняется чем угодно: пайплайна плагин не требует и сам его не зовёт." "description": "Задачи и цели каталогом markdown-файлов, у каждой записи тип, и тип задаёт её схему. Спринт под одну цель, ритуал между спринтами, проверка согласованности скриптом tasks.py. Задача выполняется чем угодно: пайплайна плагин не требует и сам его не зовёт."
}, },
{ {
"name": "av-dev-pipeline", "name": "av-dev-code",
"source": "./av-dev-pipeline", "source": "./av-dev-code",
"description": "Решение одной задачи от постановки до закрытия: цикл SDD с чекпоинтом объяснения после ревью дизайна, у исследовательской задачи — ещё и чекпоинт вариантов до первого требования. Конвейер ревью с обязательным триажем. Требует OpenSpec. Задача принимается и обычным текстом; плагины av-dev-docs и av-dev-tasks опциональны — первый даёт документы канона для проходов ревью, второй учёт задач, без них прогон деградирует поразрядно и говорит об этом." "description": "Решение одной задачи от постановки до закрытия: цикл SDD с чекпоинтом объяснения после ревью дизайна, у исследовательской задачи — ещё и чекпоинт вариантов до первого требования. Конвейер ревью с обязательным триажем. Требует OpenSpec. Задача принимается и обычным текстом; плагины av-dev-docs и av-dev-tasks опциональны — первый даёт документы канона для проходов ревью, второй учёт задач, без них прогон деградирует поразрядно и говорит об этом."
}, },
{ {
+36
View File
@@ -3460,3 +3460,39 @@ change нет — берём источником актуальные спек
187. **Послабление, введённое ради одного потребителя, уходит вместе с ним.** 187. **Послабление, введённое ради одного потребителя, уходит вместе с ним.**
Исключение переживает своего заказчика и выглядит общим правилом; удаляя Исключение переживает своего заказчика и выглядит общим правилом; удаляя
потребителя, ищи его исключения — они и есть настоящий хвост. потребителя, ищи его исключения — они и есть настоящий хвост.
## 56. `av-dev-pipeline``av-dev-code`, `review-pipeline``review` (2026-08-09)
**АЕАКО. Имя описывало устройство, а не предмет.** «Пайплайн» говорит, что внутри
конвейер, — а плагин занят кодом по задачам, и после появления чекпоинтов он уже
не конвейер в чистом виде: между остановками автоматика, на остановках разговор.
**Набор имён стал параллельным, и это довод сам по себе:** `docs` / `tasks` /
`code` / `git` — каждое называет **материал**, которым плагин занят. Прежнее имя
выбивалось: три существительных и одна метафора устройства. По той же причине
отвергнут `av-dev-solve` — глагол в ряду существительных, плюс заикание в главном
вызове (`solve:resolve`), — и `av-dev-work`: «работы» в этом репозитории уже
значат конкретное (цели и задачи роадмапа, секция «Сопровождение»), и имя начало
бы спорить со словарём.
Заодно `review-pipeline` стал `review`: слово «пайплайн» ушло из плагина целиком,
а не наполовину, и скиллы выровнялись — `resolve` / `review` / `openspec`.
**Журнал версий канона переписан вместе со всеми, и это не нарушение правила «не
переписываем задним числом».** Разрез проходит не по типу файла, а по типу
высказывания. Наблюдение и причина — неприкосновенны: их правка есть
фальсификация. **Предписание и адрес обязаны оставаться исполнимыми**: запись
версии 10 велит «проверить, что плагин `av-dev-pipeline` установлен», и проект,
дошедший до неё, выполнит невыполнимое. `DECISIONS.md` при этом не тронут — в нём
нет предписаний проекту, только записи о принятых решениях; там прежнее имя
верно, потому что описывает состояние на дату записи.
### Что из этого следует
188. **Имя плагина называет материал, а не устройство.** Устройство меняется —
конвейер обзавёлся остановками, — а материал остаётся. Имя по устройству
протухает первым и при этом выглядит осмысленным.
189. **Журнал не переписывается в наблюдениях и обязан оставаться исполнимым в
предписаниях.** Правило «не задним числом» защищает от подделки фактов, а не
от починки инструкций: инструкция, ссылающаяся на несуществующее, — не
свидетельство эпохи, а поломка с отложенным сроком.
+12 -11
View File
@@ -27,7 +27,8 @@
вычитывают их два отдельных прохода: `task-form` (форма записи) и вычитывают их два отдельных прохода: `task-form` (форма записи) и
`task-wording` (язык записей); `task-wording` (язык записей);
- `session` — ритуал между спринтами и ведение спринта. - `session` — ритуал между спринтами и ведение спринта.
- **av-dev-pipeline** — исполнение. **Требует OpenSpec и сам его заводит.** - **av-dev-code** — код по задачам: решение одной задачи и его проверка.
Владеет `openspec/`. **Требует OpenSpec и сам его заводит.**
- `openspec` — завести, настроить и **проверить** `openspec/` в проекте: - `openspec` — завести, настроить и **проверить** `openspec/` в проекте:
`openspec init`, замена примера в `config.yaml` настройкой канонической `openspec init`, замена примера в `config.yaml` настройкой канонической
формы, скрипт `openspec.py` (форма файла + сверка слепка с живой версией формы, скрипт `openspec.py` (форма файла + сверка слепка с живой версией
@@ -39,7 +40,7 @@
**чекпоинта вариантов** — способы решить, цена каждого, рекомендация; выбор **чекпоинта вариантов** — способы решить, цена каждого, рекомендация; выбор
оседает по адресу, который назвала сама задача. Между чекпоинтами — без оседает по адресу, который назвала сама задача. Между чекпоинтами — без
согласований; согласований;
- `review-pipeline` — конвейер ревью **по темам**: документ проекта либо - `review` — конвейер ревью **по темам**: документ проекта либо
заводит тему проверки, либо питает чужую тему источником, либо процессный и в заводит тему проверки, либо питает чужую тему источником, либо процессный и в
ревью не читается вовсе. Разметка идёт **один раз на задачу**, сразу после ревью не читается вовсе. Разметка идёт **один раз на задачу**, сразу после
`propose`: агент `review-scope` меряет изменение по двум осям — размер и `propose`: агент `review-scope` меряет изменение по двум осям — размер и
@@ -57,9 +58,9 @@
```mermaid ```mermaid
flowchart TB flowchart TB
subgraph pipe["av-dev-pipeline — исполнение, требует OpenSpec"] subgraph pipe["av-dev-code — исполнение, требует OpenSpec"]
direction LR direction LR
tp["resolve<br/>2 чекпоинта человеку"] --> rp["review-pipeline<br/>10 агентов-проходов"] tp["resolve<br/>2 чекпоинта человеку"] --> rp["review<br/>10 агентов-проходов"]
osp["openspec<br/>заводит и проверяет openspec/"] osp["openspec<br/>заводит и проверяет openspec/"]
end end
subgraph docsp["av-dev-docs — документация, владеет docs/"] subgraph docsp["av-dev-docs — документация, владеет docs/"]
@@ -85,10 +86,10 @@ flowchart TB
tp --> tasks tp --> tasks
``` ```
Зависимости **односторонние: `av-dev-pipeline` знает про `av-dev-docs` и Зависимости **односторонние: `av-dev-code` знает про `av-dev-docs` и
`av-dev-tasks`, обратно — нет.** Между собой эти двое тоже не связаны жёстко: `av-dev-tasks`, обратно — нет.** Между собой эти двое тоже не связаны жёстко:
каждый работает без другого. Как именно зовут соседа и что делают, когда вызов не каждый работает без другого. Как именно зовут соседа и что делают, когда вызов не
разрешился, — `shared/plugin-boundary.md`: правило нужно семи скиллам в трёх разрешился, — `shared/plugin-boundary.md`: правило нужно шести скиллам в двух
плагинах, и ни один им не владеет. То, что нужно нескольким дословно — граница плагинах, и ни один им не владеет. То, что нужно нескольким дословно — граница
плагинов, язык проектных текстов, словарь сопровождения, — живёт домом в плагинов, язык проектных текстов, словарь сопровождения, — живёт домом в
`shared/` и уезжает в каждый плагин помеченной копией. `shared/` и уезжает в каждый плагин помеченной копией.
@@ -116,7 +117,7 @@ flowchart TB
Отдельного файла-брифа при этом нет — проходы читают документы напрямую; карта Отдельного файла-брифа при этом нет — проходы читают документы напрямую; карта
«тема → её дом → что оттуда берётся» — «тема → её дом → что оттуда берётся» —
[project-facts.md](av-dev-pipeline/skills/review-pipeline/references/project-facts.md). [project-facts.md](av-dev-code/skills/review/references/project-facts.md).
Прийти в старый проект и перевести его на канон — `/av-dev-docs:canon`. Канон Прийти в старый проект и перевести его на канон — `/av-dev-docs:canon`. Канон
версионируется, и проекты повышаются по [журналу версионируется, и проекты повышаются по [журналу
@@ -137,7 +138,7 @@ claude plugin marketplace add https://git.vakhrushev.me/av/dev-skills.git --scop
# плагины: scope обязателен, умолчание у команды — user, а нам нужен project # плагины: scope обязателен, умолчание у команды — user, а нам нужен project
claude plugin install av-dev-docs@av-dev-skills --scope project claude plugin install av-dev-docs@av-dev-skills --scope project
claude plugin install av-dev-tasks@av-dev-skills --scope project claude plugin install av-dev-tasks@av-dev-skills --scope project
claude plugin install av-dev-pipeline@av-dev-skills --scope project claude plugin install av-dev-code@av-dev-skills --scope project
claude plugin install av-dev-git@av-dev-skills --scope project claude plugin install av-dev-git@av-dev-skills --scope project
``` ```
@@ -155,7 +156,7 @@ claude plugin install av-dev-git@av-dev-skills --scope project
"enabledPlugins": { "enabledPlugins": {
"av-dev-docs@av-dev-skills": true, "av-dev-docs@av-dev-skills": true,
"av-dev-tasks@av-dev-skills": true, "av-dev-tasks@av-dev-skills": true,
"av-dev-pipeline@av-dev-skills": true, "av-dev-code@av-dev-skills": true,
"av-dev-git@av-dev-skills": true "av-dev-git@av-dev-skills": true
} }
} }
@@ -186,7 +187,7 @@ claude plugin marketplace update av-dev-skills
cd /path/to/project cd /path/to/project
claude plugin update av-dev-docs@av-dev-skills --scope project claude plugin update av-dev-docs@av-dev-skills --scope project
claude plugin update av-dev-tasks@av-dev-skills --scope project claude plugin update av-dev-tasks@av-dev-skills --scope project
claude plugin update av-dev-pipeline@av-dev-skills --scope project claude plugin update av-dev-code@av-dev-skills --scope project
claude plugin update av-dev-git@av-dev-skills --scope project claude plugin update av-dev-git@av-dev-skills --scope project
``` ```
@@ -306,7 +307,7 @@ uv run python scripts/frontmatter.py # 0 в порядке, 1 расхожд
а не «имя не то»; а не «имя не то»;
- **цвет charter'а, не отвечающий его модели.** Цвет кодирует модель, а не роль - **цвет charter'а, не отвечающий его модели.** Цвет кодирует модель, а не роль
прохода — раскладка живёт в прохода — раскладка живёт в
[review-pipeline/SKILL.md](av-dev-pipeline/skills/review-pipeline/SKILL.md), [review/SKILL.md](av-dev-code/skills/review/SKILL.md),
разделе «Модель по проходу», здесь только её механизация. Держаться вниманием разделе «Модель по проходу», здесь только её механизация. Держаться вниманием
правило не может: цвет ставится один раз при заведении charter'а, а модель правило не может: цвет ставится один раз при заведении charter'а, а модель
потом меняется калибровкой. потом меняется калибровкой.
+9 -7
View File
@@ -16,8 +16,8 @@
## Где мы сейчас ## Где мы сейчас
Плагинов четыре, и каждый ставится отдельно: `av-dev-docs` (канон документов и Плагинов четыре, и каждый ставится отдельно: `av-dev-docs` (канон документов и
их содержимое), `av-dev-tasks` (задачи и цели), `av-dev-pipeline` (SDD и конвейер их содержимое), `av-dev-tasks` (задачи и цели), `av-dev-code` (код по задачам:
ревью, он же заводит OpenSpec), `av-dev-git`. Общее, что нужно нескольким цикл SDD, конвейер ревью, OpenSpec), `av-dev-git`. Общее, что нужно нескольким
дословно, живёт домом в `shared/` и уезжает копиями. дословно, живёт домом в `shared/` и уезжает копиями.
Канон документов — **версия 11**. Живые проекты стоят на 2–3 и на плагине Канон документов — **версия 11**. Живые проекты стоят на 2–3 и на плагине
@@ -31,9 +31,11 @@
### healthlog — первым ### healthlog — первым
- [ ] переустановить плагины: снять `av-dev-pm`, поставить `av-dev-docs` и - [ ] переустановить плагины: снять `av-dev-pm` и `av-dev-pipeline`, поставить
`av-dev-tasks`. `marketplace update`, затем `plugin update` — одного шага `av-dev-docs`, `av-dev-tasks`, `av-dev-code`, `av-dev-git`. Оба прежних
мало (README, «Обновление») имени мертвы, и `plugin update` их не переименует — только снять и
поставить. `marketplace update`, затем `plugin update` — одного шага мало
(README, «Обновление»)
- [ ] удалить проектные копии: `.claude/skills/healthlog-{task,review}-pipeline` - [ ] удалить проектные копии: `.claude/skills/healthlog-{task,review}-pipeline`
и девять `.claude/agents/healthlog-review-*.md`. Они прошлого поколения и и девять `.claude/agents/healthlog-review-*.md`. Они прошлого поколения и
после переезда указывают на документы, которых уже не будет после переезда указывают на документы, которых уже не будет
@@ -95,10 +97,10 @@
## 4. Пайплайн: что осталось после `resolve` ## 4. Пайплайн: что осталось после `resolve`
Сам скилл написан (`av-dev-pipeline:resolve`, два чекпоинта, ветка разведки), Сам скилл написан (`av-dev-code:resolve`, два чекпоинта, ветка разведки),
`task-batch` удалён. Осталось то, что на бумаге не проверяется: `task-batch` удалён. Осталось то, что на бумаге не проверяется:
- [ ] перемерить `review-pipeline` тем же вопросом, что и проект целиком: - [ ] перемерить скилл `review` тем же вопросом, что и проект целиком:
сколько из его стадий реально смотрятся глазами. Тысяча строк, и весь сколько из его стадий реально смотрятся глазами. Тысяча строк, и весь
автоматический участок между чекпоинтами держится на них автоматический участок между чекпоинтами держится на них
- [ ] чекпоинт «объяснение» собирается из `proposal.md` и `design.md`, а - [ ] чекпоинт «объяснение» собирается из `proposal.md` и `design.md`, а
@@ -1,5 +1,5 @@
{ {
"name": "av-dev-pipeline", "name": "av-dev-code",
"description": "Решение одной задачи от постановки до закрытия скиллом resolve — полный цикл Spec Driven Development с двумя плановыми остановками: чекпоинт вариантов у исследовательской задачи и чекпоинт с объяснением человеческим языком после ревью дизайна у всякой. Между ними работа идёт без согласований. Плюс конвейер ревью с детерминированным гейтом, сверкой со спеками, враждебными постановками, эксплуатационным постмортемом, независимой реализацией и обязательным триажем. Требует OpenSpec и сам его заводит скиллом openspec. Задача принимается и обычным текстом. Плагины av-dev-docs и av-dev-tasks опциональны: первый даёт документы канона, из которых проходы читают проектную конкретику, второй — учёт задач; без них прогон деградирует поразрядно и называет это строкой.", "description": "Решение одной задачи от постановки до закрытия скиллом resolve — полный цикл Spec Driven Development с двумя плановыми остановками: чекпоинт вариантов у исследовательской задачи и чекпоинт с объяснением человеческим языком после ревью дизайна у всякой. Между ними работа идёт без согласований. Плюс конвейер ревью с детерминированным гейтом, сверкой со спеками, враждебными постановками, эксплуатационным постмортемом, независимой реализацией и обязательным триажем. Требует OpenSpec и сам его заводит скиллом openspec. Задача принимается и обычным текстом. Плагины av-dev-docs и av-dev-tasks опциональны: первый даёт документы канона, из которых проходы читают проектную конкретику, второй — учёт задач; без них прогон деградирует поразрядно и называет это строкой.",
"author": { "author": {
"name": "Anton Vakhrushev", "name": "Anton Vakhrushev",
@@ -13,7 +13,7 @@ color: yellow
равно опасен. равно опасен.
Находки — по контракту Находки — по контракту
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/finding-contract.md` `${CLAUDE_PLUGIN_ROOT}/skills/review/references/finding-contract.md`
(точный путь конвейер передаёт в задании). (точный путь конвейер передаёт в задании).
**Ты помечен «держит машину»** — за тем, чтобы построенный путь можно было **Ты помечен «держит машину»** — за тем, чтобы построенный путь можно было
@@ -73,7 +73,7 @@ color: yellow
находкой. находкой.
Карта «что нужно проходу → где лежит» — Карта «что нужно проходу → где лежит» —
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`. `${CLAUDE_PLUGIN_ROOT}/skills/review/references/project-facts.md`.
**Деградация поразрядная, и каждый пробел называется своей строкой.** **Деградация поразрядная, и каждый пробел называется своей строкой.**
`docs/security.md` нет — работай по общей рамке ниже, `critical` не присваивай и `docs/security.md` нет — работай по общей рамке ниже, `critical` не присваивай и
@@ -25,7 +25,7 @@ color: yellow
и граф зависимостей есть только у тебя. и граф зависимостей есть только у тебя.
Находки — по контракту Находки — по контракту
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/finding-contract.md` `${CLAUDE_PLUGIN_ROOT}/skills/review/references/finding-contract.md`
(точный путь конвейер передаёт в задании). (точный путь конвейер передаёт в задании).
## Вход (собери до чтения диффа) ## Вход (собери до чтения диффа)
@@ -52,7 +52,7 @@ grep по именам концепций) и скажи об этом в гра
- дельта-спеки change. - дельта-спеки change.
Карта «что нужно проходу → где лежит» — Карта «что нужно проходу → где лежит» —
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`. `${CLAUDE_PLUGIN_ROOT}/skills/review/references/project-facts.md`.
Дифф — **последним, не первым**: он должен ложиться на карту, а не задавать её. Дифф — **последним, не первым**: он должен ложиться на карту, а не задавать её.
@@ -19,7 +19,7 @@ color: green
намеренно нет, из темы не выпадает — она уходит в границы покрытия. намеренно нет, из темы не выпадает — она уходит в границы покрытия.
Находки — по контракту Находки — по контракту
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/finding-contract.md` `${CLAUDE_PLUGIN_ROOT}/skills/review/references/finding-contract.md`
(точный путь конвейер передаёт в задании). Русская проза, идентификаторы и (точный путь конвейер передаёт в задании). Русская проза, идентификаторы и
команды — в оригинале. команды — в оригинале.
@@ -31,7 +31,7 @@ color: green
запускать запрещено, с путями. запускать запрещено, с путями.
Карта «что нужно проходу → где лежит» — Карта «что нужно проходу → где лежит» —
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`. `${CLAUDE_PLUGIN_ROOT}/skills/review/references/project-facts.md`.
**Семантики гейта в `CLAUDE.md` нет** — найди команду сама (`Taskfile.yml`, **Семантики гейта в `CLAUDE.md` нет** — найди команду сама (`Taskfile.yml`,
`Makefile`, `justfile`, `scripts/`) и выполни её, но: `critical` по основанию `Makefile`, `justfile`, `scripts/`) и выполни её, но: `critical` по основанию
@@ -36,7 +36,7 @@ color: yellow
самый дорогой проход, вместо которого его позвали. самый дорогой проход, вместо которого его позвали.
Находки — по контракту Находки — по контракту
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/finding-contract.md` `${CLAUDE_PLUGIN_ROOT}/skills/review/references/finding-contract.md`
(точный путь конвейер передаёт в задании). (точный путь конвейер передаёт в задании).
## Что тебе даёт план прогона ## Что тебе даёт план прогона
@@ -52,7 +52,7 @@ color: yellow
его неизбежным. его неизбежным.
Находки — по контракту Находки — по контракту
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/finding-contract.md` `${CLAUDE_PLUGIN_ROOT}/skills/review/references/finding-contract.md`
(точный путь конвейер передаёт в задании). Русская проза, идентификаторы и пути — (точный путь конвейер передаёт в задании). Русская проза, идентификаторы и пути —
в оригинале. Читай реальный код, ничего не выдумывай. в оригинале. Читай реальный код, ничего не выдумывай.
@@ -11,7 +11,7 @@ color: green
увидит владелец сервиса, и дойди до строки кода. увидит владелец сервиса, и дойди до строки кода.
Находки — по контракту Находки — по контракту
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/finding-contract.md` `${CLAUDE_PLUGIN_ROOT}/skills/review/references/finding-contract.md`
(точный путь конвейер передаёт в задании). (точный путь конвейер передаёт в задании).
**Ты помечен «держит машину».** Конвейер за это ставит тебя в цепочку с другими **Ты помечен «держит машину».** Конвейер за это ставит тебя в цепочку с другими
@@ -46,7 +46,7 @@ color: green
`docs/research/` процессный документ, и прогон его не открывает; чужое число `docs/research/` процессный документ, и прогон его не открывает; чужое число
неизвестной свежести делало находку похожей на доказанную, ничего не доказывая. неизвестной свежести делало находку похожей на доказанную, ничего не доказывая.
Почему именно так и какие ещё есть стыки — Почему именно так и какие ещё есть стыки —
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`, раздел `${CLAUDE_PLUGIN_ROOT}/skills/review/references/project-facts.md`, раздел
«Сшивать обязаны проходы». Там же карта «что нужно проходу → где лежит». «Сшивать обязаны проходы». Там же карта «что нужно проходу → где лежит».
Два обстоятельства почти всегда меняют цену отказов, и если документы их Два обстоятельства почти всегда меняют цену отказов, и если документы их
@@ -11,7 +11,7 @@ color: yellow
**порождаешь сам** — и делаешь это до того, как увидишь код. **порождаешь сам** — и делаешь это до того, как увидишь код.
Находки — по контракту Находки — по контракту
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/finding-contract.md` `${CLAUDE_PLUGIN_ROOT}/skills/review/references/finding-contract.md`
(точный путь конвейер передаёт в задании). Русская проза, идентификаторы — в (точный путь конвейер передаёт в задании). Русская проза, идентификаторы — в
оригинале. оригинале.
@@ -26,7 +26,7 @@ color: yellow
сформулированное по прецеденту, сильнее любого общего. сформулированное по прецеденту, сильнее любого общего.
Карта «что нужно проходу → где лежит» — Карта «что нужно проходу → где лежит» —
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`. `${CLAUDE_PLUGIN_ROOT}/skills/review/references/project-facts.md`.
**Документа нет — строка на каждый, отдельно.** Нет `docs/review.md`: «рода **Документа нет — строка на каждый, отдельно.** Нет `docs/review.md`: «рода
узлов и прецеденты неизвестны; требование „минимум три пункта специфичны для узлов и прецеденты неизвестны; требование „минимум три пункта специфичны для
@@ -186,7 +186,7 @@ color: green
**Ты меряешь изменение по двум независимым осям и называешь обе.** Метка — не **Ты меряешь изменение по двум независимым осям и называешь обе.** Метка — не
ответ на один вопрос, а максимум по двум измерениям. ответ на один вопрос, а максимум по двум измерениям.
Ниже рабочая выжимка. Дом правила — скилл `av-dev-pipeline:review-pipeline`, Ниже рабочая выжимка. Дом правила — скилл `av-dev-code:review`,
`references/review-levels.md`: там разобрано, почему оси именно эти, чем `small` `references/review-levels.md`: там разобрано, почему оси именно эти, чем `small`
дешевле `medium` и какие доли служат проверкой правила. Открывай его, когда дешевле `medium` и какие доли служат проверкой правила. Открывай его, когда
метка **спорная или оспорена**; на обычной задаче хватает того, что здесь. метка **спорная или оспорена**; на обычной задаче хватает того, что здесь.
@@ -10,7 +10,7 @@ color: yellow
Development на OpenSpec). Оптика — требования, а не стиль кода. Development на OpenSpec). Оптика — требования, а не стиль кода.
Находки — по контракту Находки — по контракту
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/finding-contract.md` `${CLAUDE_PLUGIN_ROOT}/skills/review/references/finding-contract.md`
(точный путь конвейер передаёт в задании). Русская проза; идентификаторы, пути и (точный путь конвейер передаёт в задании). Русская проза; идентификаторы, пути и
ключевые слова спек (`SHALL`, `GIVEN/WHEN/THEN`) — в оригинале. Читай реальные ключевые слова спек (`SHALL`, `GIVEN/WHEN/THEN`) — в оригинале. Читай реальные
файлы перед выводом, ничего не выдумывай. файлы перед выводом, ничего не выдумывай.
@@ -49,7 +49,7 @@ Development на OpenSpec). Оптика — требования, а не ст
Пути спек жёсткие: актуальные — `openspec/specs/<capability>/spec.md`, дельты — Пути спек жёсткие: актуальные — `openspec/specs/<capability>/spec.md`, дельты —
`openspec/changes/<id>/specs/`. Карта «что нужно проходу → где лежит» — `openspec/changes/<id>/specs/`. Карта «что нужно проходу → где лежит» —
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`. `${CLAUDE_PLUGIN_ROOT}/skills/review/references/project-facts.md`.
**Нет инвариантов в `CLAUDE.md`** — сверяй только спеку с кодом, `critical` по **Нет инвариантов в `CLAUDE.md`** — сверяй только спеку с кодом, `critical` по
основанию «нарушен инвариант проекта» не присваивай и дай строку: «инвариантов в основанию «нарушен инвариант проекта» не присваивай и дай строку: «инвариантов в
@@ -16,7 +16,7 @@ color: yellow
Потолок в 7 пунктов защищает код, а не читателя. Потолок в 7 пунктов защищает код, а не читателя.
Контракт находок и формат финального отчёта — Контракт находок и формат финального отчёта —
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/finding-contract.md` `${CLAUDE_PLUGIN_ROOT}/skills/review/references/finding-contract.md`
(точный путь конвейер передаёт в задании). (точный путь конвейер передаёт в задании).
## Вход ## Вход
@@ -47,7 +47,7 @@ color: yellow
целиком уезжают в границы покрытия и **не сливаются в один список**. целиком уезжают в границы покрытия и **не сливаются в один список**.
Карта «что нужно проходу → где лежит» — Карта «что нужно проходу → где лежит» —
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`. `${CLAUDE_PLUGIN_ROOT}/skills/review/references/project-facts.md`.
**Деградация поразрядная, и ты — тот, кто собирает её строки в один список, **Деградация поразрядная, и ты — тот, кто собирает её строки в один список,
сохраняя каждую.** Свою часть сохраняя каждую.** Свою часть
@@ -44,7 +44,7 @@ openspec init --tools claude
проекта. проекта.
Сюда же — **требования к форме `proposal` и `design`**, на которых стоит чекпоинт Сюда же — **требования к форме `proposal` и `design`**, на которых стоит чекпоинт
скилла `av-dev-pipeline:resolve`: объяснение человеку собирается из этих двух скилла `av-dev-code:resolve`: объяснение человеку собирается из этих двух
артефактов, и требование к ним обязано применяться в момент, когда их пишут, а не артефактов, и требование к ним обязано применяться в момент, когда их пишут, а не
вспоминаться шагом позже. Образец их содержит. вспоминаться шагом позже. Образец их содержит.
@@ -126,10 +126,9 @@ python3 $os form # слепок формы против жив
Плагины `av-dev` ставятся порознь, и ни один не вправе считать, что сосед на Плагины `av-dev` ставятся порознь, и ни один не вправе считать, что сосед на
месте. месте.
**Чужой скилл зовётся полным именем** — `av-dev-docs:canon`, **Чужой скилл зовётся полным именем** — `av-dev-docs:canon`, `av-dev-tasks:tasks`,
`av-dev-tasks:tasks`, `av-dev-pipeline:review-pipeline`. Короткое имя может `av-dev-code:review`. Короткое имя может разрешиться в устаревшую проектную копию
разрешиться в устаревшую проектную копию из `.claude/skills/`, и подмены не будет из `.claude/skills/`, и подмены не будет видно ни в докладе, ни в поведении.
видно ни в докладе, ни в поведении.
**Путь в дерево чужого плагина не пишется никогда.** `$CLAUDE_PLUGIN_ROOT` ведёт **Путь в дерево чужого плагина не пишется никогда.** `$CLAUDE_PLUGIN_ROOT` ведёт
только в свой плагин; вычисленный от него путь к соседу либо не откроется, либо только в свой плагин; вычисленный от него путь к соседу либо не откроется, либо
@@ -44,7 +44,7 @@ context: |
первым молча, и заметно это становится в предложении, которое уже написано. первым молча, и заметно это становится в предложении, которое уже написано.
Ревью: правило выбора метки и состав проходов здесь не пересказываем — их дом Ревью: правило выбора метки и состав проходов здесь не пересказываем — их дом
скилл av-dev-pipeline:review-pipeline, проектная настройка — docs/review.md. скилл av-dev-code:review, проектная настройка — docs/review.md.
Конвенции кода: механизированное проверяет гейт, прозой остаётся Конвенции кода: механизированное проверяет гейт, прозой остаётся
docs/conventions/. Ни состав шагов гейта, ни перечень конвенций здесь не docs/conventions/. Ни состав шагов гейта, ни перечень конвенций здесь не
@@ -74,7 +74,7 @@ rules:
узнаёт их падением `openspec validate --strict`. узнаёт их падением `openspec validate --strict`.
**Правила для `proposal` и `design` держат чекпоинт скилла **Правила для `proposal` и `design` держат чекпоинт скилла
`av-dev-pipeline:resolve`.** Там работа останавливается и человеку объясняют, в `av-dev-code:resolve`.** Там работа останавливается и человеку объясняют, в
чём проблема и как её решают, — а объяснение **собирается из этих двух чём проблема и как её решают, — а объяснение **собирается из этих двух
артефактов**, а не сочиняется заново: третий пересказ одного и того же разошёлся артефактов**, а не сочиняется заново: третий пересказ одного и того же разошёлся
бы с обоими. Требование поэтому стоит здесь, в момент порождения артефакта, а не бы с обоими. Требование поэтому стоит здесь, в момент порождения артефакта, а не
@@ -114,7 +114,7 @@ def rules_keys(live: str) -> list[str]:
Идём от строки `rules:` до следующего ключа нулевой колонки, а не ищем Идём от строки `rules:` до следующего ключа нулевой колонки, а не ищем
отступ по всему файлу: блок `context: |` литеральный скаляр, внутри него отступ по всему файлу: блок `context: |` литеральный скаляр, внутри него
строки вида «Language: Russian» и «av-dev-pipeline:review-pipeline» выглядят строки вида «Language: Russian» и «av-dev-code:review» выглядят
ключами и дали бы находку на ровном месте. Проверено на живом конфиге, ключами и дали бы находку на ровном месте. Проверено на живом конфиге,
который так и падал. который так и падал.
""" """
@@ -10,7 +10,7 @@ description: "Решить одну задачу от постановки до
Тонкая обёртка над каноническими скиллами `opsx:explore` / `opsx:propose` / Тонкая обёртка над каноническими скиллами `opsx:explore` / `opsx:propose` /
`opsx:apply` / `opsx:archive` — зови их через Skill, не переизобретай их шаги. `opsx:apply` / `opsx:archive` — зови их через Skill, не переизобретай их шаги.
Ревью — скилл `av-dev-pipeline:review-pipeline`; он же держит правило выбора Ревью — скилл `av-dev-code:review`; он же держит правило выбора
метки, а называет её агент `review-scope` — один раз на задачу, для обеих стадий метки, а называет её агент `review-scope` — один раз на задачу, для обеих стадий
ревью. ревью.
@@ -39,10 +39,9 @@ description: "Решить одну задачу от постановки до
Плагины `av-dev` ставятся порознь, и ни один не вправе считать, что сосед на Плагины `av-dev` ставятся порознь, и ни один не вправе считать, что сосед на
месте. месте.
**Чужой скилл зовётся полным именем** — `av-dev-docs:canon`, **Чужой скилл зовётся полным именем** — `av-dev-docs:canon`, `av-dev-tasks:tasks`,
`av-dev-tasks:tasks`, `av-dev-pipeline:review-pipeline`. Короткое имя может `av-dev-code:review`. Короткое имя может разрешиться в устаревшую проектную копию
разрешиться в устаревшую проектную копию из `.claude/skills/`, и подмены не будет из `.claude/skills/`, и подмены не будет видно ни в докладе, ни в поведении.
видно ни в докладе, ни в поведении.
**Путь в дерево чужого плагина не пишется никогда.** `$CLAUDE_PLUGIN_ROOT` ведёт **Путь в дерево чужого плагина не пишется никогда.** `$CLAUDE_PLUGIN_ROOT` ведёт
только в свой плагин; вычисленный от него путь к соседу либо не откроется, либо только в свой плагин; вычисленный от него путь к соседу либо не откроется, либо
@@ -60,7 +59,7 @@ description: "Решить одну задачу от постановки до
<!-- /копия: граница-плагинов --> <!-- /копия: граница-плагинов -->
Скилл зовёт `av-dev-pipeline:review-pipeline`, `av-dev-docs:docs` и Скилл зовёт `av-dev-code:review`, `av-dev-docs:docs` и
`av-dev-tasks:tasks`. Чем оборачивается отсутствие каждого — на самих шагах и в `av-dev-tasks:tasks`. Чем оборачивается отсутствие каждого — на самих шагах и в
разделе «Границы». разделе «Границы».
@@ -371,7 +370,7 @@ flowchart TD
### 4. Ревью дизайна — ДО кода, состав по метке ### 4. Ревью дизайна — ДО кода, состав по метке
Вызови Skill **`av-dev-pipeline:review-pipeline`**, дав ссылку на change `<id>`, Вызови Skill **`av-dev-code:review`**, дав ссылку на change `<id>`,
**план разметки с шага 3** и указание, что это ревью дизайна. **план разметки с шага 3** и указание, что это ревью дизайна.
Состав приходит планом, а не решается здесь: Состав приходит планом, а не решается здесь:
@@ -458,7 +457,7 @@ flowchart TD
### 7. Ревью кода — та же метка ### 7. Ревью кода — та же метка
Вызови Skill **`av-dev-pipeline:review-pipeline`**, дав ссылку на change `<id>`, Вызови Skill **`av-dev-code:review`**, дав ссылку на change `<id>`,
базу диффа, **план разметки с шага 3** и режим запуска. базу диффа, **план разметки с шага 3** и режим запуска.
**Метку ты не выбираешь, и это правило, а не упрощение.** Её назвал **Метку ты не выбираешь, и это правило, а не упрощение.** Её назвал
@@ -466,7 +465,7 @@ flowchart TD
оси. Причина в разведённости: ты только что написал этот код, и решать, насколько оси. Причина в разведённости: ты только что написал этот код, и решать, насколько
глубоко его проверять, тебе нельзя — под давлением «я почти закончил» решение глубоко его проверять, тебе нельзя — под давлением «я почти закончил» решение
известно заранее. Правило выбора живёт в скилле конвейера — известно заранее. Правило выбора живёт в скилле конвейера —
`av-dev-pipeline:review-pipeline`, `references/review-levels.md`; проектные `av-dev-code:review`, `references/review-levels.md`; проектные
триггеры — в `docs/review.*`, подраздел «Триггеры метки». триггеры — в `docs/review.*`, подраздел «Триггеры метки».
**Метка не пересматривается по факту диффа.** Дифф может выйти крупнее, чем **Метка не пересматривается по факту диффа.** Дифф может выйти крупнее, чем
@@ -555,7 +554,7 @@ flowchart TD
**Плагина `av-dev-docs` в проекте нет** — путь в его дерево не разрешится ниоткуда, **Плагина `av-dev-docs` в проекте нет** — путь в его дерево не разрешится ниоткуда,
поэтому за списком иди в **свой** reference: поэтому за списком иди в **свой** reference:
[references/project-facts.md](../review-pipeline/references/project-facts.md) [references/project-facts.md](../review/references/project-facts.md)
конвейера ревью перечисляет все документы канона с их предметом. Пройди по этому конвейера ревью перечисляет все документы канона с их предметом. Пройди по этому
перечню — каждый документ получает строку, отрицание остаётся обязательным. перечню — каждый документ получает строку, отрицание остаётся обязательным.
Триггеры при этом ты знаешь хуже, и это называется в докладе строкой: «синк Триггеры при этом ты знаешь хуже, и это называется в докладе строкой: «синк
@@ -1,5 +1,5 @@
--- ---
name: review-pipeline name: review
description: "Конвейер ревью изменения, устроенный по темам: документ проекта либо заводит тему ревью, либо питает чужую тему источником, либо процессный и в ревью не читается вовсе. Ядро тем — requirements, autotests, conventions, architecture, security, operations; список тем открытый, свои темы проект заводит документом. Разметка задачи идёт один раз, после propose: агент review-scope выводит размер и сложность, из их максимума — метка, и раздаёт темы проходам обеих стадий. Метка правит и ревью дизайна (small — только specs; medium — плюс rubric; large — плюс architecture), и ревью кода (small — гейт, спеки, код, триаж; medium — плюс приёмник тем; large — плюс доказательство: враждебные постановки, эксплуатационный постмортем, архитектурный проход на широком входе). Триаж обязателен всегда. Порядок прогона — граф зависимостей: гейт открывает опиниативные проходы, проходы с пометкой «держит машину» идут цепочкой, триаж — единственный сток. Проектная специфика приходит из документов канона av-dev-docs. Вызывается из скилла resolve — двумя чекпоинтами: ревью дизайна до кода и ревью кода после apply." description: "Конвейер ревью изменения, устроенный по темам: документ проекта либо заводит тему ревью, либо питает чужую тему источником, либо процессный и в ревью не читается вовсе. Ядро тем — requirements, autotests, conventions, architecture, security, operations; список тем открытый, свои темы проект заводит документом. Разметка задачи идёт один раз, после propose: агент review-scope выводит размер и сложность, из их максимума — метка, и раздаёт темы проходам обеих стадий. Метка правит и ревью дизайна (small — только specs; medium — плюс rubric; large — плюс architecture), и ревью кода (small — гейт, спеки, код, триаж; medium — плюс приёмник тем; large — плюс доказательство: враждебные постановки, эксплуатационный постмортем, архитектурный проход на широком входе). Триаж обязателен всегда. Порядок прогона — граф зависимостей: гейт открывает опиниативные проходы, проходы с пометкой «держит машину» идут цепочкой, триаж — единственный сток. Проектная специфика приходит из документов канона av-dev-docs. Вызывается из скилла resolve — двумя чекпоинтами: ревью дизайна до кода и ревью кода после apply."
--- ---
@@ -52,13 +52,14 @@ description: "Конвейер ревью изменения, устроенны
требований. **Проект без OpenSpec этим конвейером не проверяется** — подключай требований. **Проект без OpenSpec этим конвейером не проверяется** — подключай
OpenSpec, а не понижай прогон: ветка деградации здесь не пишется, потому что OpenSpec, а не понижай прогон: ветка деградации здесь не пишется, потому что
непроверенная ветка деградации хуже честного отказа. Заводить руками не надо: непроверенная ветка деградации хуже честного отказа. Заводить руками не надо:
этим владеет скилл `av-dev-pipeline:openspec` — он заводит каталог и заменяет этим владеет скилл `av-dev-code:openspec` — он заводит каталог и заменяет
пример в `config.yaml` настройкой. Его же зовут `av-dev-docs:init` на новом пример в `config.yaml` настройкой. Его же зовут `av-dev-docs:init` на новом
проекте и `canon adopt` на переводимом. проекте и `canon adopt` на переводимом.
- **Документы канона** — см. следующий раздел. - **Документы канона** — см. следующий раздел.
- **Проектные копии этих скиллов и агентов удаляются при установке.** Если в - **Проектные копии этих скиллов и агентов удаляются при установке.** Если в
проекте уже лежат свои `.claude/skills/review-pipeline`, проекте уже лежат свои `.claude/skills/review`,
`.claude/skills/task-pipeline`, `.claude/skills/resolve` или `.claude/skills/review-pipeline`, `.claude/skills/task-pipeline`,
`.claude/skills/resolve` или
`.claude/agents/<проект>-review-*.md` — снеси их. Иначе короткое имя разрешится `.claude/agents/<проект>-review-*.md` — снеси их. Иначе короткое имя разрешится
в устаревшую проектную копию, молча и без признаков подмены. в устаревшую проектную копию, молча и без признаков подмены.
@@ -72,10 +73,9 @@ description: "Конвейер ревью изменения, устроенны
Плагины `av-dev` ставятся порознь, и ни один не вправе считать, что сосед на Плагины `av-dev` ставятся порознь, и ни один не вправе считать, что сосед на
месте. месте.
**Чужой скилл зовётся полным именем** — `av-dev-docs:canon`, **Чужой скилл зовётся полным именем** — `av-dev-docs:canon`, `av-dev-tasks:tasks`,
`av-dev-tasks:tasks`, `av-dev-pipeline:review-pipeline`. Короткое имя может `av-dev-code:review`. Короткое имя может разрешиться в устаревшую проектную копию
разрешиться в устаревшую проектную копию из `.claude/skills/`, и подмены не будет из `.claude/skills/`, и подмены не будет видно ни в докладе, ни в поведении.
видно ни в докладе, ни в поведении.
**Путь в дерево чужого плагина не пишется никогда.** `$CLAUDE_PLUGIN_ROOT` ведёт **Путь в дерево чужого плагина не пишется никогда.** `$CLAUDE_PLUGIN_ROOT` ведёт
только в свой плагин; вычисленный от него путь к соседу либо не откроется, либо только в свой плагин; вычисленный от него путь к соседу либо не откроется, либо
@@ -93,8 +93,8 @@ description: "Конвейер ревью изменения, устроенны
<!-- /копия: граница-плагинов --> <!-- /копия: граница-плагинов -->
Своих скиллов это касается ровно так же: `av-dev-pipeline:review-pipeline`, Своих скиллов это касается ровно так же: `av-dev-code:review`,
`av-dev-pipeline:resolve`, `av-dev-pipeline:openspec` — подменяется короткое имя, `av-dev-code:resolve`, `av-dev-code:openspec` — подменяется короткое имя,
а не чужое. а не чужое.
## Темы, источники и процессные документы ## Темы, источники и процессные документы
@@ -196,7 +196,7 @@ description: "Конвейер ревью изменения, устроенны
прохода между метками; прохода между метками;
- **контракт находок** — путь к - **контракт находок** — путь к
[references/finding-contract.md](references/finding-contract.md) (в [references/finding-contract.md](references/finding-contract.md) (в
установленном плагине — `${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/`); установленном плагине — `${CLAUDE_PLUGIN_ROOT}/skills/review/references/`);
- **изменение** — идентификатор change и путь к его дельта-спекам; - **изменение** — идентификатор change и путь к его дельта-спекам;
- **база диффа**; - **база диффа**;
- **метка, его глубина и режим** прогона — чтобы проход знал, что писать в - **метка, его глубина и режим** прогона — чтобы проход знал, что писать в
@@ -849,7 +849,7 @@ Recall темы `conventions` равен длине конвенций прое
## Ревью дизайна — до кода ## Ревью дизайна — до кода
Запускается на первом чекпоинте ревью (шаг 4 скилла Запускается на первом чекпоинте ревью (шаг 4 скилла
`av-dev-pipeline:resolve`), когда change уже имеет `proposal.md` и `av-dev-code:resolve`), когда change уже имеет `proposal.md` и
дельта-спеки, но кода ещё нет. Разметка задачи к этому моменту уже прошла — она дельта-спеки, но кода ещё нет. Разметка задачи к этому моменту уже прошла — она
шагом раньше, и метка известна. шагом раньше, и метка известна.
+6 -7
View File
@@ -52,7 +52,7 @@ python3 $ds version --dir <корень> # версия кано
``` ```
**Формы `openspec/config.yaml` здесь больше нет.** Каталог принадлежит конвейеру, **Формы `openspec/config.yaml` здесь больше нет.** Каталог принадлежит конвейеру,
и форму смотрит его скрипт — `av-dev-pipeline`, скилл `openspec`, команда и форму смотрит его скрипт — `av-dev-code`, скилл `openspec`, команда
`openspec.py check`. Проект работает по OpenSpec, а плагина конвейера нет — форму `openspec.py check`. Проект работает по OpenSpec, а плагина конвейера нет — форму
не проверяет никто, и это надо сказать строкой доклада, а не считать, что она не проверяет никто, и это надо сказать строкой доклада, а не считать, что она
верна. верна.
@@ -89,7 +89,7 @@ capability: незаполненный канон это переходное с
## Обращение к соседним плагинам ## Обращение к соседним плагинам
`adopt` зовёт двоих: `av-dev-pipeline:openspec` (шаг 4, пункт 3) и `adopt` зовёт двоих: `av-dev-code:openspec` (шаг 4, пункт 3) и
`av-dev-tasks:tasks` (шаг 4, пункт 5). Каталоги `openspec/` и `tasks/` каноном не `av-dev-tasks:tasks` (шаг 4, пункт 5). Каталоги `openspec/` и `tasks/` каноном не
ведутся, и трогать их этому скиллу нечем, кроме вызова. ведутся, и трогать их этому скиллу нечем, кроме вызова.
@@ -101,10 +101,9 @@ capability: незаполненный канон это переходное с
Плагины `av-dev` ставятся порознь, и ни один не вправе считать, что сосед на Плагины `av-dev` ставятся порознь, и ни один не вправе считать, что сосед на
месте. месте.
**Чужой скилл зовётся полным именем**`av-dev-docs:canon`, **Чужой скилл зовётся полным именем**`av-dev-docs:canon`, `av-dev-tasks:tasks`,
`av-dev-tasks:tasks`, `av-dev-pipeline:review-pipeline`. Короткое имя может `av-dev-code:review`. Короткое имя может разрешиться в устаревшую проектную копию
разрешиться в устаревшую проектную копию из `.claude/skills/`, и подмены не будет из `.claude/skills/`, и подмены не будет видно ни в докладе, ни в поведении.
видно ни в докладе, ни в поведении.
**Путь в дерево чужого плагина не пишется никогда.** `$CLAUDE_PLUGIN_ROOT` ведёт **Путь в дерево чужого плагина не пишется никогда.** `$CLAUDE_PLUGIN_ROOT` ведёт
только в свой плагин; вычисленный от него путь к соседу либо не откроется, либо только в свой плагин; вычисленный от него путь к соседу либо не откроется, либо
@@ -183,7 +182,7 @@ capability), `openspec/config.yaml`.
2. каталоги канона и скелет **по [references/skeletons.md](references/skeletons.md)**: 2. каталоги канона и скелет **по [references/skeletons.md](references/skeletons.md)**:
незаполненное — одной честной информативной строкой, а не «TBD»; незаполненное — одной честной информативной строкой, а не «TBD»;
3. **OpenSpec, если его нет или `config.yaml` остался примером** — **вызови 3. **OpenSpec, если его нет или `config.yaml` остался примером** — **вызови
Skill `av-dev-pipeline:openspec`**. Каталог принадлежит конвейеру, и команда Skill `av-dev-code:openspec`**. Каталог принадлежит конвейеру, и команда
заведения с формой файла живут там. Пересказ инвариантов, конвенций и правил заведения с формой файла живут там. Пересказ инвариантов, конвенций и правил
ревью из `context` вычисти ссылкой на дом — на переводимом проекте он там ревью из `context` вычисти ссылкой на дом — на переводимом проекте он там
почти наверняка есть. Вызов не разрешился — `docs.py` о каталоге тогда тоже почти наверняка есть. Вызов не разрешился — `docs.py` о каталоге тогда тоже
+2 -2
View File
@@ -184,7 +184,7 @@ kebab-case.** Причина не эстетическая: имя файла с
какую тему питает. **Кто именно закрывает тему, здесь не указано намеренно**: это какую тему питает. **Кто именно закрывает тему, здесь не указано намеренно**: это
зависит от метки прогона и меняется вместе с конвейером, а документ живёт зависит от метки прогона и меняется вместе с конвейером, а документ живёт
дольше. Раскладку «тема → проход → глубина» держит скилл дольше. Раскладку «тема → проход → глубина» держит скилл
`av-dev-pipeline:review-pipeline`. `av-dev-code:review`.
**Общего словаря у канона с конвейером ровно три вида имён: имена категорий, **Общего словаря у канона с конвейером ровно три вида имён: имена категорий,
имена тем и имена меток.** Категорий три — `тема`, `источник`, `процессный`; имена тем и имена меток.** Категорий три — `тема`, `источник`, `процессный`;
@@ -430,7 +430,7 @@ kebab-case.** Причина не эстетическая: имя файла с
**Файл канону не принадлежит, и проверяет его тоже не канон.** Каталог **Файл канону не принадлежит, и проверяет его тоже не канон.** Каталог
`openspec/` — предпосылка конвейера: без него не работают ни `opsx:propose`, ни `openspec/` — предпосылка конвейера: без него не работают ни `opsx:propose`, ни
ревью дизайна, ни сверка требований. Заводит его, настраивает и **проверяет ревью дизайна, ни сверка требований. Заводит его, настраивает и **проверяет
форму** плагин `av-dev-pipeline`, скилл `openspec`: там образец файла, там же форму** плагин `av-dev-code`, скилл `openspec`: там образец файла, там же
скрипт `openspec.py check`. `docs.py` о файле не говорит ничего. скрипт `openspec.py check`. `docs.py` о файле не говорит ничего.
Канон называет его здесь по одной причине: `openspec/specs/` — **дом темы Канон называет его здесь по одной причине: `openspec/specs/` — **дом темы
@@ -51,7 +51,7 @@ upgrade` идёт по записям снизу вверх от версии п
остались в `docs.py`, то есть у файла было два плагина — один заводит, другой остались в `docs.py`, то есть у файла было два плагина — один заводит, другой
проверяет. Остаток закрыт. проверяет. Остаток закрыт.
**Что появилось.** Скрипт `openspec.py` в скилле `av-dev-pipeline:openspec`, две **Что появилось.** Скрипт `openspec.py` в скилле `av-dev-code:openspec`, две
команды: `check --dir <корень>` — форма в проекте, `form` — сверка слепка с живым команды: `check --dir <корень>` — форма в проекте, `form` — сверка слепка с живым
OpenSpec. Коды выхода те же, что у `docs.py` и `tasks.py`. OpenSpec. Коды выхода те же, что у `docs.py` и `tasks.py`.
@@ -80,7 +80,7 @@ OpenSpec. Коды выхода те же, что у `docs.py` и `tasks.py`.
Форму раньше проверял `docs.py check` заодно; теперь он о ней молчит, и без Форму раньше проверял `docs.py check` заодно; теперь он о ней молчит, и без
отдельного шага незаменённый пример в `config.yaml` перестанет ловиться. Это отдельного шага незаменённый пример в `config.yaml` перестанет ловиться. Это
главная потеря этого повышения, и она тихая. главная потеря этого повышения, и она тихая.
3. Проект по OpenSpec без установленного `av-dev-pipeline` — форму не проверяет 3. Проект по OpenSpec без установленного `av-dev-code` — форму не проверяет
никто. Либо поставить плагин, либо назвать это принятым риском вслух. никто. Либо поставить плагин, либо назвать это принятым риском вслух.
4. `docs/.pm.json`: `"canon": 10`. 4. `docs/.pm.json`: `"canon": 10`.
@@ -94,7 +94,7 @@ OpenSpec работает конвейер — без каталога не за
высказывался. Проект, которому конвейер не нужен, получал отказ за отсутствие высказывался. Проект, которому конвейер не нужен, получал отказ за отсутствие
того, чем не пользуется. того, чем не пользуется.
**Что появилось.** Скилл `av-dev-pipeline:openspec`: заводит каталог, заменяет **Что появилось.** Скилл `av-dev-code:openspec`: заводит каталог, заменяет
закомментированный пример в `config.yaml` настройкой, объясняет разрез между закомментированный пример в `config.yaml` настройкой, объясняет разрез между
ссылкой и пересказом. Образец файла переехал туда же — в ссылкой и пересказом. Образец файла переехал туда же — в
`references/config-skeleton.md` того скилла. `references/config-skeleton.md` того скилла.
@@ -115,7 +115,7 @@ OpenSpec работает конвейер — без каталога не за
1. Ничего не переносить: файлы проекта эта версия не двигает. Меняется только то, 1. Ничего не переносить: файлы проекта эта версия не двигает. Меняется только то,
кто их заводит. кто их заводит.
2. Проверить, что плагин `av-dev-pipeline` установлен, если проект работает по 2. Проверить, что плагин `av-dev-code` установлен, если проект работает по
OpenSpec. Без него `docs.py check` про каталог промолчит — и молчание это OpenSpec. Без него `docs.py check` про каталог промолчит — и молчание это
законное, так что отсутствие настройки перестанет ловиться само. законное, так что отсутствие настройки перестанет ловиться само.
3. Проект **не** работает по OpenSpec: убедиться, что `openspec/` нет, и 3. Проект **не** работает по OpenSpec: убедиться, что `openspec/` нет, и
@@ -653,5 +653,5 @@ ADR объясняет прошлое решение, а не предъявля
| Что копируется | Дом определения | | Что копируется | Дом определения |
| --- | --- | | --- | --- |
| форма записи журнала дефектов в `docs/review.md` | `av-dev-pipeline/skills/review-pipeline/references/review-journal.md` | | форма записи журнала дефектов в `docs/review.md` | `av-dev-code/skills/review/references/review-journal.md` |
| правило заведения ADR в `docs/adr/README.md` | [canon.md](canon.md), раздел `adr/` | | правило заведения ADR в `docs/adr/README.md` | [canon.md](canon.md), раздел `adr/` |
@@ -340,7 +340,7 @@
Форма: Форма:
<!-- копия: журнал-дефектов-форма из av-dev-pipeline/skills/review-pipeline/references/review-journal.md --> <!-- копия: журнал-дефектов-форма из av-dev-code/skills/review/references/review-journal.md -->
## ГГГГ-ММ-ДД — <краткое последствие> [проскочил|пойман] ## ГГГГ-ММ-ДД — <краткое последствие> [проскочил|пойман]
- **Где:** путь:строка либо «конвейер, а не код» - **Где:** путь:строка либо «конвейер, а не код»
@@ -420,7 +420,7 @@ severity стоит здесь, а не выводится каждым прох
## `openspec/config.yaml` ## `openspec/config.yaml`
**Образец переехал.** Файл заводит и заполняет плагин конвейера — скилл **Образец переехал.** Файл заводит и заполняет плагин конвейера — скилл
`av-dev-pipeline:openspec`, — потому что по OpenSpec работает он, а не канон `av-dev-code:openspec`, — потому что по OpenSpec работает он, а не канон
документов. Проект без конвейера каталога `openspec/` не имеет вовсе, и образец документов. Проект без конвейера каталога `openspec/` не имеет вовсе, и образец
файла, которого у него нет, в скелетах канона лежал бы мёртвым грузом. файла, которого у него нет, в скелетах канона лежал бы мёртвым грузом.
+1 -1
View File
@@ -569,7 +569,7 @@ def report(rep: Report) -> int:
"\nМашина проверила раскладку, имена файлов, ссылки, версию и две\n" "\nМашина проверила раскладку, имена файлов, ссылки, версию и две\n"
"сверки с кодом. Форму openspec/config.yaml она не проверяет: каталог\n" "сверки с кодом. Форму openspec/config.yaml она не проверяет: каталог\n"
"принадлежит конвейеру, и форму смотрит его скрипт\n" "принадлежит конвейеру, и форму смотрит его скрипт\n"
"(`av-dev-pipeline:openspec`, команда `openspec.py check`). Согласованность\n" "(`av-dev-code:openspec`, команда `openspec.py check`). Согласованность\n"
"документов между собой и с кодом — тоже не её: это суждение агентов\n" "документов между собой и с кодом — тоже не её: это суждение агентов\n"
"`doc-consistency` (документ ↔ документ ↔ openspec) и `doc-code-drift`\n" "`doc-consistency` (документ ↔ документ ↔ openspec) и `doc-code-drift`\n"
"(документ ↔ код)." "(документ ↔ код)."
+6 -7
View File
@@ -130,10 +130,9 @@ description: Вести содержимое документов канона
Плагины `av-dev` ставятся порознь, и ни один не вправе считать, что сосед на Плагины `av-dev` ставятся порознь, и ни один не вправе считать, что сосед на
месте. месте.
**Чужой скилл зовётся полным именем**`av-dev-docs:canon`, **Чужой скилл зовётся полным именем**`av-dev-docs:canon`, `av-dev-tasks:tasks`,
`av-dev-tasks:tasks`, `av-dev-pipeline:review-pipeline`. Короткое имя может `av-dev-code:review`. Короткое имя может разрешиться в устаревшую проектную копию
разрешиться в устаревшую проектную копию из `.claude/skills/`, и подмены не будет из `.claude/skills/`, и подмены не будет видно ни в докладе, ни в поведении.
видно ни в докладе, ни в поведении.
**Путь в дерево чужого плагина не пишется никогда.** `$CLAUDE_PLUGIN_ROOT` ведёт **Путь в дерево чужого плагина не пишется никогда.** `$CLAUDE_PLUGIN_ROOT` ведёт
только в свой плагин; вычисленный от него путь к соседу либо не откроется, либо только в свой плагин; вычисленный от него путь к соседу либо не откроется, либо
@@ -160,7 +159,7 @@ description: Вести содержимое документов канона
конвейера. **Что в каком и в какой форме — в конвейера. **Что в каком и в какой форме — в
[каноне](../canon/references/canon.md), раздел `review.md`**; подробности формы [каноне](../canon/references/canon.md), раздел `review.md`**; подробности формы
записи и выбор адреса, куда она ведёт, — у конвейера ревью проекта (при записи и выбор адреса, куда она ведёт, — у конвейера ревью проекта (при
`av-dev-pipeline``Skill av-dev-pipeline:review-pipeline`, его `av-dev-code``Skill av-dev-code:review`, его
`references/review-journal.md`). **Конвейера в проекте нет** — пиши по форме из `references/review-journal.md`). **Конвейера в проекте нет** — пиши по форме из
скелета `review.md`, которую положил канон, и скажи в докладе, что подробностей скелета `review.md`, которую положил канон, и скажи в докладе, что подробностей
формы взять негде. формы взять негде.
@@ -173,8 +172,8 @@ description: Вести содержимое документов канона
## Промоут в конвенции ## Промоут в конвенции
Находка → конвенция → правило линтера → **удаление из прозы**. Процедура целиком Находка → конвенция → правило линтера → **удаление из прозы**. Процедура целиком
принадлежит конвейеру ревью проекта (при `av-dev-pipeline` — его принадлежит конвейеру ревью проекта (при `av-dev-code` — его
`references/promote.md`, читается через `Skill av-dev-pipeline:review-pipeline`); `references/promote.md`, читается через `Skill av-dev-code:review`);
роль каталога конвенций — в [каноне](../canon/references/canon.md). **Конвейера роль каталога конвенций — в [каноне](../canon/references/canon.md). **Конвейера
нет** — три шага всё равно твои, просто без его процедуры: сформулируй правило, нет** — три шага всё равно твои, просто без его процедуры: сформулируй правило,
поищи, чем оно механизируется, и вычеркни прозу, если механизировалось. поищи, чем оно механизируется, и вычеркни прозу, если механизировалось.
+5 -6
View File
@@ -1,6 +1,6 @@
--- ---
name: init name: init
description: "Завести новый проект — сессия вопросов и ответов по свободному описанию замысла, из которой рождается первичная документация по канону av-dev: паспорт, CLAUDE.md с инвариантами и командами, модель угроз с периметром, первые цели в роадмапе и скелет остальных документов. OpenSpec заводит не сам, а вызовом скилла av-dev-pipeline:openspec — каталог принадлежит конвейеру; плагина конвейера нет — шаг пропускается строкой доклада. Использовать, когда начинают новый проект с нуля, когда есть только текст «что мне нужно и почему» и надо превратить его в рабочую документацию, когда просят провести стартовое интервью по брифу. Проект, где документация уже как-то ведётся, переводит скилл canon." description: "Завести новый проект — сессия вопросов и ответов по свободному описанию замысла, из которой рождается первичная документация по канону av-dev: паспорт, CLAUDE.md с инвариантами и командами, модель угроз с периметром, первые цели в роадмапе и скелет остальных документов. OpenSpec заводит не сам, а вызовом скилла av-dev-code:openspec — каталог принадлежит конвейеру; плагина конвейера нет — шаг пропускается строкой доклада. Использовать, когда начинают новый проект с нуля, когда есть только текст «что мне нужно и почему» и надо превратить его в рабочую документацию, когда просят провести стартовое интервью по брифу. Проект, где документация уже как-то ведётся, переводит скилл canon."
--- ---
# Заведение нового проекта # Заведение нового проекта
@@ -77,10 +77,9 @@ description: "Завести новый проект — сессия вопро
Плагины `av-dev` ставятся порознь, и ни один не вправе считать, что сосед на Плагины `av-dev` ставятся порознь, и ни один не вправе считать, что сосед на
месте. месте.
**Чужой скилл зовётся полным именем**`av-dev-docs:canon`, **Чужой скилл зовётся полным именем**`av-dev-docs:canon`, `av-dev-tasks:tasks`,
`av-dev-tasks:tasks`, `av-dev-pipeline:review-pipeline`. Короткое имя может `av-dev-code:review`. Короткое имя может разрешиться в устаревшую проектную копию
разрешиться в устаревшую проектную копию из `.claude/skills/`, и подмены не будет из `.claude/skills/`, и подмены не будет видно ни в докладе, ни в поведении.
видно ни в докладе, ни в поведении.
**Путь в дерево чужого плагина не пишется никогда.** `$CLAUDE_PLUGIN_ROOT` ведёт **Путь в дерево чужого плагина не пишется никогда.** `$CLAUDE_PLUGIN_ROOT` ведёт
только в свой плагин; вычисленный от него путь к соседу либо не откроется, либо только в свой плагин; вычисленный от него путь к соседу либо не откроется, либо
@@ -105,7 +104,7 @@ description: "Завести новый проект — сессия вопро
1. Прочитай бриф целиком. Выпиши, на какие блоки интервью ответ уже есть. 1. Прочитай бриф целиком. Выпиши, на какие блоки интервью ответ уже есть.
2. Проведи интервью итерациями по ≤3 вопроса. 2. Проведи интервью итерациями по ≤3 вопроса.
3. **OpenSpec — вызови Skill `av-dev-pipeline:openspec`.** Он заводит каталог и 3. **OpenSpec — вызови Skill `av-dev-code:openspec`.** Он заводит каталог и
заменяет пример в `config.yaml` настройкой. Делается это **до первого заменяет пример в `config.yaml` настройкой. Делается это **до первого
документа**: без `openspec/` не работают ни `opsx:propose`, ни ревью дизайна, документа**: без `openspec/` не работают ни `opsx:propose`, ни ревью дизайна,
ни сверка требований. Каталог принадлежит конвейеру, а не канону, поэтому ни сверка требований. Каталог принадлежит конвейеру, а не канону, поэтому
+1 -1
View File
@@ -228,7 +228,7 @@ python3 $tk reopen <слаг> --dir D --reason … # приёмка не со
- **независимый отчёт ревью** — артефакт, написанный не исполнителем; по нему - **независимый отчёт ревью** — артефакт, написанный не исполнителем; по нему
сверяют состав прогона и урожай. Где он лежит, знает пайплайн проекта; при сверяют состав прогона и урожай. Где он лежит, знает пайплайн проекта; при
конвейере `av-dev-pipeline` это отчёт триажа в конвейере `av-dev-code` это отчёт триажа в
`openspec/changes/archive/<id>/review/` (до архивации — `changes/<id>/review/`); `openspec/changes/archive/<id>/review/` (до архивации — `changes/<id>/review/`);
- **`SPRINT.md` под git** — `git log -p` показывает, что и когда было закрыто. - **`SPRINT.md` под git** — `git log -p` показывает, что и когда было закрыто.
Работает, только если закрытие **закоммичено**: удаление файла задачи и правка Работает, только если закрытие **закоммичено**: удаление файла задачи и правка
@@ -157,7 +157,7 @@ flowchart TD
2. **Принимает человек на сессии, а не отдельный агент.** Исполнитель и приёмщик 2. **Принимает человек на сессии, а не отдельный агент.** Исполнитель и приёмщик
в момент закрытия **не разведены** (решение о снятии и его в момент закрытия **не разведены** (решение о снятии и его
цена — в `SKILL.md`, «Стимулы»). Опоры остались три: **сохранённый независимый цена — в `SKILL.md`, «Стимулы»). Опоры остались три: **сохранённый независимый
отчёт ревью** (при конвейере `av-dev-pipeline` — отчёт триажа в отчёт ревью** (при конвейере `av-dev-code` — отчёт триажа в
`openspec/changes/archive/<id>/review/`, до архивации — `changes/<id>/review/`), `openspec/changes/archive/<id>/review/`, до архивации — `changes/<id>/review/`),
`SPRINT.md` под git и `reopen`. Переоценка на сессии и есть момент, когда `SPRINT.md` под git и `reopen`. Переоценка на сессии и есть момент, когда
критерии видит не исполнитель. **Конвейера ревью в проекте нет — первой опоры критерии видит не исполнитель. **Конвейера ревью в проекте нет — первой опоры
+1 -1
View File
@@ -58,7 +58,7 @@ quote-style = "double"
project-includes = [ project-includes = [
"av-dev-tasks/skills/tasks/scripts/tasks.py", "av-dev-tasks/skills/tasks/scripts/tasks.py",
"av-dev-docs/skills/canon/scripts/docs.py", "av-dev-docs/skills/canon/scripts/docs.py",
"av-dev-pipeline/skills/openspec/scripts/openspec.py", "av-dev-code/skills/openspec/scripts/openspec.py",
"scripts/addresses.py", "scripts/addresses.py",
"scripts/copies.py", "scripts/copies.py",
"scripts/diagrams.py", "scripts/diagrams.py",
+1 -1
View File
@@ -10,7 +10,7 @@
куда большей вероятностью, чем новая тема. куда большей вероятностью, чем новая тема.
Адрес документа принадлежит одному плагину, а называют его все: `docs/*` стоит Адрес документа принадлежит одному плагину, а называют его все: `docs/*` стоит
примерно в сорока местах `av-dev-pipeline`, `tasks/ROADMAP.md` — в четырёх местах примерно в сорока местах `av-dev-code`, `tasks/ROADMAP.md` — в четырёх местах
`av-dev-docs`. Переименование в каноне до этих мест не доходит. `av-dev-docs`. Переименование в каноне до этих мест не доходит.
**Почему тут нужна машина, а не аккуратность.** Прогон ревью умеет честно **Почему тут нужна машина, а не аккуратность.** Прогон ревью умеет честно
+1 -1
View File
@@ -21,7 +21,7 @@
**Цвет, не отвечающий модели.** Цвет charter'а кодирует **модель**, на которой **Цвет, не отвечающий модели.** Цвет charter'а кодирует **модель**, на которой
идёт проход, а не его роль: раскладка в идёт проход, а не его роль: раскладка в
`av-dev-pipeline/skills/review-pipeline/SKILL.md`, раздел «Модель по проходу». `av-dev-code/skills/review/SKILL.md`, раздел «Модель по проходу».
Правило существует ровно затем, чтобы стоимость прогона читалась взглядом по Правило существует ровно затем, чтобы стоимость прогона читалась взглядом по
списку агентов, и держаться вниманием оно не может: цвет ставится один раз при списку агентов, и держаться вниманием оно не может: цвет ставится один раз при
заведении charter'а, а модель потом меняется калибровкой. заведении charter'а, а модель потом меняется калибровкой.
+1 -1
View File
@@ -3,7 +3,7 @@
**Это дом.** Словарь «чем держат проект» назван в трёх местах трёх разных **Это дом.** Словарь «чем держат проект» назван в трёх местах трёх разных
плагинов: секция `Сопровождение` в роадмапе (`av-dev-tasks`), раздел плагинов: секция `Сопровождение` в роадмапе (`av-dev-tasks`), раздел
«Эксплуатация» в `architecture.md` (`av-dev-docs`) и тема ревью `operations` «Эксплуатация» в `architecture.md` (`av-dev-docs`) и тема ревью `operations`
(`av-dev-pipeline`). Ни один из трёх им не владеет, поэтому дом стоит снаружи, а (`av-dev-code`). Ни один из трёх им не владеет, поэтому дом стоит снаружи, а
плагины везут копии. плагины везут копии.
Три перечня «чем держат проект» уже разъезжались — на «метриках и логах» против Три перечня «чем держат проект» уже разъезжались — на «метриках и логах» против
+7 -5
View File
@@ -1,7 +1,7 @@
# Граница между плагинами # Граница между плагинами
**Это дом.** Правило обращения к соседнему плагину нужно всем, кто зовёт чужой **Это дом.** Правило обращения к соседнему плагину нужно всем, кто зовёт чужой
скилл, — а таких скиллов семь в трёх плагинах, и ни один из трёх правилом не скилл, — а таких скиллов шесть в двух плагинах, и ни один из двух правилом не
владеет. Поэтому дом стоит снаружи, а плагины везут **копии**, помеченные владеет. Поэтому дом стоит снаружи, а плагины везут **копии**, помеченные
разметкой `copies.py`. разметкой `copies.py`.
@@ -18,6 +18,9 @@
| `openspec` | путём в чужое дерево — никогда | есть | | `openspec` | путём в чужое дерево — никогда | есть |
| `canon` | — | есть | | `canon` | — | есть |
Имена с тех пор изменились — `task-pipeline` стал `resolve`, `review-pipeline`
`review`, `task-batch` удалён, — но замер относится к местам, а не к названиям.
Два разных довода, и ни в одном месте не было обоих. Три места из пяти молчали о Два разных довода, и ни в одном месте не было обоих. Три места из пяти молчали о
том, что делать, когда вызов не разрешился, — то есть о единственном, ради чего том, что делать, когда вызов не разрешился, — то есть о единственном, ради чего
правило и написано. правило и написано.
@@ -33,10 +36,9 @@
Плагины `av-dev` ставятся порознь, и ни один не вправе считать, что сосед на Плагины `av-dev` ставятся порознь, и ни один не вправе считать, что сосед на
месте. месте.
**Чужой скилл зовётся полным именем** — `av-dev-docs:canon`, **Чужой скилл зовётся полным именем** — `av-dev-docs:canon`, `av-dev-tasks:tasks`,
`av-dev-tasks:tasks`, `av-dev-pipeline:review-pipeline`. Короткое имя может `av-dev-code:review`. Короткое имя может разрешиться в устаревшую проектную копию
разрешиться в устаревшую проектную копию из `.claude/skills/`, и подмены не будет из `.claude/skills/`, и подмены не будет видно ни в докладе, ни в поведении.
видно ни в докладе, ни в поведении.
**Путь в дерево чужого плагина не пишется никогда.** `$CLAUDE_PLUGIN_ROOT` ведёт **Путь в дерево чужого плагина не пишется никогда.** `$CLAUDE_PLUGIN_ROOT` ведёт
только в свой плагин; вычисленный от него путь к соседу либо не откроется, либо только в свой плагин; вычисленный от него путь к соседу либо не откроется, либо