- DECISIONS.md (4040 строк, 65 тем) → decisions/, файл на тему плюс указатель; - буквенные метки решений заменены сквозными Р1–Р234, следствия получили префикс С при прежних номерах: схема букв выродилась до пятибуквенных и сломалась — `АЕАКЛ` была занята и темой 53, и темой 65; - 42 перекрёстные ссылки переписаны под новые номера и стали живыми; где номер означал тему, а слово стояло «решение», формулировка исправлена.
4.3 KiB
12. Механическая проверка копий (2026-08-03)
Что было
Разделение плагинов оставлено (тема 11), но цена
его названа: пять симметричных контрактов в двух домах, два уже разошлись —
форма журнала дефектов потеряла в копии поле «Причина», список читателей
docs/research/ потерял specs. Оба раза копия выглядела актуальной, и оба
раза расхождение прошло мимо трёх ревью подряд.
Решено
Р41. Копия допустима, но обязана быть дословной и помеченной. Разметка —
HTML-комментарии, невидимые в отрендеренном markdown: <!-- дом: <id> --> …
<!-- /дом: <id> --> и <!-- копия: <id> из <путь> --> … <!-- /копия: <id> -->. scripts/copies.py требует побайтового совпадения текста между маркерами.
Почему комментарии, а не манифест копий отдельным файлом: маркер уезжает в репозиторий проекта вместе со скелетом, и там он полезен — говорит читателю, что у текста есть дом и правится он там. Манифест остался бы в маркетплейсе и проекту ничего не сказал.
Р42. Идентификатор строгий — буквы, цифры, дефис — и повторяется в закрывающем
маркере. Иначе документация о самом механизме объявляет дом и роняет проверку:
это случилось на первом же прогоне, README.md объявил дом примером. Теперь
пример пишется <id>, угловые скобки под шаблон не подходят.
Р43. Ограда блока кода в сверку не входит. В доме текст обрамлён своей ```, а в скелете тот же текст лежит внутри чужой, объемлющей ограды. Сверяется содержимое, а не разметка вокруг него.
Р44. Коды выхода — общий словарь (0 сошлось, 1 расхождение, 2 разметка, 3 не тот каталог, 4 сбой). Третий скрипт репозитория, и третий по тем же кодам.
Что из этого следует
С50. Помечены два контракта: форма записи журнала дефектов (дом — конвейер ревью, копия — скелет канона; это кросс-плагинная пара) и «когда заводить ADR» (дом — канон, копия — его же скелет). Второй пришлось сперва сделать дословным: копия говорила «обязателен статус», дом — «обязателен статус „заменено на"», и это ровно тот класс, который и ищется.
С51. Чего проверка не ловит — копию, которую забыли пометить. Помечать
остаётся решением человека, и это названо в README.md вслух: иначе зелёный
прогон читался бы как «копий больше нет».
С52. Дом без копий — расхождение, а не замечание. Маркер, обещающий дисциплину, за которой не за чем следить, — такая же ложная запись, как разошедшаяся копия.
С53. Запись в журнал версий канона проверка не заменяет. Она видит, что копия отстала, но не видит, что проект уже унёс старую версию к себе. Это остаётся на человеке и сказано в обоих домах.