- DECISIONS.md (4040 строк, 65 тем) → decisions/, файл на тему плюс указатель; - буквенные метки решений заменены сквозными Р1–Р234, следствия получили префикс С при прежних номерах: схема букв выродилась до пятибуквенных и сломалась — `АЕАКЛ` была занята и темой 53, и темой 65; - 42 перекрёстные ссылки переписаны под новые номера и стали живыми; где номер означал тему, а слово стояло «решение», формулировка исправлена.
90 lines
6.7 KiB
Markdown
90 lines
6.7 KiB
Markdown
# 5. Старт проекта и жизненный цикл под каноном (2026-08-03)
|
||
|
||
## Что было
|
||
|
||
Требование [Т1](README.md): прийти в любой старый проект и перевести на текущие
|
||
рельсы; канон сам меняется, значит уже приведённые проекты тоже повышаются.
|
||
|
||
Существующий `adopt` (уровень задач) даёт готовую форму: **`scan` — только
|
||
чтение, карта → суждение человека → `apply` — запись одним проходом**, с отказом
|
||
до первой записи при неверной карте и с обязательным разделом «не разложилось»
|
||
поимённо. Форма переносится на уровень канона как есть.
|
||
|
||
Четыре операции различаются не поровну: `adopt`, `check` и `upgrade` — одна
|
||
машина сравнения с разными исходами, а `init` — принципиально другой режим,
|
||
разговор, а не сверка.
|
||
|
||
## Решено
|
||
|
||
**Р18. Два скилла: `av-dev-pm:init` и `av-dev-pm:canon`.** `init` — интервью по
|
||
входному брифу для нового проекта. `canon` — привести к канону: `check`,
|
||
`adopt`, `upgrade` одной машиной.
|
||
|
||
**Р19. Скелет канона заводится целиком, незаполненное называется пустым.** Все
|
||
файлы канона есть с первого дня, но незаполненный держит **одну честную
|
||
информативную строку**: «наблюдений на живых данных нет — внешний источник один,
|
||
формат документирован», «прецедентов не накоплено», «внешних зависимостей нет,
|
||
смотри на диск и на СУБД».
|
||
|
||
*Причина:* это тот же принцип, что был в контракте брифа, поднятый на уровень
|
||
файлов. Проход читает такую строку **как факт**, а не как пробел, и не тратит
|
||
обязательный вопрос впустую. Отсутствие файла он прочитать не может никак.
|
||
|
||
**Защита от вырождения в заглушки** берётся у `tasks.py`: пока на месте стоит
|
||
плейсхолдер шаблона, `check` о нём напоминает. Строка «TBD» — это не «пустое
|
||
названо пустым», и `check` обязан их различать.
|
||
|
||
**Р20. Скрипт `docs.py` плюс версия канона в `docs/.pm.json`.** Отдельный
|
||
скрипт, не расширение `tasks.py`: рефакторинг 2421 работающей строки ради
|
||
удобства вызова не окупается. `docs.py check` зовёт `tasks.py check` для своей
|
||
части.
|
||
|
||
**Граница механизируемого объявляется вслух — иначе `check` соврёт.**
|
||
|
||
| Проверяет `docs.py` | Судит агент |
|
||
| --- | --- |
|
||
| отсутствующие пути канона | смысловой дубль (`docs/specs/recognition.md` против capability) |
|
||
| файлы в `docs/` вне канона | поведение, оставшееся в `architecture.md` |
|
||
| битые относительные ссылки | протухший факт, разошедшийся с кодом |
|
||
| версия канона и её отставание | достаточность честной строки в пустом слоте |
|
||
| нетронутый плейсхолдер шаблона | |
|
||
|
||
`check`, отчитавшийся «канон соблюдён» на проекте, где из шести файлов три
|
||
лишние, хуже отсутствующего.
|
||
|
||
## Порядок интервью `init` — зависимость, а не удобство
|
||
|
||
Цель и потребители → чем это **не** является и мера успеха → периметр и что
|
||
недоверенное → стек, хранилище, необратимое → чем краснеет гейт → первые цели в
|
||
`PLAN.md`. Каждый блок опирается на ответ предыдущего.
|
||
|
||
Вход — свободный текст «что мне нужно и почему» (образец формы: `BRIEF.md`
|
||
jellybit, 6 КБ). После `init` его дом — `passport.md`; отдельным файлом он не
|
||
остаётся.
|
||
|
||
**`init` физически не производит полный канон.** В новом репозитории нет кода, а
|
||
`architecture.md`, `database.md`, `conventions/` и `research/` выводятся из него.
|
||
Они заводятся скелетом с честной строкой («архитектуры пока нет: кода нет,
|
||
заводится первой задачей») и наполняются шагом синка документации.
|
||
|
||
## Что из этого следует
|
||
|
||
**С23. `docs/.pm.json` поглощает `<tasks>/.tasks.json`.** Меняется цепочка
|
||
разрешения в `tasks.py` — сегодня он ищет `.tasks.json` вверх от текущего
|
||
каталога. Нужен переходный период либо чтение обоих.
|
||
|
||
**С24. `tasks.py adopt` становится шагом внутри `canon adopt`**, а не отдельной
|
||
пользовательской операцией: `docs/tasks/` — часть той же раскладки.
|
||
|
||
**С25. Версия канона — целое число**, не semver: у канона нет обратной
|
||
совместимости, есть только «приведён» и «не приведён».
|
||
|
||
**С26. Журнал изменений канона** живёт в плагине —
|
||
`av-dev-pm/skills/canon/references/changelog.md`, запись на версию: что
|
||
добавилось, что переехало, что удалено, что сделать проекту.
|
||
|
||
**С27. Открыто до [темы 6](06-docs-upkeep.md):** звать ли `docs.py check` из
|
||
гейта проекта. У healthlog `task gate` уже сверяет миграции с документацией, так
|
||
что место есть; но гейт принадлежит проекту, и плагин может только рекомендовать
|
||
строкой в отчёте.
|