проверка копий правил: маркеры дома и копии, побайтовая сверка

Разделение плагинов оставлено, цена названа: пять симметричных контрактов в двух
домах, два уже разошлись — форма журнала дефектов потеряла в копии поле
«Причина», список читателей docs/research/ потерял specs. Оба раза копия
выглядела актуальной и прошла мимо трёх ревью.

scripts/copies.py требует побайтового совпадения текста между маркерами.
Комментарии, а не манифест копий: маркер уезжает в репозиторий проекта вместе со
скелетом и там полезен — говорит, что у текста есть дом.

Идентификатор строгий и повторяется в закрывающем маркере. Иначе документация о
самом механизме объявляет дом и роняет проверку: это случилось на первом же
прогоне, README объявил дом примером.

Ограда блока кода в сверку не входит: в доме текст обрамлён своей оградой, в
скелете лежит внутри чужой, объемлющей.

Помечены два контракта. Второй пришлось сперва сделать дословным: копия говорила
«обязателен статус», дом — «обязателен статус „заменено на“».

Проверка не ловит копию, которую забыли пометить, — это сказано вслух, иначе
зелёный прогон читался бы как «копий больше нет». И не заменяет запись в журнал
версий канона: она видит, что копия отстала, но не что проект унёс старую версию.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-08-03 16:23:03 +03:00
co-authored by Claude Opus 5
parent 5dcf40d8af
commit 885981ca39
8 changed files with 320 additions and 4 deletions
+50
View File
@@ -860,3 +860,53 @@ pyrefly: в окружении нет ничего, кроме линтеров,
ни `plugin.json` не говорили, что `av-dev-pm` для конвейера **опционален**, а
задача принимается текстом. Теперь говорят — это первое, что читает человек,
выбирая, что подключать.
## 12. Механическая проверка копий (2026-08-03)
### Что было
Разделение плагинов оставлено (тема 11), но цена его названа: пять симметричных
контрактов в двух домах, два уже разошлись — форма журнала дефектов потеряла в
копии поле «Причина», список читателей `docs/research/` потерял `specs`. Оба раза
копия выглядела актуальной, и оба раза расхождение прошло мимо трёх ревью подряд.
### Решено
**OO. Копия допустима, но обязана быть дословной и помеченной.** Разметка —
HTML-комментарии, невидимые в отрендеренном markdown: `<!-- дом: <id> -->`
`<!-- /дом: <id> -->` и `<!-- копия: <id> из <путь> -->``<!-- /копия: <id> -->`.
`scripts/copies.py` требует побайтового совпадения текста между маркерами.
*Почему комментарии, а не манифест копий отдельным файлом:* маркер уезжает в
репозиторий проекта вместе со скелетом, и там он **полезен** — говорит читателю,
что у текста есть дом и правится он там. Манифест остался бы в маркетплейсе и
проекту ничего не сказал.
**PP. Идентификатор строгий — буквы, цифры, дефис — и повторяется в закрывающем
маркере.** Иначе документация о самом механизме объявляет дом и роняет проверку:
это случилось на первом же прогоне, `README.md` объявил дом примером. Теперь
пример пишется `<id>`, угловые скобки под шаблон не подходят.
**QQ. Ограда блока кода в сверку не входит.** В доме текст обрамлён своей ```,
а в скелете тот же текст лежит внутри чужой, объемлющей ограды. Сверяется
содержимое, а не разметка вокруг него.
**RR. Коды выхода — общий словарь** (0 сошлось, 1 расхождение, 2 разметка,
3 не тот каталог, 4 сбой). Третий скрипт репозитория, и третий по тем же кодам.
### Что из этого следует
50. **Помечены два контракта:** форма записи журнала дефектов (дом — конвейер
ревью, копия — скелет канона; это кросс-плагинная пара) и «когда заводить
ADR» (дом — канон, копия — его же скелет). Второй пришлось сперва **сделать**
дословным: копия говорила «обязателен статус», дом — «обязателен статус
„заменено на"», и это ровно тот класс, который и ищется.
51. **Чего проверка не ловит — копию, которую забыли пометить.** Помечать
остаётся решением человека, и это названо в `README.md` вслух: иначе зелёный
прогон читался бы как «копий больше нет».
52. **Дом без копий — расхождение, а не замечание.** Маркер, обещающий
дисциплину, за которой не за чем следить, — такая же ложная запись, как
разошедшаяся копия.
53. **Запись в журнал версий канона проверка не заменяет.** Она видит, что копия
отстала, но не видит, что проект уже унёс старую версию к себе. Это остаётся
на человеке и сказано в обоих домах.