Files
dev-skills/decisions/40-three-doc-categories.md
T
av bf6a173115 журнал решений: разложен по теме на файл, метки решений стали номерами
- DECISIONS.md (4040 строк, 65 тем) → decisions/, файл на тему плюс указатель;
- буквенные метки решений заменены сквозными Р1–Р234, следствия получили
  префикс С при прежних номерах: схема букв выродилась до пятибуквенных и
  сломалась — `АЕАКЛ` была занята и темой 53, и темой 65;
- 42 перекрёстные ссылки переписаны под новые номера и стали живыми; где номер
  означал тему, а слово стояло «решение», формулировка исправлена.
2026-08-13 12:40:56 +03:00

5.7 KiB
Raw Blame History

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. Отказ читать документ — тоже граница покрытия, и её пишет сток. Строку «этого не смотрел никто» некому подать снизу: проход, которого нет, отчёта не присылает.