журнал решений: разложен по теме на файл, метки решений стали номерами
- DECISIONS.md (4040 строк, 65 тем) → decisions/, файл на тему плюс указатель; - буквенные метки решений заменены сквозными Р1–Р234, следствия получили префикс С при прежних номерах: схема букв выродилась до пятибуквенных и сломалась — `АЕАКЛ` была занята и темой 53, и темой 65; - 42 перекрёстные ссылки переписаны под новые номера и стали живыми; где номер означал тему, а слово стояло «решение», формулировка исправлена.
This commit is contained in:
@@ -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` уже сверяет миграции с документацией, так
|
||||
что место есть; но гейт принадлежит проекту, и плагин может только рекомендовать
|
||||
строкой в отчёте.
|
||||
Reference in New Issue
Block a user