- DECISIONS.md (4040 строк, 65 тем) → decisions/, файл на тему плюс указатель; - буквенные метки решений заменены сквозными Р1–Р234, следствия получили префикс С при прежних номерах: схема букв выродилась до пятибуквенных и сломалась — `АЕАКЛ` была занята и темой 53, и темой 65; - 42 перекрёстные ссылки переписаны под новые номера и стали живыми; где номер означал тему, а слово стояло «решение», формулировка исправлена.
6.7 KiB
5. Старт проекта и жизненный цикл под каноном (2026-08-03)
Что было
Требование Т1: прийти в любой старый проект и перевести на текущие рельсы; канон сам меняется, значит уже приведённые проекты тоже повышаются.
Существующий 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: звать ли docs.py check из
гейта проекта. У healthlog task gate уже сверяет миграции с документацией, так
что место есть; но гейт принадлежит проекту, и плагин может только рекомендовать
строкой в отчёте.