- DECISIONS.md (4040 строк, 65 тем) → decisions/, файл на тему плюс указатель; - буквенные метки решений заменены сквозными Р1–Р234, следствия получили префикс С при прежних номерах: схема букв выродилась до пятибуквенных и сломалась — `АЕАКЛ` была занята и темой 53, и темой 65; - 42 перекрёстные ссылки переписаны под новые номера и стали живыми; где номер означал тему, а слово стояло «решение», формулировка исправлена.
61 lines
5.7 KiB
Markdown
61 lines
5.7 KiB
Markdown
# 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. Отказ читать документ — тоже граница покрытия, и её пишет сток.** Строку
|
||
«этого не смотрел никто» некому подать снизу: проход, которого нет, отчёта не
|
||
присылает.
|