# Граница между плагинами **Это дом.** Правило обращения к соседнему плагину нужно всем, кто зовёт чужой скилл, — а таких скиллов больше половины всех, и ни один плагин правилом не владеет. (Числа здесь нет намеренно: оно уже дважды протухало за один день.) Поэтому дом стоит снаружи, а плагины везут **копии**, помеченные разметкой `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` — конвейер. Имя файла — имя плагина, который его завёл, и держит он в том числе версию своего формата: у канона документов и у каталога задач они свои и двигаются порознь.