Files
dev-skills/shared/plugin-boundary.md
T
av 53cf6baedf 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
установлен» — проект, дошедший до неё, выполнил бы невыполнимое.
2026-08-09 15:43:03 +03:00

58 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Граница между плагинами
**Это дом.** Правило обращения к соседнему плагину нужно всем, кто зовёт чужой
скилл, — а таких скиллов шесть в двух плагинах, и ни один из двух правилом не
владеет. Поэтому дом стоит снаружи, а плагины везут **копии**, помеченные
разметкой `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` — конвейер.
<!-- /дом: граница-плагинов -->