верхняя ступень ревью задана тестом, а не списком

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

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

Три слова остались как три места, где такие правила водятся — граница, где
данные входят или встречаются: состав ключа и нормализация перед сравнением;
победитель конфликта и тай-брейк при равенстве; границы токенов и неоднозначный
вход. Проект перечисляет свои места в docs/review.md, и перечень производен от
теста, а не заменяет его.

Две оговорки, без которых правило вырождается:
- триггер — новое или изменённое по существу правило, а не код рядом с ним;
  иначе проект, чей домен и состоит из таких правил, всегда в deep;
- проект, где такого класса нет вовсе, deep не запускает никогда, и это
  законное состояние, а не недонастройка.

review-reimpl получил тот же тест и право сказать первой строкой, что позвали
не на его класс, — строкой в границы покрытия, а не отказом работать.
DECISIONS 18, XXX и следствия 76–77.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-08-04 17:12:40 +03:00
co-authored by Claude Opus 5
parent cc173b6b94
commit 5bf599a767
5 changed files with 137 additions and 19 deletions
+25
View File
@@ -1310,6 +1310,22 @@ SSS: рубрика на узел без нового понятия порож
ступени, делает ревью **дороже**: тот же объём тем же составом, но костяк оплачен
дважды. Резать — когда разрез снимает дорогой проход с большей части диффа.
**XXX. Верхняя ступень задана тестом, а не списком.** «Идентичность, слияние,
разбор» — формулировка, пришедшая из одного проекта, и в общем виде она не
читалась: вопрос «как это применить к моему проекту» не имел ответа в тексте.
Теперь класс задан тремя условиями, независимыми от домена и языка: вариантов
несколько и оба защитимы; спека между ними не выбирает; неверный выбор не падает,
а молча меняет смысл данных. Отрицательный тест сильнее положительных — то, что
красит гейт или роняет запрос, в класс не входит. Три слова остались как **три
места**, где такие правила водятся (граница входа данных и место их встречи), а
проект перечисляет свои места в `docs/review.md` — перечень производен от теста и
не расширяет класс.
Оговорка, без которой правило вырождается: триггер — **новое или изменённое по
существу правило**, а не код рядом с ним. Проект, чей домен и состоит из таких
правил, иначе оказывался бы в `deep` всегда — та же болезнь, от которой лечилась
ступень `wide`.
### Что из этого следует
72. **Порога в числе границ не заводится.** Тот же принцип, что в теме 16 (CCC):
@@ -1323,3 +1339,12 @@ SSS: рубрика на узел без нового понятия порож
75. **Замер остаётся за обкаткой.** Правило выведено из состава проходов, а не из
статистики прогонов: считать, какая доля задач попадает в каждую ступень,
можно только на спринтах нового процесса (TODO шаг 4).
76. **Отсутствие верхней ступени — законное состояние проекта.** Бывают проекты,
где данные приходят нормализованными, ничего ни с чем не сливается, а внешних
форматов нет: `deep` там не срабатывает никогда, и придумывать ему повод не
надо. Раньше это читалось как недонастройка.
77. **Ступень определяет класс правила, а не вид работы.** Миграция схемы —
`standard`, но миграция, переносящая данные по правилу («сложить дубли»,
«привести к одному виду перед сравнением»), несёт правило идентичности и
потому `deep`. Одно слово в описании задачи попадает в разные ступени — это не
противоречие, смотрят не на слово.