- DECISIONS.md (4040 строк, 65 тем) → decisions/, файл на тему плюс указатель; - буквенные метки решений заменены сквозными Р1–Р234, следствия получили префикс С при прежних номерах: схема букв выродилась до пятибуквенных и сломалась — `АЕАКЛ` была занята и темой 53, и темой 65; - 42 перекрёстные ссылки переписаны под новые номера и стали живыми; где номер означал тему, а слово стояло «решение», формулировка исправлена.
54 lines
4.3 KiB
Markdown
54 lines
4.3 KiB
Markdown
# 12. Механическая проверка копий (2026-08-03)
|
|
|
|
## Что было
|
|
|
|
Разделение плагинов оставлено ([тема 11](11-plugin-dependencies.md)), но цена
|
|
его названа: пять симметричных контрактов в двух домах, два уже разошлись —
|
|
форма журнала дефектов потеряла в копии поле «Причина», список читателей
|
|
`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. Запись в журнал версий канона проверка не заменяет.** Она видит, что
|
|
копия отстала, но не видит, что проект уже унёс старую версию к себе. Это
|
|
остаётся на человеке и сказано в обоих домах.
|