doc-consistency и doc-code-drift звались шагом сессии между спринтами. Сессия стала грумингом, груминг судит задачи, а не документы, и звать чужих агентов не вправе — они в av-dev-docs. На живом проекте их не звал бы никто, кроме разовых adopt и upgrade. Момент назван у владельца. Разрез с canon check проверяемый: машина сверяет форму, healthcheck — утверждения. Почему скилл, а не просто описания агентов: двоим нужна оркестровка — позвать обоих на весь канон разом, передать doc-code-drift раздел запретов, разобрать урожай порциями, назвать границы покрытия и кого именно позвал. Этого агент о себе не знает. doc-wording внутрь не взят: ему оркестровка не нужна, и ритм другой — он нужен там, где текст только что писали. Заодно из shared/plugin-boundary.md и README убран счётчик скиллов: он протух дважды за день.
4.5 KiB
Граница между плагинами
Это дом. Правило обращения к соседнему плагину нужно всем, кто зовёт чужой
скилл, — а таких скиллов больше половины всех, и ни один плагин правилом не
владеет. (Числа здесь нет намеренно: оно уже дважды протухало за один день.) Поэтому дом стоит снаружи, а плагины везут копии, помеченные
разметкой copies.py.
Правится здесь. Копия, поправленная у себя, — расхождение, а не правка.
Дом заведён по замеру, а не на всякий случай. К моменту раскола правило стояло в пяти местах в пяти редакциях:
| Где стояло | Довод | Ветка «не разрешился» |
|---|---|---|
task-pipeline |
устаревшая проектная копия | нет |
task-batch |
то же | нет |
review-pipeline |
вшито в пункт про удаление проектных копий | нет |
openspec |
путём в чужое дерево — никогда | есть |
canon |
— | есть |
Имена с тех пор изменились — task-pipeline стал resolve, review-pipeline —
review, task-batch удалён, — но замер относится к местам, а не к названиям.
Два разных довода, и ни в одном месте не было обоих. Три места из пяти молчали о том, что делать, когда вызов не разрешился, — то есть о единственном, ради чего правило и написано.
Что в дом не идёт: чем оборачивается отсутствие конкретного соседа. «Нет
av-dev-tasks — учёт остаётся владельцу» знает только конвейер; «нет конвейера —
docs.py о каталоге openspec/ молчит» знает только канон. Правило общее,
последствие местное, и держать последствия здесь значило бы завести дом, который
знает про всех своих потребителей.
Плагины av-dev ставятся порознь, и ни один не вправе считать, что сосед на
месте.
Чужой скилл зовётся полным именем — av-dev-docs:canon, av-dev-tasks:tasks,
av-dev-code:review. Короткое имя может разрешиться в устаревшую проектную копию
из .claude/skills/, и подмены не будет видно ни в докладе, ни в поведении.
Путь в дерево чужого плагина не пишется никогда. $CLAUDE_PLUGIN_ROOT ведёт
только в свой плагин; вычисленный от него путь к соседу либо не откроется, либо
откроет чужую установку. Нужен чужой справочник — зови владеющий им скилл, он
прочитает его сам.
Вызов не разрешился — плагина в проекте нет. Это исход, а не поломка: назови строкой доклада, чего теперь не делает никто, и продолжай работу. Молчать нельзя, пропуск неотличим от сделанного; выдумывать обходной путь нельзя тоже.
Присутствие узнаётся вызовом или следом в проекте, но не объявлением. Перечня
установленных плагинов проект не ведёт — он разошёлся бы с действительностью
молча. Что сосед здесь работал, видно по заведённому им файлу: docs/.pm.json —
канон, <каталог задач>/.tasks.json — задачи, openspec/config.yaml — конвейер.