- DECISIONS.md (4040 строк, 65 тем) → decisions/, файл на тему плюс указатель; - буквенные метки решений заменены сквозными Р1–Р234, следствия получили префикс С при прежних номерах: схема букв выродилась до пятибуквенных и сломалась — `АЕАКЛ` была занята и темой 53, и темой 65; - 42 перекрёстные ссылки переписаны под новые номера и стали живыми; где номер означал тему, а слово стояло «решение», формулировка исправлена.
5.7 KiB
40. Три категории документов: не всякий документ — тема ревью (2026-08-07)
Решение 36 объявило: каждый документ проекта — тема ревью. Правило дало
открытый список тем и сделало docs/ конфигурацией конвейера — это работает и
остаётся. Но оно же оказалось неверным ровно наполовину, и потому вредным
целиком.
Паспорт и схему хранилища ревью читает, но темами они не являются: по ним нельзя сказать «в этом изменении сделано не так», они задают границу, по которой судит чужая тема. Журнал решений и журнал наблюдений ревью изменения не нужны вовсе: ADR объясняет прошлое решение, а не предъявляет требование к изменению.
Ломалось это механически. Разметчик, применявший правило буквально, обязан был
либо завести фантомные темы passport, adr, database, research и
продублировать ими работу тем architecture и operations, либо потерять четыре
документа молча. Обе ветки случались; в собственном образце плана разметчика
docs/passport.md не попадал ни строкой, а его же обязательная арифметика
покрытия («документов найдено N, все N разнесены») при этом не сходилась.
Р162. Разрез один и проверяемый: можно ли по документу сказать «в этом
изменении сделано не так». Отсюда три категории. Тема — да, прямо
(conventions, security, architecture, свои документы проекта). Источник
темы — нет, но он задаёт границу для чужой темы (passport, database,
CLAUDE.md, openspec/specs/). Процессный документ — нет, он про то, как
мы работаем (tasks/, review.*, adr.*, research.*, .pm.json).
Р163. Открыта одна категория из трёх. источник и процессный перечислены
поимённо и проектом не пополняются; открыта только тема. Прежняя формулировка
«не темы ровно две» противоречила собственной раскладке канона — .pm.json был
третьим, и правило-исправление жило в чужом плагине, в коде docs.py. Теперь
документ, которого нет в раскладке, — однозначно своя тема проекта, и решать
нечего.
Р164. «Не судит по нему» и «не открывает» — разные вещи. docs/review.*
проходы читают на каждом прогоне: там вопросы по темам, журнал дефектов, типовые
узлы, типовые ложноположительные. Это чтение конвейером своей обвязки, а не
критерия. adr/, research/ и tasks/ не открывает никто.
Р165. Цена решения записана, а не подразумевается. Расхождение изменения с записанным решением прогоном больше не ловится — это работа сверки документации между спринтами. Измеренные числа проекта из ревью тоже ушли: проход, опирающийся на число, обязан снять его сам, на этом прогоне, и приложить команду замера. Обе потери идут обязательными строками в границы покрытия каждого прогона, и пишет их триаж — не проход, потому что проход о том, чего в конвейере нет, пожаловаться не может.
Что из этого следует
С148. Плоское правило, верное наполовину, хуже двух правил. Оно не даёт половине случаев легального ответа, и исполнитель выбирает между двумя плохими ветками — фантомной сущностью и молчащей потерей. Заметно это становится не на определении, а на первом же образце вывода.
С149. Открытым делается одно множество, а не все. Открытый список ценен тем, что в него попадает незнакомое; если открыты все категории, незнакомое попадает в произвольную.
С150. Отказ читать документ — тоже граница покрытия, и её пишет сток. Строку «этого не смотрел никто» некому подать снизу: проход, которого нет, отчёта не присылает.