# Контракт находок Единый формат для всех проходов конвейера ревью. Проход, нарушивший контракт, считается сломанным — триаж вправе выбросить его вывод целиком. ## Форма находки ``` ### <краткая формулировка ПОСЛЕДСТВИЯ, не симптома> - Файл: internal/<пакет>/<файл>.go:120-134 - Severity: critical | major | minor | nit - Confidence: high | medium | low - Оракул: <падающий тест / команда с выводом / положение гайда / нет> - Последствие: <что произойдёт и при каких условиях> - Предложение: <конкретное изменение> - Найдено проходом: <имя агента> ``` ## Правила - **Заголовок через последствие.** Не «нет проверки токена», а «читатель без токена выгрузит всю историю». Не «слияние перезаписывает запись», а «повторная доставка сотрёт поля у уже сохранённой записи, и восстановить их нечем». Симптом в заголовке — это заявка на то, что читатель сам достроит последствие; он не достроит, он просто починит симптом. - **`critical` без оракула или построенного пути не существует.** Оракул — это падающий тест, вывод выполненной команды или поимённое положение гайда. Не «вероятно, здесь гонка», а прогон детектора гонок с его выводом. - **`confidence: low` — это «так обычно пишут».** Такие находки допустимы, но не поднимаются выше `minor`. Частотность конструкции в публичном коде — не аргумент. - **Находка без поля «Последствие» не выводится вовсе.** Пустое «Последствие: ухудшает читаемость» равносильно отсутствию поля. - **`nit` допустим только при нарушении записанной конвенции** — со ссылкой на файл и раздел конвенций проекта (путь — из раздела `## Карта` брифа) либо на правило линтера. Если правило механизируемо, но не механизировано — это не находка ревью, это `Promote candidate` (см. [promote.md](promote.md)). - **`critical` по основанию «нарушен инвариант проекта» требует брифа.** Ссылка идёт на пункт раздела `## Инварианты` дословно. Без брифа такое основание недоступно — см. [project-brief.md](project-brief.md), деградированный режим. - **Расхождение — не дефект, пока не названо последствие.** Особенно для прохода независимой реализации: «я бы сделал иначе» без последствия не выводится. ## Шкала severity | Severity | Что это | Пример | |---|---|---| | `critical` | нарушение инварианта проекта, потеря или порча данных, утечка секрета, построенный путь к отказу | запись потеряна при слиянии; тело пользовательской выгрузки в поле лога | | `major` | сломанное требование дельта-спеки, необрабатываемый отказ штатного сценария, флаки-тест, поведение вне спеки, меняющее исход | приём отвечает 200, не записав тело: доставка считается принятой, а данных нет | | `minor` | отступление от конвенции с реальной ценой, отсутствующая наблюдаемость, дублирование, которое разойдётся | ни одного чекпоинта на пути разбора: молчащая автоматизация неотличима от пустого потока | | `nit` | нарушение записанной конвенции без последствий за пределами чтения | `msg` с интерполяцией вместо константы | Шкала привязана к обратимости, а не к громкости: класс «необратимо и молча» всегда весит больше класса «шумно и лечится повтором». Что здесь необратимо, говорит раздел `## Прод и поток` брифа. ## Блок границ покрытия Каждый проход завершает вывод этим блоком. Он не сокращается и не заменяется фразой «всё проверено». ``` ## Coverage of this pass - проверено: <что реально прочитано/запущено, с путями и командами> - не проверялось и почему: <бюджет, недоступный инструмент, вне входа> - принципиально недоступно этому проходу: <из charter'а агента> ``` ## Финальный отчёт триажа Секции строго в этом порядке, потолок — 7 пунктов в первых двух: 1. `Блокирует мердж` (≤3, каждая с оракулом); 2. `Стоит исправить сейчас` (≤4); 3. `Гипотезы без доказательства` — что понижено и почему; 4. `Promote candidates` — кандидаты в конвенцию или правило линтера; 5. `Границы покрытия` — сводная, обязательная. Перед секциями — сводка для человека: профиль и режим прогона, состояние гейта, **перечень запущенных проходов поимённо с исходом каждого**, сколько находок пришло на вход и сколько осталось. Перечень обязателен: пропуск прохода не отличим от прохода без находок, и назвать его больше некому. Каждая находка в секциях 1–2 несёт дополнительное поле: ``` - Действие: инлайн | развилка ``` `инлайн` — оркестратор чинит сам, не спрашивая и не логируя. `развилка` — цена исправления сопоставима с переработкой, либо выбор меняет scope, либо решение трогает инвариант: уезжает вопросом с вариантами и ценой каждого туда, где проект держит вопросы, а работа продолжается на остатке. Потребитель отчёта — оркестратор, который **реализует прочитанное**. Поэтому потолок в 7 пунктов — не забота о внимании читателя, а защита кодовой базы от правок, которых никто не заказывал.