скелеты канона догнали канон 12: спринт, версия, чужая проверка

Аудит четырьмя сабагентами показал систематическую дыру: механика правилась,
а описывающее её вовне — нет. Дороже всего скелеты: они уезжают в проект.

- слоты спринта в скелете CLAUDE.md стали слотами груминга, имена взяты
  у groom, а не выдуманы заново — журнал версии 12 их уже назвал
- "canon": 11 в двух образцах стал плейсхолдером: литерал протухал третий
  раз подряд, а незамещённый плейсхолдер ломает разбор громко
- обещание, что docs.py проверяет форму openspec/config.yaml, снято из трёх
  мест; владелец назван полным именем, с оговоркой об отсутствии плагина
- adopt ставил в гейт проекта один шаг из трёх; соседские ставятся по следу
  присутствия, следа нет — строка доклада
- битая ссылка на tasks/ROADMAP.md из скелета паспорта

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-08-09 17:40:14 +03:00
co-authored by Claude Opus 5
parent 4354cc4146
commit c1890d9e71
4 changed files with 52 additions and 19 deletions
@@ -29,7 +29,7 @@
# Паспорт проекта
Зачем это и для кого. [architecture.md](architecture.md) отвечает «как
устроено», [tasks/ROADMAP.md](tasks/ROADMAP.md) — «в каком порядке», паспорт —
устроено», [tasks/ROADMAP.md](../tasks/ROADMAP.md) — «в каком порядке», паспорт —
«зачем и для кого».
## Цель
@@ -401,8 +401,9 @@ severity стоит здесь, а не выводится каждым прох
- **Основная ветка:** <имя>
- **Необратимое** (спрашивается у человека всегда):
- **Общий станок** — какая проверка, покраснев, врывается в замороженный спринт:
- **Ориентир по размеру спринта:** 5–8 задач, ориентир а не закон
- **Что считается сломанным** — какая красная проверка обгоняет развитие,
то есть останавливает текущую работу:
- **Ориентир по размеру порции:** своё число, если замерялось
- **Что такое «сделана»:** пайплайн проекта пройден + критерии приёмки проверены
поимённо
@@ -424,17 +425,26 @@ severity стоит здесь, а не выводится каждым прох
документов. Проект без конвейера каталога `openspec/` не имеет вовсе, и образец
файла, которого у него нет, в скелетах канона лежал бы мёртвым грузом.
Канон о нём всё ещё **высказывается**, но только в одну сторону: `docs.py check`
проверяет форму, **если каталог есть**, и молчит, если его нет. Что именно
проверяется — [canon.md](canon.md), раздел `openspec/config.yaml`.
**Форму не проверяет и `docs.py`** — с канона 10 он о файле молчит вовсе.
Проверяет её тот же владелец: скилл `av-dev-code:openspec`, команда
`openspec.py check`. Плагина конвейера в проекте может не быть — тогда форму не
смотрит никто, и это строка доклада, а не поломка. Что канон о файле всё же
говорит (единственный дом, а не форма) — [canon.md](canon.md), раздел
`openspec/config.yaml`.
## `docs/.pm.json`
```json
{
"canon": 11
"canon": <текущая версия>
}
```
`<текущая версия>` подставляет `init` или `adopt`, целым числом; берётся она из
`docs.py version` (строка «канон скрипта»), а не из памяти. Литерал здесь
протухает при каждом повышении канона, поэтому его тут и нет: незамещённый
плейсхолдер ломает разбор JSON громко, а отставшее число дало бы дрейф молча.
Плюс `"migrations": "<путь>"`, если есть БД. Ключа `"tasks"` здесь **нет**:
настройки каталога задач переехали в свой файл `<каталог задач>/.tasks.json`,
потому что ведёт их другой плагин. Состав ключей — [canon.md](canon.md).