healthcheck: у судей документов появился свой скилл и свой момент
doc-consistency и doc-code-drift звались шагом сессии между спринтами. Сессия стала грумингом, груминг судит задачи, а не документы, и звать чужих агентов не вправе — они в av-dev-docs. На живом проекте их не звал бы никто, кроме разовых adopt и upgrade. Момент назван у владельца. Разрез с canon check проверяемый: машина сверяет форму, healthcheck — утверждения. Почему скилл, а не просто описания агентов: двоим нужна оркестровка — позвать обоих на весь канон разом, передать doc-code-drift раздел запретов, разобрать урожай порциями, назвать границы покрытия и кого именно позвал. Этого агент о себе не знает. doc-wording внутрь не взят: ему оркестровка не нужна, и ритм другой — он нужен там, где текст только что писали. Заодно из shared/plugin-boundary.md и README убран счётчик скиллов: он протух дважды за день.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "av-dev-docs",
|
||||
"description": "Документация проекта: канон раскладки (CLAUDE.md плюс docs/ — паспорт, архитектура, схема БД, безопасность, конвенции, разведка, ADR, журнал ревью), роли документов и правило единственного дома. Три операции одной машиной сравнения — check, adopt, upgrade — со скриптом docs.py; заведение нового проекта интервью по брифу; ведение содержимого по ходу разработки: синк после сделанной задачи, ADR промоутом из архивного design.md, записка разведки, запись дефекта в журнал ревью. Смысловое, чего скрипт не видит, судят три агента: doc-consistency, doc-code-drift, doc-wording. Задач не ведёт — это плагин av-dev-tasks, и он опционален.",
|
||||
"description": "Документация проекта: канон раскладки (CLAUDE.md плюс docs/ — паспорт, архитектура, схема БД, безопасность, конвенции, разведка, ADR, журнал ревью), роли документов и правило единственного дома. Три операции одной машиной сравнения — check, adopt, upgrade — со скриптом docs.py; заведение нового проекта интервью по брифу; ведение содержимого по ходу разработки: синк после сделанной задачи, ADR промоутом из архивного design.md, записка разведки, запись дефекта в журнал ревью. Смысловое, чего скрипт не видит, судит скилл healthcheck двумя агентами разом — doc-consistency (документы между собой и с openspec) и doc-code-drift (факты против кода); язык документов вычитывает агент doc-wording. Задач не ведёт — это плагин av-dev-tasks, и он опционален.",
|
||||
"author": {
|
||||
"name": "Anton Vakhrushev",
|
||||
"email": "anwinged@gmail.com"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: doc-code-drift
|
||||
description: "Сверка документов канона с кодом по закрытому перечню проверяемых фактов: имя основной ветки и команды из CLAUDE.md, запреты с путями, testdata и временный каталог, путь миграций из .pm.json, внешние зависимости поимённо в architecture.md против манифеста, настройки с числовым значением в database.md против конфига и кода, единые точки проекта против реального числа реализаций, capability против существующих модулей. Отвечает на «этот факт ещё верен», а не «эта архитектура правильная». Читает весь репозиторий, гоняет только читающие команды. Отдаёт готовые формулировки и ничего не правит сам. Согласованность документов между собой смотрит агент doc-consistency. Использовать на сессии между спринтами, а также после приведения проекта к канону (adopt) и после повышения версии канона (upgrade). Только чтение."
|
||||
description: "Сверка документов канона с кодом по закрытому перечню проверяемых фактов: имя основной ветки и команды из CLAUDE.md, запреты с путями, testdata и временный каталог, путь миграций из .pm.json, внешние зависимости поимённо в architecture.md против манифеста, настройки с числовым значением в database.md против конфига и кода, единые точки проекта против реального числа реализаций, capability против существующих модулей. Отвечает на «этот факт ещё верен», а не «эта архитектура правильная». Читает весь репозиторий, гоняет только читающие команды. Отдаёт готовые формулировки и ничего не правит сам. Согласованность документов между собой смотрит агент doc-consistency. Зовётся скиллом av-dev-docs:healthcheck — на весь канон разом; он же зовётся шагом adopt и шагом upgrade. Только чтение."
|
||||
tools: Read, Grep, Glob, Bash
|
||||
model: sonnet
|
||||
color: green
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: doc-consistency
|
||||
description: "Сверка документов канона между собой и с openspec: один факт, живущий в двух домах, прямое противоречие между документами (периметр, зависимости, обратимость), поведение системы, осевшее в architecture.md вместо спек, capability без обзора или с пересказом требований, число без провенанса в research, ADR без ссылки на архивный design.md и без парного статуса при замене, заглушка вместо честной строки в пустом слоте. Читает docs/ и openspec/, кода не читает. Отдаёт готовые формулировки и ничего не правит сам. Соответствие документов коду смотрит агент doc-code-drift, язык — doc-wording. Использовать на сессии между спринтами, а также после приведения проекта к канону (adopt) и после повышения версии канона (upgrade), на весь канон разом; на отдельной задаче не звать. Только чтение."
|
||||
description: "Сверка документов канона между собой и с openspec: один факт, живущий в двух домах, прямое противоречие между документами (периметр, зависимости, обратимость), поведение системы, осевшее в architecture.md вместо спек, capability без обзора или с пересказом требований, число без провенанса в research, ADR без ссылки на архивный design.md и без парного статуса при замене, заглушка вместо честной строки в пустом слоте. Читает docs/ и openspec/, кода не читает. Отдаёт готовые формулировки и ничего не правит сам. Соответствие документов коду смотрит агент doc-code-drift, язык — doc-wording. Зовётся скиллом av-dev-docs:healthcheck — на весь канон разом; он же зовётся шагом adopt и шагом upgrade. На отдельной задаче и на синке документации не звать. Только чтение."
|
||||
tools: Read, Grep, Glob
|
||||
model: opus
|
||||
color: yellow
|
||||
|
||||
@@ -127,15 +127,13 @@ capability: незаполненный канон это переходное с
|
||||
## `check`
|
||||
|
||||
1. `docs.py check`, при наличии базы диффа — с `--base`.
|
||||
2. **Агентов на каждом `check` не зови.** Оба — `doc-consistency` и
|
||||
`doc-code-drift` — зовутся раз в спринт (шаг сессии), а также шагом 6 `adopt`
|
||||
и шагом 6 `upgrade`, на весь канон разом. Они дороги: `doc-consistency` — тем,
|
||||
что на `opus` (сличение утверждений это суждение), `doc-code-drift` — тем, что
|
||||
читает репозиторий целиком, хотя сам идёт на `sonnet`. Позвал
|
||||
`doc-code-drift` — передай ему раздел запретов `CLAUDE.md`.
|
||||
3. Доклад: вывод скрипта строкой исхода, находки агентов поимённо, **граница
|
||||
покрытия** — что смотрели и чего не смотрели, и **кого из двоих позвал**:
|
||||
доклад, умолчавший об этом, читается как «сверено».
|
||||
2. **Судей документов на каждом `check` не зови.** Ими владеет отдельный скилл —
|
||||
`av-dev-docs:healthcheck`, — и там же записано, когда его звать: он дорог, и
|
||||
прогон по каждому `check` не окупается. `check` отвечает на «сходится ли
|
||||
форма», `healthcheck` — на «не разошлись ли утверждения».
|
||||
3. Доклад: вывод скрипта строкой исхода и **граница покрытия** — что смотрели и
|
||||
чего не смотрели. Если суждение здесь нужно, скажи это строкой и предложи
|
||||
`healthcheck`, а не зови агентов сам.
|
||||
|
||||
Дрейф раскладки чинится переносом; смысловые находки — это либо правка
|
||||
документа, либо задача, если работы больше чем на абзац.
|
||||
@@ -229,8 +227,8 @@ capability), `openspec/config.yaml`.
|
||||
проекте обычно самый урожайный — правило единственного дома до адаптации никто не
|
||||
проверял.
|
||||
|
||||
Зови **`doc-consistency`** (документы между собой и с openspec) и
|
||||
**`doc-code-drift`** (факты против кода). Разбирай порциями, а не одним заходом.
|
||||
Вызови Skill **`av-dev-docs:healthcheck`** — он зовёт обоих судей на весь канон
|
||||
разом и держит разбор урожая порциями.
|
||||
|
||||
**Передай им объявленное переходное состояние из шага 5** — иначе честная строка
|
||||
в незаполненном слоте вернётся находкой, а это не поломка, а объявленный долг.
|
||||
@@ -245,7 +243,7 @@ capability), `openspec/config.yaml`.
|
||||
применяются по порядку.
|
||||
4. Подними `canon` в `docs/.pm.json` до текущей.
|
||||
5. `docs.py check`.
|
||||
6. **Позови обоих судей** — `doc-consistency` и `doc-code-drift`.
|
||||
6. **Позови судей** — Skill `av-dev-docs:healthcheck`.
|
||||
|
||||
Записи журнала описывают **что сделать проекту**. Если запись этого не говорит —
|
||||
это дефект журнала, и о нём надо сказать, а не догадываться.
|
||||
|
||||
@@ -149,8 +149,8 @@ openspec/
|
||||
Цена этого решения записана, а не подразумевается: **расхождение изменения с
|
||||
записанным решением прогоном больше не ловится.** Раньше архитектурный проход
|
||||
читал `adr/` и мог сказать «здесь отменено решение ADR-2026-03-11, а парного
|
||||
статуса нет»; теперь это скажет только `doc-consistency` на сессии между
|
||||
спринтами. Сделка сознательная — ADR объясняет прошлое, а не предъявляет
|
||||
статуса нет»; теперь это скажет только `doc-consistency`, а зовёт его скилл
|
||||
`healthcheck`. Сделка сознательная — ADR объясняет прошлое, а не предъявляет
|
||||
требование к изменению, и чтение всего каталога решений на каждой задаче
|
||||
оплачивалось на каждой, а срабатывало на единицах.
|
||||
|
||||
@@ -521,8 +521,9 @@ kebab-case.** Причина не эстетическая: имя файла с
|
||||
читающие команды. Слитый агент делал бы одну половину поверхностной; тот же
|
||||
разрез, что между `task-form` и `task-wording`.
|
||||
|
||||
**Зовутся оба одинаково — раз в спринт на сессии, а также после `adopt` и после
|
||||
`upgrade`, на весь канон разом.** Не на синке документации: `doc-consistency` на
|
||||
**Зовутся оба одинаково и одним скиллом — `av-dev-docs:healthcheck`, на весь
|
||||
канон разом; шагом `adopt` и шагом `upgrade` его зовёт `canon`.** Не на синке
|
||||
документации: `doc-consistency` на
|
||||
`opus` по каждой сделанной задаче не окупается, а расхождение между двумя документами по
|
||||
определению требует двух, и на большинстве задач синк правит один. Пачка,
|
||||
отбираемая работой, вдобавок не видит того, чего работа не касалась, — а именно
|
||||
|
||||
@@ -62,12 +62,13 @@ description: Вести содержимое документов канона
|
||||
`security.md` не знает про новый эндпоинт. Поймать это на своей же правке нельзя,
|
||||
и судит это агент `doc-consistency`.
|
||||
|
||||
**Но синк его не зовёт.** Оба судьи документов — `doc-consistency` и
|
||||
`doc-code-drift` — зовутся раз в спринт, шагом сессии, на весь канон разом.
|
||||
Причина в цене: `doc-consistency` на `opus` по каждой сделанной задаче — самая
|
||||
дорогая церемония процесса, а `doc-code-drift` хоть и на `sonnet`, но читает
|
||||
репозиторий целиком. К тому же расхождение между двумя документами по определению
|
||||
требует двух документов, а на большинстве задач синк правит один.
|
||||
**Но синк его не зовёт.** Обоими судьями документов владеет скилл
|
||||
`av-dev-docs:healthcheck`, и зовут их на весь канон разом, а не на пачку,
|
||||
отобранную работой. Причина в цене: `doc-consistency` на `opus` по каждой
|
||||
сделанной задаче — самая дорогая церемония процесса, а `doc-code-drift` хоть и на
|
||||
`sonnet`, но читает репозиторий целиком. К тому же расхождение между двумя
|
||||
документами по определению требует двух документов, а на большинстве задач синк
|
||||
правит один.
|
||||
|
||||
Что теряется: привязка находки к задаче, которая её породила. Что выигрывается,
|
||||
кроме денег: синк перестаёт отбирать пачку, и в неё попадают документы,
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
---
|
||||
name: healthcheck
|
||||
description: "Проверка здоровья документации проекта судом, а не машиной: не разошлись ли документы между собой и с кодом. Зовёт двух агентов на весь канон разом — doc-consistency (один факт в двух домах, прямое противоречие, поведение в architecture.md вместо спек, ADR без парного статуса, число без провенанса) и doc-code-drift (протухший факт: имя ветки, команды, пути, зависимости поимённо, настройки с числом, единые точки, capability). Разбирает урожай порциями: строка на замену идёт в документ сразу, работа больше абзаца становится задачей. Использовать, когда с прошлой сверки сделан десяток задач, когда вернулись к проекту после перерыва, перед тем как опереться на документ в решении, а также шагом adopt и upgrade. Дорого — не на каждой задаче. Раскладку и версию канона проверяет скилл canon, язык документов — агент doc-wording."
|
||||
---
|
||||
|
||||
# Здоровье документации
|
||||
|
||||
Проверяет то, **чего машина не видит**: разошлись ли документы между собой и с
|
||||
кодом. Раскладка, версия, битые ссылки, нетронутые плейсхолдеры — это `canon
|
||||
check` и его скрипт; здесь начинается там, где кончается `docs.py`.
|
||||
|
||||
Разрез проверяемый: **машина сверяет форму, этот скилл — утверждения**. «В
|
||||
`architecture.md` есть раздел» проверит скрипт. «В `architecture.md` написано,
|
||||
что зависимость одна, а в манифесте их три» — суждение, и его выносит агент.
|
||||
|
||||
## Когда звать
|
||||
|
||||
**Зовёт человек**, но признак наблюдаемый, а не календарный:
|
||||
|
||||
- **с прошлой сверки сделан десяток задач.** Документы протухают ровно от
|
||||
сделанной работы: переименованная цель сборки, ушедшая зависимость, второй
|
||||
способ делать то, что обзор объявил единственным, факт, дописанный в
|
||||
`architecture.md` и уже живущий в `CLAUDE.md`;
|
||||
- **вернулись к проекту после перерыва** — прежде чем опираться на написанное;
|
||||
- **перед тем как опереться на документ в решении**, если оно дорогое;
|
||||
- шагом `adopt` и шагом `upgrade` — их зовёт скилл `canon` сам.
|
||||
|
||||
**Не на каждой задаче и не на каждом синке документации.** Цена реальная:
|
||||
`doc-consistency` идёт на `opus`, потому что сличение утверждений — суждение;
|
||||
`doc-code-drift` хоть и на `sonnet`, но читает репозиторий целиком. Прогон по
|
||||
каждой сделанной задаче был бы самой дорогой церемонией процесса, а находок дал
|
||||
бы почти те же: документы расходятся не с одной задачи, а с десятка.
|
||||
|
||||
Прежде оба звались шагом сессии между спринтами. Спринтов нет, и **момент
|
||||
пришлось назвать заново** — иначе их не звал бы никто, кроме разовых `adopt` и
|
||||
`upgrade`, то есть на живом проекте никогда.
|
||||
|
||||
## Обращение к соседним плагинам
|
||||
|
||||
**Копия.** Дом — `shared/plugin-boundary.md` в репозитории плагинов. Правится
|
||||
дом, а не этот файл.
|
||||
|
||||
<!-- копия: граница-плагинов из shared/plugin-boundary.md -->
|
||||
|
||||
Плагины `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` — конвейер.
|
||||
|
||||
<!-- /копия: граница-плагинов -->
|
||||
|
||||
Здесь сосед один: `av-dev-tasks:tasks`, когда находка тянет на задачу. Его нет —
|
||||
находки остаются списком в докладе, и это говорится строкой.
|
||||
|
||||
## Пачка — весь канон, и это не расточительство
|
||||
|
||||
Оба агента зовутся **на весь канон разом**, а не на пачку, отобранную работой.
|
||||
|
||||
Когда пачку отбирала работа, без присмотра оставалось ровно то, чего работа не
|
||||
касалась: правка, отменившая решение, живёт в одном документе, а парный статус
|
||||
нужен в другом; факт, продублированный год назад, не попадёт ни в один диапазон
|
||||
диффа. Канон мал — он читается целиком, и цена этого известна заранее.
|
||||
|
||||
## Кого зовёшь и что передаёшь
|
||||
|
||||
| Агент | Что смотрит | Читает | Модель |
|
||||
| --- | --- | --- | --- |
|
||||
| `doc-consistency` | смысловой дубль, прямое противоречие между документами, поведение в `architecture.md` вместо спек, ADR без ссылки и парного статуса, число без провенанса, заглушка вместо честной строки | `docs/`, `openspec/` | `opus` |
|
||||
| `doc-code-drift` | протухший факт: имя ветки, команды, пути, зависимости поимённо, настройки с числом, единые точки проекта, capability | весь репозиторий | `sonnet` |
|
||||
|
||||
**`doc-code-drift` обязан получить раздел запретов `CLAUDE.md`.** Он гоняет
|
||||
команды — только читающие, — и без перечня запретов не знает, чего в этом
|
||||
проекте запускать нельзя. Не передал — он либо остановится, либо тронет то, чего
|
||||
трогать не следовало.
|
||||
|
||||
**Судит не тот, кто писал.** Ни один из двоих ничего не правит: оба возвращают
|
||||
готовые формулировки, подставляешь ты. Самопроверка документа слабее всего ровно
|
||||
там, где формулировка казалась удачной при написании.
|
||||
|
||||
Одного из двух можно позвать отдельно — но **скажи в докладе, кого именно
|
||||
позвал**. Доклад, умолчавший об этом, читается как «сверено целиком».
|
||||
|
||||
## Разбор урожая
|
||||
|
||||
Находки — обычный материал правки, и разбирать их надо **порциями**, а не одним
|
||||
заходом: тридцать находок подряд получают «принято» не потому, что верны, а
|
||||
потому, что разбор затянулся.
|
||||
|
||||
По каждой находке ровно три исхода:
|
||||
|
||||
1. **Строка на замену** — правь документ сразу. Формулировка уже готова, спорить
|
||||
не с чем, и откладывание превращает её в задачу дороже самой правки.
|
||||
2. **Работа больше чем на абзац** — задача типа `chore`. Заводит её **не этот
|
||||
скилл**: вызови Skill `av-dev-tasks:tasks`, у него свой формат, дедупликация
|
||||
против беклога и кладбища. Плагина нет — отдай списком в докладе и скажи это
|
||||
строкой.
|
||||
3. **Не находка** — агент ошибся, документ прав. Скажи это прямо: неразобранная
|
||||
находка и отклонённая различаются, и вторая экономит время на следующем
|
||||
прогоне. Класс ошибок, который повторяется, идёт в `docs/review.*`, раздел
|
||||
настройки, — там дом типовых ложноположительных.
|
||||
|
||||
## Доклад
|
||||
|
||||
- **Кого позвал** — обоих или одного, и почему одного.
|
||||
- Находки по каждому агенту: сколько, что поправлено сразу, что стало задачей
|
||||
(со слагами), что отклонено и почему.
|
||||
- **Границы покрытия**: что смотрели и чего не смотрели. У `doc-code-drift` она
|
||||
идёт из его собственного отчёта — перечень фактов у него закрытый, и он
|
||||
называет, какие из них проверить было нечем.
|
||||
- Канона в проекте нет вовсе — это исход, а не пустой прогон: скажи строкой и
|
||||
предложи `av-dev-docs:canon`.
|
||||
|
||||
## Чего этот скилл не делает
|
||||
|
||||
- **Не проверяет раскладку, версию и ссылки** — это `canon check`, там машина.
|
||||
- **Не судит язык** документов: залог, англицизмы, жаргон, термин без дома — это
|
||||
агент `doc-wording`, и зовут его отдельно, по пачке правленных документов. У
|
||||
него другой ритм: он нужен там, где текст только что писали, а не там, где он
|
||||
год лежал. Оркестровать его нечем — он один и работает по названному списку.
|
||||
- **Не правит документы за агентов** — они возвращают формулировки, решение
|
||||
подставить принимает человек или ты по его правилу.
|
||||
- **Не заводит задачи** — этим владеет `av-dev-tasks:tasks`.
|
||||
Reference in New Issue
Block a user