канон 4: секция «Сопровождение», «Готово» вниз, порядок закреплён

healthlog уже переехал на канон 3, а переименование секции я внёс
правкой записи версии 3 задним числом — то есть переписал текст, по
которому он ехал. Посылка «ни один проект на каноне 3 не стоит» была
ложной, решение ШШШ отменено.

Запись версии — черновик ровно до первого переехавшего проекта. После
этого она история, и любое изменение канона заводит новую версию, даже
если меняется одно слово. Проверять дёшево: grep '"canon"' по живым
проектам. Дорого обратное — проект, повышенный по тексту, которого
больше не существует, невоспроизводим.

Запись версии 3 восстановлена дословно (Разработка | Tooling),
переименование уехало в версию 4. jellybit, стоящий на каноне 2,
прочтёт обе записи подряд и заведёт Разработка, чтобы через шаг
переименовать; в шаг версии 3 добавлена оговорка «едешь сразу на 4 —
заводи Готово последней и не переставляй дважды».

«Готово» переехало вниз, и порядок секций стал каноническим.
Достигнутое копится: через год этой секции больше, чем всех остальных
вместе, и стоя первой она отодвигает за экран то, ради чего роадмап
открывают чаще всего. Порядок проверяет roadmap_lint, переставляет
check --fix — вместе с содержимым секций, потому что двигать десяток
строк руками это работа, на которой ошибаются. Чужую секцию
перестановка не трогает вовсе: её место в порядке неизвестно.

Индексы позиций считаются из самого кортежа: ACHIEVED был 0 и стал 3,
хардкод пережил бы перестановку молча и сломал бы close.

Обкатка нашла два дефекта оформления, оба порождённые самой
перестановкой. Отбивка нужна и перед заголовком — сдвиг блоков ставит
два заголовка вплотную. Удаление строки индекса оставляет две пустые
подряд, и пустоты копятся. Проверка оформления теперь сверяется с самим
нормализатором, а не своим набором условий: два описания одного правила
разъедутся, и check начнёт молчать о том, что --fix правит.

CANON_VERSION = 4 в docs.py, примеры .pm.json в canon.md и skeletons.md.

DECISIONS тема 26 (ЭЭЭ, ЮЮЮ, ЯЯЯ, следствия 98–100).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-08-04 20:29:15 +03:00
co-authored by Claude Opus 5
parent d7e9740c73
commit 069205ac69
9 changed files with 240 additions and 56 deletions
+58 -5
View File
@@ -1746,11 +1746,13 @@ ADR, запискам разведки и сообщениям коммитов
смысл — сошлись на смысле, потому что метрики, логи, инфраструктура и выкладка
в эту секцию просятся и так.
**ШШШ. Версия канона не менялась, и это законно.** Ни один проект на каноне 3 не
стоит: healthlog и jellybit держат канон 2, повышение только предстоит. Запись
версии 3 правится **как черновик**, а не как история: тот, кто по ней поедет,
увидит сразу `Сопровождение`. Версия отделяет одно **состояние проектов** от
другого, а не одну редакцию текста от другой.
**ШШШ. Версия канона не менялась, и это законно.** ~~Ни один проект на каноне 3
не стоит: healthlog и jellybit держат канон 2, повышение только предстоит.~~
**Отменено в тот же день (тема 26).** Посылка была ложной: healthlog уже переехал
на канон 3, и правка записи версии 3 задним числом переписывала то, по чему он
ехал. Правило осталось верным, применение — нет: черновиком запись версии
является ровно до того, как **первый** проект по ней поехал.
**ЩЩЩ. Сопровождение и эксплуатация — целое и часть, и словарь у трёх мест
общий.** Тема живёт в трёх документах, и раньше каждое место говорило своим
@@ -1781,3 +1783,54 @@ ADR, запискам разведки и сообщениям коммитов
переименовании `Разработка` → `Сопровождение` проверка назвала секцию
роадмапа чужой и остановилась: регистр она правит сама, смысл — нет. Ровно
то поведение, которое нужно проекту при повышении канона.
## 26. Канон 4: правка задним числом отменена (2026-08-04)
### Что было
Секцию `Разработка` переименовали в `Сопровождение` без повышения версии канона —
на посылке «ни один проект на каноне 3 не стоит» (тема 25, ШШШ). Посылка
оказалась ложной: healthlog уже переехал, `docs/.pm.json` держит `"canon": 3`, а
роадмап — секцию `Разработка` с прописной. Правка записи версии 3 переписывала
то, по чему он ехал.
### Решено
**ЭЭЭ. Запись версии — черновик ровно до первого переехавшего проекта.** После
этого она **история**, и любое изменение канона заводит новую версию, даже если
меняется одно слово. Проверять это дёшево: `grep '"canon"' */docs/.pm.json` по
живым проектам. Дорого — обратное: проект, повышенный по тексту, которого больше
не существует, невоспроизводим.
Запись версии 3 восстановлена дословно (`Разработка` | `Tooling`), переименование
уехало в версию 4. jellybit, стоящий на каноне 2, прочтёт обе записи подряд и
заведёт `Разработка`, чтобы через шаг переименовать; в шаг версии 3 добавлена
оговорка «едешь сразу на 4 — заводи `Готово` последней и не переставляй дважды».
Лишний шаг — плата за честную историю, и она мала.
**ЮЮЮ. `Готово` переехало вниз, и порядок секций стал каноническим.**
Достигнутое **копится**: через год этой секции больше, чем всех остальных
вместе, — и стоя первой она отодвигает за экран ровно то, ради чего роадмап
открывают чаще всего. Порядок теперь проверяется (`roadmap_lint`) и правится
(`check --fix` переставляет секции вместе с содержимым): без проверки порядок
разъедется молча, а переставлять секцию с десятком строк руками — работа, на
которой ошибаются.
**ЯЯЯ. Индексы позиций считаются из самого кортежа.** `ACHIEVED` был `0` и стал
`3`; хардкод индексов пережил бы перестановку молча и сломал бы `close`. Теперь
`PLANNED, DIRECTIONS, OPERATIONS, ACHIEVED = range(len(ROADMAP_SECTIONS))` —
переставили секцию, индексы переехали сами.
### Что из этого следует
98. **Отбивка нужна и перед заголовком.** Перестановка блоков ставит два
заголовка вплотную — `spaced_sections` правил только строку после. Дефект
нашёлся сразу же, на первой перестановке демо-набора: класс правки,
существующий только потому, что появилась другая правка.
99. **`check --fix` переставляет, но не переименовывает.** Чужую секцию он
оставляет ошибкой, и на переименовании `Разработка` → `Сопровождение`
останавливается: имя — решение человека, порядок — механика. Тот же разрез,
что между регистром (правит) и составом (не трогает).
100. **Версия канона отделяет состояния проектов, а не редакции текста** — и
ровно поэтому её нельзя не поднять, когда состояние хоть одного проекта
уже зафиксировано.