правило обращения к соседнему плагину получило дом

Стояло в пяти местах в пяти редакциях: два разных довода, ни в одном
месте оба, и три места из пяти молчали о том, что делать при
неразрешившемся вызове. Плюс невысказанный инвариант: $CLAUDE_PLUGIN_ROOT
ведёт только в свой плагин.

Дом — shared/plugin-boundary.md, блок «граница-плагинов», семь помеченных
копий. В дом вошло правило, последствия остались на местах вызова:
«нет плагина задач — учёт остаётся владельцу» знает только конвейер.

Оглавление адресов в CLAUDE.md проекта отклонено — второй дом раскладки,
и протухший адрес в нём выходит правдоподобной строкой честной
деградации. Сверка адресов уходит машине, записана в TODO разделом 5.
This commit is contained in:
av
2026-08-09 15:02:46 +03:00
parent c91492e3f0
commit c6be879831
11 changed files with 413 additions and 26 deletions
+69
View File
@@ -3299,3 +3299,72 @@ JJJ): у профиля обязан быть один правильный от
наоборот — один предмет, разрезанный так, что оба куска нужны одновременно,
разрезан неверно.
## 54. Стык плагинов: правило получило дом, адреса остались у владельцев (2026-08-09)
**АЕАКМ. Вопрос пришёл с другой стороны: ревью опирается на документы проекта,
но не должно жёстко предполагать, где файл лежит; напрашивалось оглавление
адресов и сводка возможностей скиллов в `CLAUDE.md` проекта.** Отклонено и то и
другое, но не потому, что проблемы нет.
**Оглавление адресов — второй дом раскладки.** Канон жёсток намеренно: пути
фиксированы, проект подгоняется под них, и цена этого записана в самом каноне.
Указатель в `CLAUDE.md` отменяет ровно эту цену — раскладка получает второе
описание, и разойдутся они молча. Здесь молчание особенно дорогое: прогон ревью
умеет **честно деградировать**, и протухший адрес попадает прямо в эту машинерию —
файл не открылся, в границах покрытия появляется строка «документа в проекте
нет», и отчёт выглядит добросовестным. Прямой путь в той же ситуации ломается
громче.
**Сводка возможностей — второй дом описаний.** `description` во фронтматтере это
триггер, по нему скилл и выбирается; переписанная руками сводка тех же описаний
не сверяется ничем.
**Настоящий пробел был в другом, и он измерен.** Правило обращения к соседнему
плагину стояло в пяти местах в пяти редакциях:
| Где стояло | Довод | Ветка «не разрешился» |
| --- | --- | --- |
| `task-pipeline` | устаревшая проектная копия | нет |
| `task-batch` | то же | нет |
| `review-pipeline` | вшито в пункт про удаление проектных копий | нет |
| `openspec` | путём в чужое дерево — никогда | есть |
| `canon` | — | есть |
Два разных довода, и ни в одном месте не было обоих; три места из пяти молчали о
том, что делать при неразрешившемся вызове, — то есть о единственном, ради чего
правило написано. Плюс невысказанный инвариант: `$CLAUDE_PLUGIN_ROOT` ведёт
только в свой плагин, употреблён двадцать раз и нигде не оговорён — а именно он
соблазняет дописать `/../av-dev-docs/`.
**Сделано:** дом `shared/plugin-boundary.md`, блок `граница-плагинов`, семь
помеченных копий — четыре скилла конвейера и три скилла канона. В дом вошли
полное имя, запрет пути в чужое дерево, ветка «не разрешился» с обязанностью
доклада и признак присутствия по заведённому соседом файлу.
**Разрез, по которому дом наполнялся: правило общее, последствие местное.** «Нет
`av-dev-tasks` — учёт остаётся владельцу» знает только конвейер; «нет конвейера —
`docs.py` о каталоге `openspec/` молчит» знает только канон. Держи дом
последствия — он знал бы наперечёт всех своих потребителей и стал бы вторым
каноном.
**Адреса при этом наружу не поехали.** У них владелец есть: раскладку `docs/`
держит канон, каталог задач — плагин задач. `shared/` заводится **только для
фактов без владельца**; чужое с владельцем остаётся дома, а сходимость
упоминаний в чужих деревьях проверяется машиной — это следующая работа, записана
в TODO.
### Что из этого следует
179. **Механизм честной деградации превращает протухший адрес в правдоподобный
доклад.** Там, где отсутствие источника — законный исход с названной ценой,
ошибка адреса неотличима от этого исхода. Значит адрес в таком месте обязан
сверяться машиной, а не аккуратностью: единственная альтернатива —
ломаться громко, а именно её деградация и убирает.
180. **`shared/` — для фактов без владельца, и только.** У адресов владелец есть,
и вынести их наружу значило бы отобрать у него его же предмет. Признак
верного дома не «нужно нескольким», а «никому из них не принадлежит».
181. **Общее правило и его последствия живут порознь.** Правило можно вынести в
дом, последствие — нет: оно знает про место, а место про правило знать не
обязано. Дом, вобравший последствия, становится реестром потребителей и
устаревает быстрее их всех.