граница: правило стало про раскладку проекта, а не про соседний плагин

Дом shared/plugin-boundary.md переехал в shared/absence.md: отсутствовала всё
это время не установка плагина, а часть раскладки проекта, и узнавалась она
следом на диске. Перечень внешнего сократился до двух — opsx и av-dev-git.
Ветки «плагина нет» переписаны на «этой части в проекте нет»; там, где ветка
существовала только ради неразрешимого пути в чужое дерево, она снята вовсе.

Внутриплагинные копии языка и словаря сопровождения сняты: два справочника по
213 строк и один по 34 заменены ссылкой на общий дом. Копии остались там, где
текст обязан лежать внутри промпта, — в уставах вычитки. Заодно починены пути
$CLAUDE_PLUGIN_ROOT и относительные ссылки, разъехавшиеся с новыми именами
каталогов.
This commit is contained in:
av
2026-08-13 10:18:04 +03:00
parent de12a4d8a3
commit 6b162c421d
37 changed files with 368 additions and 832 deletions
+59
View File
@@ -0,0 +1,59 @@
# Чего может не быть
**Это дом.** Правило нужно почти каждому скиллу: любой приходит в проект, где
может не оказаться ни документов канона, ни каталога задач, ни `openspec/`, а
рядом может не стоять внешний плагин, которого он ждёт. Ни один скилл правилом
не владеет, поэтому дом стоит в `shared/`, а скиллы везут **копии**, помеченные
разметкой `copies.py`.
Правится **здесь**. Копия, поправленная у себя, — расхождение, а не правка.
До слияния правило называлось «граница плагинов» и говорило о соседе:
`av-dev-docs`, `av-dev-tasks` и `av-dev-code` ставились порознь, и каждый обязан
был пережить отсутствие двоих. Плагин теперь один, а правило осталось, и не по
инерции: **отсутствовала всё это время не установка, а раскладка проекта**, и
узнавалась она следом на диске, а не перечнем плагинов. Перечень того, чего
может не быть, стал короче на три имени — механика не изменилась вовсе.
Заведено правило по замеру: к первому расколу оно стояло в пяти местах в пяти
редакциях, и три из пяти молчали о том, ради чего написано, — что делать, когда
недостающее обнаружено.
<!-- дом: отсутствие -->
**Скилл не вправе считать раскладку проекта полной.** Части заводятся порознь и
живут порознь; каждая узнаётся своим следом:
| Чего нет | Как видно | Чего теперь не делает никто |
| --- | --- | --- |
| раскладка av-dev | нет `.av-dev.toml` в корне | проект под процесс не заводился; версии нет, настроек нет |
| документы канона | нет `docs/` | проектную конкретику брать неоткуда — темы, инварианты, прецеденты |
| учёт работ | нет каталога задач | запись остаётся владельцу: назови её текстом в докладе |
| источник требований | нет `openspec/config.yaml` | цикл SDD не запускается: спеки не с чем сверять |
**Свой скилл зовётся полным именем**`av-dev:doc-canon`, `av-dev:task-track`,
`av-dev:code-review`. Короткое имя может разрешиться в устаревшую проектную
копию из `.claude/skills/`, и подмены не будет видно ни в докладе, ни в
поведении.
**Внешний плагин может не стоять.** Их два: `opsx:*` — цикл SDD, и
`av-dev-git:commit` — сообщения коммитов. Путь в дерево чужого плагина не
пишется никогда: `$CLAUDE_PLUGIN_ROOT` ведёт только в своё дерево, а
вычисленный от него путь к соседу либо не откроется, либо откроет чужую
установку. Нужен чужой справочник — зови владеющий им скилл, он прочитает его
сам.
**Отсутствие — исход, а не поломка.** Назови строкой доклада, чего теперь не
делает никто, и продолжай работу. Молчать нельзя: пропуск неотличим от
сделанного. Выдумывать обходной путь нельзя тоже.
**Присутствие узнаётся следом в проекте, а не объявлением.** Перечня того, что
здесь заведено, проект не ведёт — он разошёлся бы с действительностью молча.
<!-- /дом: отсутствие -->
**Что в дом не идёт: чем именно оборачивается нехватка у тебя.** «Нет каталога
задач — учёт остаётся владельцу» знает конвейер; «нет `openspec/``docs.py`
о каталоге молчит» знает канон. Правило общее, последствие местное, и держать
последствия здесь значило бы завести дом, который знает про всех своих
потребителей.
+10 -12
View File
@@ -1,26 +1,26 @@
# Язык проектных текстов
**Это дом.** Файл не входит ни в один плагин: язык общий для документов канона и
для задач, и хранить его внутри одного из них значило бы отдать общее правило во
владение половине. Плагины везут **копии**, помеченные разметкой `copies.py`, и
расхождение ловит гейт коммита, а не внимание.
**Это дом.** Файл не принадлежит ни одному скиллу: язык общий для документов
канона, для задач и для решений ADR, и хранить его внутри одного из них значило
бы отдать общее правило во владение части. Скиллы читают **этот файл** по
ссылке; дословные **копии**, помеченные разметкой `copies.py`, уезжают только в
charter'ы вычитки — там текст обязан лежать внутри самого промпта, потому что
именно он и есть критерий суждения. Расхождение ловит гейт коммита, а не
внимание.
Правится **здесь**. Копия, поправленная у себя, — расхождение, а не правка.
Три блока, и делятся они по потребителю, а не по теме:
Два блока копируются, и делятся они по потребителю, а не по теме:
| Блок | Что в нём | Кто копирует |
| --- | --- | --- |
| `язык-доктрина` | зачем стиль нужен, что взято сверх устава, что отброшено | справочник языка в плагине |
| `язык-правила` | девять правил, по которым судят текст | справочник и уставы вычитки |
| `порог-правки` | когда находка не заводится | справочник, уставы вычитки, `task-form` |
| `язык-правила` | девять правил, по которым судят текст | уставы вычитки |
| `порог-правки` | когда находка не заводится | уставы вычитки, `task-form` |
`порог-правки` вынесен из правил намеренно: он нужен и тому, кто правил языка не
проверяет вовсе, — а вложенных блоков разметка не знает, и внутри `язык-правила`
его было бы не забрать отдельно.
<!-- дом: язык-доктрина -->
Правила — для всего, что пишется словами: задачи и цели, документы канона,
решения ADR, записки разведки, сообщения коммитов. Не для кода и не для
сообщений программы пользователю — там свои конвенции проекта.
@@ -81,8 +81,6 @@
значит называть состояние и остаток, а не пересказывать, как было интересно
разбираться.
<!-- /дом: язык-доктрина -->
## Правила
<!-- дом: язык-правила -->
+6 -8
View File
@@ -1,15 +1,14 @@
# Сопровождение и эксплуатация
**Это дом.** Словарь «чем держат проект» назван в трёх местах трёх разных
плагинов: секция `Сопровождение` в роадмапе (`av-dev-tasks`), раздел
«Эксплуатация» в `architecture.md` (`av-dev-docs`) и тема ревью `operations`
(`av-dev-code`). Ни один из трёх им не владеет, поэтому дом стоит снаружи, а
плагины везут копии.
скиллов: секция `Сопровождение` в роадмапе (`task-track`), раздел «Эксплуатация»
в `architecture.md` (`doc-canon`) и тема ревью `operations` (`code-review`). Ни
один из трёх им не владеет, поэтому дом стоит в `shared/`.
Три перечня «чем держат проект» уже разъезжались — на «метриках и логах» против
«мониторинга», — и разъехались молча. Отсюда дословная копия вместо ссылки.
<!-- дом: сопровождение-словарь -->
«мониторинга», — и разъехались молча. Пока скиллы жили тремя плагинами, отсюда
уезжали дословные копии: путь в чужое дерево не разрешался. Теперь дерево одно —
кому словарь нужен, тот открывает **этот файл**, и сверять машиной больше нечего.
Одна тема живёт в трёх местах, и путать их слова нельзя.
@@ -32,4 +31,3 @@
экране» — сопровождение: наблюдаем мы. Одни и те же метрики попадают в разные
секции роадмапа, и это верно — секции отвечают на разные вопросы.
<!-- /дом: сопровождение-словарь -->
-59
View File
@@ -1,59 +0,0 @@
# Граница между плагинами
**Это дом.** Правило обращения к соседнему плагину нужно всем, кто зовёт чужой
скилл, — а таких скиллов больше половины всех, и ни один плагин правилом не
владеет. (Числа здесь нет намеренно: оно уже дважды протухало за один день.) Поэтому дом стоит снаружи, а плагины везут **копии**, помеченные
разметкой `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:doc-canon`, `av-dev:task-track`,
`av-dev:code-review`. Короткое имя может разрешиться в устаревшую проектную копию
из `.claude/skills/`, и подмены не будет видно ни в докладе, ни в поведении.
**Путь в дерево чужого плагина не пишется никогда.** `$CLAUDE_PLUGIN_ROOT` ведёт
только в свой плагин; вычисленный от него путь к соседу либо не откроется, либо
откроет чужую установку. Нужен чужой справочник — зови владеющий им скилл, он
прочитает его сам.
**Вызов не разрешился — плагина в проекте нет.** Это исход, а не поломка: назови
строкой доклада, чего теперь не делает никто, и продолжай работу. Молчать нельзя,
пропуск неотличим от сделанного; выдумывать обходной путь нельзя тоже.
**Присутствие узнаётся вызовом или следом в проекте, но не объявлением.** Перечня
установленных плагинов проект не ведёт — он разошёлся бы с действительностью
молча. Что сосед здесь работал, видно по заведённому им файлу: `docs/.docs.json`
канон, `<каталог задач>/.tasks.json` — задачи, `openspec/config.yaml` — конвейер.
Имя файла — имя плагина, который его завёл, и держит он в том числе версию своего
формата: у канона документов и у каталога задач они свои и двигаются порознь.
<!-- /дом: граница-плагинов -->