# 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.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` уже сверяет миграции с документацией, так что место есть; но гейт принадлежит проекту, и плагин может только рекомендовать строкой в отчёте.