# 26. Канон 4: правка задним числом отменена (2026-08-04) ## Что было Секцию `Разработка` переименовали в `Сопровождение` без повышения версии канона — на посылке «ни один проект на каноне 3 не стоит» (тема 25, [Р102](25-maintenance-section-shared-vocab.md)). Посылка оказалась ложной: healthlog уже переехал, `docs/.pm.json` держит `"canon": 3`, а роадмап — секцию `Разработка` с прописной. Правка записи версии 3 переписывала то, по чему он ехал. ## Решено **Р104. Запись версии — черновик ровно до первого переехавшего проекта.** После этого она **история**, и любое изменение канона заводит новую версию, даже если меняется одно слово. Проверять это дёшево: `grep '"canon"' */docs/.pm.json` по живым проектам. Дорого — обратное: проект, повышенный по тексту, которого больше не существует, невоспроизводим. Запись версии 3 восстановлена дословно (`Разработка` | `Tooling`), переименование уехало в версию 4. jellybit, стоящий на каноне 2, прочтёт обе записи подряд и заведёт `Разработка`, чтобы через шаг переименовать; в шаг версии 3 добавлена оговорка «едешь сразу на 4 — заводи `Готово` последней и не переставляй дважды». Лишний шаг — плата за честную историю, и она мала. **Р105. `Готово` переехало вниз, и порядок секций стал каноническим.** Достигнутое **копится**: через год этой секции больше, чем всех остальных вместе, — и стоя первой она отодвигает за экран ровно то, ради чего роадмап открывают чаще всего. Порядок теперь проверяется (`roadmap_lint`) и правится (`check --fix` переставляет секции вместе с содержимым): без проверки порядок разъедется молча, а переставлять секцию с десятком строк руками — работа, на которой ошибаются. **Р106. Индексы позиций считаются из самого кортежа.** `ACHIEVED` был `0` и стал `3`; хардкод индексов пережил бы перестановку молча и сломал бы `close`. Теперь `PLANNED, DIRECTIONS, OPERATIONS, ACHIEVED = range(len(ROADMAP_SECTIONS))` — переставили секцию, индексы переехали сами. ## Что из этого следует **С98. Отбивка нужна и перед заголовком.** Перестановка блоков ставит два заголовка вплотную — `spaced_sections` правил только строку после. Дефект нашёлся сразу же, на первой перестановке демо-набора: класс правки, существующий только потому, что появилась другая правка. **С99. `check --fix` переставляет, но не переименовывает.** Чужую секцию он оставляет ошибкой, и на переименовании `Разработка` → `Сопровождение` останавливается: имя — решение человека, порядок — механика. Тот же разрез, что между регистром (правит) и составом (не трогает). **С100. Версия канона отделяет состояния проектов, а не редакции текста** — и ровно поэтому её нельзя не поднять, когда состояние хоть одного проекта уже зафиксировано.