границы плагинов: путь в чужое дерево, безымянные стыки, звонящий у вычитки

Правило границы моё, копий восемь — и нарушал его я же.

- путь в дерево чужого плагина снят из пяти мест; маркер копии, уезжающий
  в проект скелетом, оставлен, но сказано, что сама пара маркеров не едет
- короткое имя чужого скилла в четырёх местах стало полным
- стык «урожай ревью → задачи» не был назван ни с одной стороны, хотя
  механика написана с обеих; теперь назван, с веткой «плагина нет»
- resolve звал av-dev-git:commit без строки доклада и пересказывал формат
  коммита, нарушая собственное «ссылайся, не пересказывай»
- doc-wording обещал момент вызова, которого не исполнял никто. Правило:
  звонящий — тот, кто только что писал текст. Вызов появился шагом в docs,
  init, adopt и upgrade; healthcheck по-прежнему его не зовёт
- openspec.py искал SHALL по всему файлу, а образец даёт его в context —
  проверка молчала ровно в том случае, ради которого написана
- фаза 2 review-rubric была недостижима; проход стал судить задуманное,
  а не код, и это сходится с тем, что о нём говорит конвейер
- rules.tasks в образце конфига, ветка «записи задачи нет» у review-scope,
  возвраты на чекпоинт в схеме resolve, старшинство правила дельта-спек

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-08-09 18:22:35 +03:00
co-authored by Claude Opus 5
parent 15dba79993
commit 63ba36d71d
20 changed files with 212 additions and 85 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
---
name: doc-wording
description: "Вычитка языка документов проекта по информационному стилю — паспорт, архитектура, конвенции, безопасность, решения ADR, записки разведки, CLAUDE.md. Смотрит отглагольные существительные и страдательный залог, оценку без факта, стоп-слова и канцелярит, «одна мысль — одно предложение», англицизм при живом русском слове, жаргон и метафоры вместо прямого называния, термин, которого нет в документах проекта, транслит в имени файла. Отдаёт готовые формулировки на замену и ничего не правит сам. Записи каталога задач вычитывает отдельный агент task-wording, их форму — task-form. Использовать после правки документов, после adopt и после повышения версии канона. Только чтение."
description: "Вычитка языка документов проекта по информационному стилю — паспорт, архитектура, конвенции, безопасность, решения ADR, записки разведки, CLAUDE.md. Смотрит отглагольные существительные и страдательный залог, оценку без факта, стоп-слова и канцелярит, «одна мысль — одно предложение», англицизм при живом русском слове, жаргон и метафоры вместо прямого называния, термин, которого нет в документах проекта, транслит в имени файла. Отдаёт готовые формулировки на замену и ничего не правит сам. Записи каталога задач вычитывает отдельный агент task-wording, их форму — task-form. Зовётся по названной пачке правленных документов, а не на весь канон: последним шагом синка документации (av-dev-docs:docs), шагом заведения проекта (av-dev-docs:init), шагами adopt и upgrade скилла av-dev-docs:canon. Скилл healthcheck его не зовёт — там сверка утверждений, а не языка. Только чтение."
tools: Read, Grep, Glob
model: sonnet
color: green
+17 -1
View File
@@ -52,7 +52,7 @@ python3 $ds version --dir <корень> # версия кано
```
**Формы `openspec/config.yaml` здесь больше нет.** Каталог принадлежит конвейеру,
и форму смотрит его скрипт — `av-dev-code`, скилл `openspec`, команда
и форму смотрит его скрипт — скилл `av-dev-code:openspec`, команда
`openspec.py check`. Проект работает по OpenSpec, а плагина конвейера нет — форму
не проверяет никто, и это надо сказать строкой доклада, а не считать, что она
верна.
@@ -244,6 +244,18 @@ capability), `openspec/config.yaml`.
**Передай им объявленное переходное состояние из шага 5** — иначе честная строка
в незаполненном слоте вернётся находкой, а это не поломка, а объявленный долг.
### 7. Вычитай написанное — агент `doc-wording`
Судьи смотрят утверждения, а `adopt` только что **писал текст**: честные строки
в пустые слоты, переписанные при переносе абзацы, шапки перенесённых документов.
Язык этого текста не проверяет никто другой, а зовущий здесь по определению тот,
кто его и написал.
Позови агента **по названной пачке** — документы, которые ты завёл или правил,
плюс перенесённые целиком. Весь канон ему не нужен: он работает по списку, и
список же служит ему словарём терминов. Находки — готовые формулировки,
подставляешь их ты.
## `upgrade` — канон вырос
1. `docs.py version` — версия проекта и версия скрипта.
@@ -255,6 +267,10 @@ capability), `openspec/config.yaml`.
4. Подними `canon` в `docs/.pm.json` до текущей.
5. `docs.py check`.
6. **Позови судей** — Skill `av-dev-docs:healthcheck`.
7. **Позови вычитку** — агент `doc-wording`, но **только по тем документам,
которых записи журнала коснулись**, и только если правка была текстовой, а не
переименованием файла. Записи журнала пишутся руками в проектной прозе, и
дописанный по журналу раздел — такой же свежий текст, как на синке.
Записи журнала описывают **что сделать проекту**. Если запись этого не говорит —
это дефект журнала, и о нём надо сказать, а не догадываться.
+4 -3
View File
@@ -402,7 +402,8 @@ kebab-case.** Причина не эстетическая: имя файла с
род работы, и называется оно **`research` без раздела «Вопрос»**. Такая запись в
работу не берётся и лежит в конце своей категории.
Раскладку, форму записи и алгоритм работы над каждым типом держит скилл `tasks`.
Раскладку, форму записи и алгоритм работы над каждым типом держит скилл
`av-dev-tasks:tasks`.
### `CLAUDE.md`
@@ -432,8 +433,8 @@ kebab-case.** Причина не эстетическая: имя файла с
**Файл канону не принадлежит, и проверяет его тоже не канон.** Каталог
`openspec/` — предпосылка конвейера: без него не работают ни `opsx:propose`, ни
ревью дизайна, ни сверка требований. Заводит его, настраивает и **проверяет
форму** плагин `av-dev-code`, скилл `openspec`: там образец файла, там же
скрипт `openspec.py check`. `docs.py` о файле не говорит ничего.
форму** скилл `av-dev-code:openspec`: там образец файла, там же скрипт
`openspec.py check`. `docs.py` о файле не говорит ничего.
Канон называет его здесь по одной причине: `openspec/specs/` — **дом темы
`requirements`**, и без этой строки карта тем неполна. На форму самого
@@ -19,9 +19,12 @@
`<!-- дом: <id> -->``<!-- /дом: <id> -->`, копия —
`<!-- копия: <id> из <путь> -->``<!-- /копия: <id> -->`;
`scripts/copies.py` маркетплейса требует дословного
совпадения. Комментарии невидимы в отрендеренном markdown и уезжают в проект
вместе со скелетом — там они говорят читателю, что у текста есть дом. Правишь
текст внутри маркеров — правь дом, а не копию.
совпадения. Правишь текст внутри маркеров — правь дом, а не копию.
**Сама пара маркеров в проект не переносится.** Это машинерия маркетплейса:
путь в ней ведёт в дерево плагина, и в репозитории проекта он не разрешится ни
во что. Кладя скелет, копируй содержимое между маркерами, а строки
`<!-- копия: … -->` и `<!-- /копия: … -->` оставляй здесь.
## `docs/passport.md`
@@ -354,6 +357,9 @@
<!-- /копия: журнал-дефектов-форма -->
```
Пара маркеров `копия:` внутри — машинерия маркетплейса; в `docs/review.md`
проекта уезжает только содержимое между ними (см. выше).
Новый проект: «Дефектов пока не было. Настройка конвейера появится с первым
ревью.»
+13
View File
@@ -75,6 +75,19 @@ description: Вести содержимое документов канона
которых работа не касалась, — расхождение, внесённое правкой в одном месте, там
и живёт.
## Вычитка — наоборот, здесь
**Язык правленого вычитывается на синке, и зовёшь агента `doc-wording` ты.**
Довод обратный доводу про судей: он читает **только названную пачку**, стоит
дёшево и ищет ровно то, что портится в момент письма, — залог, оценку без факта,
жаргон, термин без ввода. Ждать сессии здесь нечего: через месяц никто уже не
помнит, какую фразу имел в виду автор.
Позови его **последним шагом синка**, отдав список файлов, которых чек-лист
коснулся, — и назови этот список в промпте: по нему же он судит, известен ли
термин. Ничего не правивший синк агента не зовёт. Находки он отдаёт готовыми
формулировками, подставляешь их ты.
## ADR — промоут, а не второе сочинение
Обоснование уже написано: `opsx:propose` кладёт `design.md` в каждый change, и
+17 -6
View File
@@ -1,6 +1,6 @@
---
name: init
description: "Завести новый проект — сессия вопросов и ответов по свободному описанию замысла, из которой рождается первичная документация по канону av-dev: паспорт, CLAUDE.md с инвариантами и командами, модель угроз с периметром, первые цели в роадмапе и скелет остальных документов. OpenSpec заводит не сам, а вызовом скилла av-dev-code:openspec — каталог принадлежит конвейеру; плагина конвейера нет — шаг пропускается строкой доклада. Использовать, когда начинают новый проект с нуля, когда есть только текст «что мне нужно и почему» и надо превратить его в рабочую документацию, когда просят провести стартовое интервью по брифу. Проект, где документация уже как-то ведётся, переводит скилл canon."
description: "Завести новый проект — сессия вопросов и ответов по свободному описанию замысла, из которой рождается первичная документация по канону av-dev: паспорт, CLAUDE.md с инвариантами и командами, модель угроз с периметром и скелет остальных документов; первые цели собирает интервью, а записывает их вызовом скилла av-dev-tasks:tasks — роадмап принадлежит плагину задач. OpenSpec заводит не сам, а вызовом скилла av-dev-code:openspec — каталог принадлежит конвейеру; плагина конвейера нет — шаг пропускается строкой доклада. Использовать, когда начинают новый проект с нуля, когда есть только текст «что мне нужно и почему» и надо превратить его в рабочую документацию, когда просят провести стартовое интервью по брифу. Проект, где документация уже как-то ведётся, переводит скилл canon."
---
# Заведение нового проекта
@@ -26,12 +26,17 @@ description: "Завести новый проект — сессия вопро
| `passport.md` | `architecture.md` |
| `CLAUDE.md` | `database.md` |
| `security.md` | `conventions/` |
| `tasks/ROADMAP.md` — первые цели | `research/`, `adr/` |
| `docs/.pm.json` | `review.md` — журнал пуст, настройка появится с первым ревью |
| `docs/.pm.json` | `research/`, `adr/` |
| | `review.md` — журнал пуст, настройка появится с первым ревью |
Честная строка информативна, а не «TBD»: «архитектуры пока нет: кода нет,
заводится первой задачей». Проход читает её как факт.
**`tasks/ROADMAP.md` в таблице нет намеренно.** Первые цели `init` собирает
интервью (блок 6), но записывает их не он: каталогом задач и формой целей владеет
`av-dev-tasks:tasks`, и это шаг 7. Плагина нет — цели остаются списком в докладе,
роадмапа в проекте не появляется, и это говорится строкой.
## Порядок интервью — зависимость, а не удобство
Каждый блок опирается на ответ предыдущего; переставлять нельзя.
@@ -66,7 +71,7 @@ description: "Завести новый проект — сессия вопро
## Обращение к соседним плагинам
Два шага из девяти — вызовы чужого: OpenSpec заводит конвейер, каталог задач
Два шага порядка работы — вызовы чужого: OpenSpec заводит конвейер, каталог задач
ведёт плагин задач. Ни того, ни другого `init` не делает руками.
**Копия.** Дом правила — `shared/plugin-boundary.md` в репозитории плагинов.
@@ -123,8 +128,14 @@ description: "Завести новый проект — сессия вопро
тоже строка доклада.
8. `docs.py check` из скилла `canon` — до отсутствия дрейфа. Замечания о
незаполненных плейсхолдерах остаются: их закрывает не `init`, а работа.
9. Покажи человеку, что получилось, и **отдельным списком** — что выведено из
брифа, что предположено, что осталось неизвестным. Правят по этим строкам.
9. **Вычитай написанное — агент `doc-wording`**, по пачке заполненных документов
(`passport.md`, `CLAUDE.md`, `security.md`). Здесь он нужен сильнее, чем где
бы то ни было: весь текст сочинён только что и по свободному брифу человека, а
бриф — это как раз залог, оценки без факта и жаргон. Скелеты с честной строкой
в пачку не клади, вычитывать в них нечего. Находки — готовые формулировки,
подставляешь их ты.
10. Покажи человеку, что получилось, и **отдельным списком** — что выведено из
брифа, что предположено, что осталось неизвестным. Правят по этим строкам.
## Что дальше