журнал решений: разложен по теме на файл, метки решений стали номерами

- DECISIONS.md (4040 строк, 65 тем) → decisions/, файл на тему плюс указатель;
- буквенные метки решений заменены сквозными Р1–Р234, следствия получили
  префикс С при прежних номерах: схема букв выродилась до пятибуквенных и
  сломалась — `АЕАКЛ` была занята и темой 53, и темой 65;
- 42 перекрёстные ссылки переписаны под новые номера и стали живыми; где номер
  означал тему, а слово стояло «решение», формулировка исправлена.
This commit is contained in:
av
2026-08-13 12:40:56 +03:00
parent b411d4edb8
commit bf6a173115
72 changed files with 4253 additions and 4053 deletions
+89
View File
@@ -0,0 +1,89 @@
# 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` уже сверяет миграции с документацией, так
что место есть; но гейт принадлежит проекту, и плагин может только рекомендовать
строкой в отчёте.