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

Правило границы моё, копий восемь — и нарушал его я же.

- путь в дерево чужого плагина снят из пяти мест; маркер копии, уезжающий
  в проект скелетом, оставлен, но сказано, что сама пара маркеров не едет
- короткое имя чужого скилла в четырёх местах стало полным
- стык «урожай ревью → задачи» не был назван ни с одной стороны, хотя
  механика написана с обеих; теперь назван, с веткой «плагина нет»
- resolve звал av-dev-git:commit без строки доклада и пересказывал формат
  коммита, нарушая собственное «ссылайся, не пересказывай»
- doc-wording обещал момент вызова, которого не исполнял никто. Правило:
  звонящий — тот, кто только что писал текст. Вызов появился шагом в docs,
  init, adopt и upgrade; healthcheck по-прежнему его не зовёт
- openspec.py искал SHALL по всему файлу, а образец даёт его в context —
  проверка молчала ровно в том случае, ради которого написана
- фаза 2 review-rubric была недостижима; проход стал судить задуманное,
  а не код, и это сходится с тем, что о нём говорит конвейер
- rules.tasks в образце конфига, ветка «записи задачи нет» у review-scope,
  возвраты на чекпоинт в схеме resolve, старшинство правила дельта-спек

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-08-09 18:22:35 +03:00
co-authored by Claude Opus 5
parent 15dba79993
commit 63ba36d71d
20 changed files with 212 additions and 85 deletions
+13 -9
View File
@@ -54,12 +54,12 @@ description: "Конвейер ревью изменения, устроенны
непроверенная ветка деградации хуже честного отказа. Заводить руками не надо:
этим владеет скилл `av-dev-code:openspec` — он заводит каталог и заменяет
пример в `config.yaml` настройкой. Его же зовут `av-dev-docs:init` на новом
проекте и `canon adopt` на переводимом.
проекте и `av-dev-docs:canon` в режиме `adopt` на переводимом.
- **Документы канона** — см. следующий раздел.
- **Проектные копии этих скиллов и агентов удаляются при установке.** Если в
проекте уже лежат свои `.claude/skills/review`,
`.claude/skills/review-pipeline`, `.claude/skills/task-pipeline`,
`.claude/skills/resolve` или
`.claude/skills/task-batch`, `.claude/skills/resolve` или
`.claude/agents/<проект>-review-*.md` — снеси их. Иначе короткое имя разрешится
в устаревшую проектную копию, молча и без признаков подмены.
@@ -121,8 +121,8 @@ description: "Конвейер ревью изменения, устроенны
критерий, по которому судит изменение. `adr.*`, `research.*` и `tasks/` не
открывает никто.
Дом канона этой раскладки — `av-dev-docs`, `references/canon.md`, раздел «Три
категории документов». Конвейер её **читатель**: категории и имена тем он берёт
Дом канона этой раскладки — скилл `av-dev-docs:canon`, раздел «Три категории
документов». Конвейер её **читатель**: категории и имена тем он берёт
оттуда и своих не заводит.
Отсюда то, ради чего правило и заведено: **`docs/` перестаёт быть просто
@@ -866,8 +866,9 @@ Recall темы `conventions` равен длине конвенций прое
- **всегда** — `review-specs` в режиме «дизайн ДО кода». Дельта-спеки сверяются
на каждой задаче: это самый дешёвый чекпоинт конвейера, и он ловит то, что на
готовом коде уже не чинят;
- **со `medium`** — `review-rubric` (фаза 1 без фазы 2: рубрика на задуманный
узел становится приёмочными критериями и уезжает в `tasks.md`);
- **со `medium`** — `review-rubric`: рубрика на задуманный узел, по ней же
разбирается дельта-спека, а сами пункты уезжают приёмочными критериями в
`tasks.md`;
- **только в `large`** — `review-architecture` на предложении: можно ли выразить
существующими понятиями — **включая конструкции стандартной библиотеки**, — не
появляется ли второй способ. Вопрос «не изобретаем ли то, что уже есть в
@@ -900,7 +901,7 @@ flowchart TD
plan[/"план разметки задачи:<br/>размер, сложность, метка"/]
proposal["предложение: proposal.md + дельта-спеки"]
specs["specs (режим «дизайн ДО кода») — всегда"]
rubric["rubric, фаза 1 → приёмочные критерии в tasks.md"]
rubric["rubric → приёмочные критерии в tasks.md"]
arch["architecture на предложении"]
author["вопрос автору: три формы решения и компромисс каждой"]
fix["шаг пайплайна: правка спек, развилки — вопросом в запись"]
@@ -942,8 +943,11 @@ flowchart TD
- Находка не для этого мерджа, но реальная (отложенный `major`, развилка,
решённая «потом»), — не теряется, но **и не заводится здесь**. Конвейер отдаёт
её **списком урожая** в отчёте: формулировка, оракул, провенанс (какой проход,
какой change). Заведение задач принадлежит тому, кто ведёт задачи проекта, —
у него свой формат, своя нарезка и свои правила дублей. Мелочь класса `nit`
какой change). Заведение задач принадлежит `av-dev-tasks:tasks` — зови его со
списком урожая, у него на этот вход отдельный сценарий «задачи из ревью и
аудита»: свой формат, кластеризация по причине, дедуп против беклога и
кладбища. Плагина нет — урожай остаётся списком в отчёте, и это говорится
строкой доклада: задачи из него не заведёт никто. Мелочь класса `nit`
идёт в урожай одной пачкой, а не записью на находку.
- `Promote candidates` — по процедуре [references/promote.md](references/promote.md):
находка → конвенция → правило линтера → **удаление формулировки из конвенций**.
@@ -8,9 +8,8 @@
`av-dev-docs`, и проход читает их напрямую: пути жёсткие, посредник не нужен, а
второй дом для тех же фактов разошёлся бы и выглядел актуальным.
Определение канона — в плагине `av-dev-docs`,
`skills/canon/references/canon.md`. Здесь только карта «тема → её дом → что
оттуда берётся».
Определение канона держит скилл `av-dev-docs:canon`. Здесь только карта «тема →
её дом → что оттуда берётся».
## Карта тем
@@ -41,8 +41,7 @@
## Форма записи
**Это дом формы, и у него есть копия.** Скелет `docs/review.md`, который кладёт
в проект `av-dev-docs` (`skills/canon/references/skeletons.md`), повторяет её
дословно — он уезжает в репозиторий и обязан там что-то говорить. Правка формы
в проект `av-dev-docs:canon`, повторяет её дословно — он уезжает в репозиторий и обязан там что-то говорить. Правка формы
здесь **обязана** тянуть правку скелета и запись в журнал версий канона; иначе
проекты продолжат писать по старой форме, а конвейер — ждать поля, которого нет.
Дословность сверяет `scripts/copies.py` маркетплейса по маркерам ниже — но
@@ -94,9 +94,9 @@
костяк — гейт, спеки, код, триаж**. Разрезать задачу, обе половины которой
остаются в одной метке, значит заплатить костяк дважды за ту же проверку.
Резать стоит там, где разрез **снимает доказательство с большей части диффа**.
Шов и правило нарезки живут у того, кто ведёт задачи, — скилл `av-dev-tasks:tasks`,
его `references/split.md`. Пути туда конвейер не выносит: за пределы своего
плагина он ходит вызовом скилла, а не файлом.
Шов и правило нарезки живут у того, кто ведёт задачи, — скилл
`av-dev-tasks:tasks`, его раздел о нарезке. Пути туда конвейер не выносит: за
пределы своего плагина он ходит вызовом скилла, а не файлом.
Разметка в костяк не входит — она платится один раз на задачу, а не один раз на
прогон, и потому **разрез задачи её не удваивает**. Это единственное, что стало