словарь, манифесты, README: одно слово — одна вещь, одно описание — один дом

- «готовность» значила и «запись можно брать», и «что считается сделанным»;
  второй смысл стал «определением сделанного» — своё же правило про занятое
  слово запрещало это прямо
- «пайплайн» жил в 24 местах вне журналов при том, что DECISIONS фиксирует
  его уход «целиком»; рабочее имя — конвейер
- «чекпоинт» в review значил стадию и проход, в resolve — остановку человеку;
  слово оставлено за остановкой
- у описания плагина было два дома, и три из четырёх уже разошлись. Сведены,
  и класс закрыт машиной: frontmatter.py сверяет plugin.json с marketplace,
  гейт разбужен на *.json
- README врал про односторонние зависимости и терял healthcheck на диаграмме
- перечень агентов в REMAINING отстал на два поколения

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-08-09 18:45:39 +03:00
co-authored by Claude Opus 5
parent 63ba36d71d
commit 12882911a9
22 changed files with 180 additions and 90 deletions
+36 -15
View File
@@ -20,7 +20,9 @@
ли документы между собой и с кодом. Зовёт двух агентов на весь канон разом —
`doc-consistency` (документы между собой и с openspec) и `doc-code-drift`
(факты против кода) — и разбирает урожай порциями. Дорого, поэтому не на
каждой задаче; язык документов вычитывает отдельный агент `doc-wording`;
каждой задаче. Язык документов вычитывает отдельный агент `doc-wording`, и
зовут его не отсюда, а те, кто только что писал текст: `docs`, `init` и
`canon`;
- `docs` — содержимое канона по ходу разработки: ADR из архивного
`design.md`, промоут конвенций, запись в разведку и журнал ревью, чистка
архитектуры.
@@ -61,7 +63,9 @@
Соглашение об именах: имя **плагина** длинное с префиксом `av-dev-`, имена
**скилов** внутри — короткие. Вызов выходит вида `/av-dev-<плагин>:<скилл>`.
Кто кого зовёт (стрелка — вызов через пространство имён, не импорт):
Кто кого зовёт. Сплошная стрелка — вызов скилла через пространство имён, не
импорт; пунктир — совет позвать, а не вызов. Агенты-проходы в графе не показаны:
их зовут скиллы, названные выше.
```mermaid
flowchart TB
@@ -75,6 +79,7 @@ flowchart TB
init["init"]
canon["canon"]
docs["docs"]
hc["healthcheck"]
end
subgraph tasksp["av-dev-tasks — учёт работ"]
direction LR
@@ -84,6 +89,11 @@ flowchart TB
init --> osp
canon --> tasks
canon --> osp
canon --> hc
hc --> tasks
docs --> rp
rp --> tasks
groom -.-> hc
opsx["opsx:* — внешний плагин:<br/>explore, propose, apply, archive"]
git["av-dev-git: commit"]
@@ -93,9 +103,14 @@ flowchart TB
tp --> tasks
```
Зависимости **односторонние: `av-dev-code` знает про `av-dev-docs` и
`av-dev-tasks`, обратно — нет.** Между собой эти двое тоже не связаны жёстко:
каждый работает без другого. Как именно зовут соседа и что делают, когда вызов не
Зависимости **взаимные, но каждая мягкая**. `av-dev-code` зовёт обоих соседей;
обратные вызовы тоже есть — `av-dev-docs:init` и `av-dev-docs:canon` заводят
OpenSpec скиллом `av-dev-code:openspec`, `av-dev-docs:docs` берёт у
`av-dev-code:review` форму записи журнала дефектов и процедуру промоута,
`av-dev-docs:canon` и `av-dev-docs:healthcheck` зовут `av-dev-tasks:tasks`.
**Мягкая** значит, что у любого вызова есть ветка «не разрешился»: соседа в
проекте нет — вызывающий называет строкой, чего теперь не делает никто, и работу
не останавливает. Как именно зовут соседа и что делают, когда вызов не
разрешился, — `shared/plugin-boundary.md`: правило нужно большинству скиллов, и
ни один плагин им не владеет. То, что нужно нескольким дословно — граница
плагинов, язык проектных текстов, словарь сопровождения, — живёт домом в
@@ -292,17 +307,17 @@ uv run pyrefly check # типы
линтеров, и любой сторонний импорт у него не разрешается. Список запретов —
не перечень мира, настоящий страж второй.
## Проверка фронтматтеров
## Проверка фронтматтеров и описаний плагинов
Фронтматтер читает не человек, а загрузчик: по `name` он разрешает вызов, по
`description` решает, звать ли скилл вообще. **Ошибка здесь не выглядит
ошибкой** — тем же способом, что и в диаграммах.
```
uv run python scripts/frontmatter.py # 0 в порядке, 1 расхождение, 3 не тот каталог
python3 scripts/frontmatter.py # 0 в порядке, 1 расхождение, 3 не тот каталог
```
Ловится три класса:
Ловится четыре класса:
- **двоеточие с пробелом в описании без кавычек.** Для YAML `: ` внутри
простого скаляра начинает вложенное отображение, так что «конвейер ревью: гейт,
@@ -317,7 +332,13 @@ uv run python scripts/frontmatter.py # 0 в порядке, 1 расхожд
[review/SKILL.md](av-dev-code/skills/review/SKILL.md),
разделе «Модель по проходу», здесь только её механизация. Держаться вниманием
правило не может: цвет ставится один раз при заведении charter'а, а модель
потом меняется калибровкой.
потом меняется калибровкой;
- **описание плагина, разошедшееся между манифестами.** У описания два дома:
`<плагин>/.claude-plugin/plugin.json` показывает его установленному плагину,
корневой `.claude-plugin/marketplace.json` — тому, кто выбирает, ставить ли.
Правят обычно один, и разойтись они успели уже трижды из четырёх. `copies.py`
этот класс не берёт: он смотрит markdown, а манифест — json. Отсюда и `*.json`
в глобе задачи гейта.
## Проверка копий правил
@@ -326,7 +347,7 @@ uv run python scripts/frontmatter.py # 0 в порядке, 1 расхожд
говорить. Значит копия допустима, но **дословная и помеченная**:
```
uv run python scripts/copies.py # 0 сошлось, 1 расхождение, 2 разметка, 3 не тот каталог
python3 scripts/copies.py # 0 сошлось, 1 расхождение, 2 разметка, 3 не тот каталог
```
Разметка — HTML-комментарии, невидимые в отрендеренном markdown:
@@ -429,8 +450,8 @@ python3 scripts/addresses.py # весь репозиторий
правдоподобно, диff показывает разумную строку, а рендер падает.
```
uv run python scripts/diagrams.py # весь репозиторий
uv run python scripts/diagrams.py A.md B.md # только названные файлы
python3 scripts/diagrams.py # весь репозиторий
python3 scripts/diagrams.py A.md B.md # только названные файлы
# 0 рендерятся, 1 нет, 3 нет mermaid-cli
```
@@ -461,7 +482,7 @@ lefthook run pre-commit # прогнать руками, не коммитя
| Проверка | Когда идёт | Что смотрит | Сколько |
| --- | --- | --- | --- |
| фронтматтеры | правка `*.md` | весь репозиторий | миллисекунды |
| фронтматтеры | правка `*.md` или `*.json` | весь репозиторий | миллисекунды |
| копии правил | правка `*.md` | весь репозиторий | миллисекунды |
| адреса документов | **каждый коммит** | весь репозиторий | ~0.07 с |
| диаграммы | правка `*.md` | staged-файлы | ~1 с на файл |
@@ -472,8 +493,8 @@ Glob разводит две половины: коммит, трогающий
диаграмм, а коммит в документы не гоняет линтеры.
**Судятся staged-файлы, а не рабочее дерево** — гейт обязан проверять то, что
уедет в историю, а не то, что случайно лежит рядом на диске. Исключений два, и
три, и все про существо, а не про удобство: `copies.py` сверяет копию с домом, а
уедет в историю, а не то, что случайно лежит рядом на диске. Исключений три, и
все про существо, а не про удобство: `copies.py` сверяет копию с домом, а
дом лежит в другом файле, которого в индексе может не быть (список staged дал бы
«копии дословны» ровно там, где правка дома их и разошлась); `frontmatter.py`
обходит весь репозиторий за сотые доли секунды — экономить тут нечего;