Files
houseplan-card/docs/process/REVIEWER.md
T
Claude e1ae8f4ac7 process: the review pipeline prices each round by track (#696)
show/ship stop paying for diff mutants and for every move of dev:

- scripts/process-track.mjs resolves the track from the current labels and
  the diff (show for unlabelled infra, ask for unlabelled product work) and
  checks the mechanical ship limits; outside them the pipeline comments and
  relabels track:ship -> track:show in the same round.
- Validate on the review material is light on show/ship: a completed push
  run on the exact SHA is proof, a dispatch asks mutants=false. ask and the
  ci:mutants label keep the mutant dispatch.
- show/ship skip the pre-review rebase when git merge-tree with dev is
  clean; the candidate is rebased once at merge and still passes Validate
  before the push to dev. The light merge waits for the push run of the
  candidate and dispatches only when none appears.
- ship inside the limits merges after the light Validate without a model
  review; the issue gets a machine marker hp:ship-merge.
- ship-review.yml + scripts/ship-review.mjs read the code of all ship
  tasks of a beta range in one model session and publish
  docs/reviews/SHIP-REVIEW-<tag>.md; both beta publication paths refuse a
  range with ship tasks the document does not cover or that carries a High.
- show reviews judge correctness and AC; the spec review installs neither
  npm ci nor Chromium, the show review installs Chromium only when the issue
  names a smoke.

Canon: PROCESS.md §5, §5.1, §10.4, new §11.7; REVIEWER.md, AUTHOR.md and
AGENTS.md digests.

Issue: #696
User-Visible: no
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018qZfe7YS4rqEMKoVeS3GKd
2026-09-28 23:09:46 +03:00

15 KiB

Конспект для ревьюера

Роли: ревьюер ТЗ и ревьюер кода (§6). Штатный ревьюер конвейера получает этот файл из промпта .github/workflows/_process.yml; ручное ревью по просьбе владельца идёт по нему же.

Это выжимка, а не канон. Канон процесса — PROCESS.md; при расхождении побеждает он, а расхождение — issue с меткой process. Конспект правил не добавляет и не меняет: каждый пункт ссылается на раздел канона, где правило записано полностью, с причинами и прецедентами. Ссылки и ключевые формулировки сверяет test/process-digests.test.mjs.

Позиция ревьюера

  • Ревьюер ≠ исполнитель, свежая сессия без контекста реализации. Задача — не согласиться, а найти, где ТЗ не выполнимо или не проверяемо, где код не делает заявленного (§2.4, §2.7, §6).
  • Ревьюер не правит ни ТЗ, ни продуктовый код; ревью своей работы запрещено (§6, §12).
  • Первый вопрос к задаче — какую работу из docs/SCOPE.md она обслуживает; для видимого поведения терминология берётся из docs/USER-GUIDE.ru.md (§7.1).

Ревью ТЗ

  • Артефакт — docs/reviews/SPEC-REVIEW-<NN>-r<N>.md. Ревью ТЗ проходит только трек ask (§2.4).
  • ТЗ живёт в теле issue, раздел ## ТЗ; docs/specs/ — архив до 2026-09-10 (§2.3).
  • Проверить обязательные разделы, однозначность каждого AC и способ его доказательства; догадка, записанная как факт, — находка (§7.1, §2.5).
  • Владельцу задаются только продуктовые вопросы; технический вопрос, вынесенный владельцу, ревьюер снимает и решает по существу. Технический спор автора и ревьюера решается вердиктом, а не владельцем (§7.1).

Код-ревью

  • Артефакт — docs/reviews/CODE-REVIEW-<tag|NN>-r<N>.md: скоуп, как проверялось (таблица гейтов с результатами), находки High/Medium/Low с воспроизведением, что проверено и корректно, чего не проверял (§2.7).
  • Ревьюер отвечает за полноту доказательств AC, а не заменяет их исполнение. Каждый AC либо доказан автотестом, и ревьюер убедился, что тест умеет падать, либо разобран с записью «проверено чтением, не исполнением». Применимые классы риска §2.6 сверяются отдельно (§2.7, §2.6).
  • Защитный AC доказывается таблицей «чем краснеет»: AC · чем доказан · чем краснеет — мутация, снятая защита или отрицательная проба с результатом прогона. Пустой третий столбец — находка Medium, а не примечание. «Тест умеет падать» без названной мутации и её вывода доказательством не является (§2.7).
  • Вердикт привязан к SHA (#312): числа и факты сверяются с git rev-parse HEAD перед итогом; более новый коммит, которого нет в материале, — находка, а не повод его подтянуть (§2.7, §10.4).
  • Контракты по монолиту — исполнением, не regex по тексту: список тестов, читающих монолит как текст, заморожен, и новое имя в нём — находка ревью, а не запись в список (§2.7).
  • Трейлеры Issue: #NN и User-Visible: yes|no на каждом коммите класса A и B; при yes — оба changelog в том же коммите (§3 п.10).
  • Одно число — один источник: ревьюер отвечает на вопрос прямо: какое число в этом диффе видно дважды и один ли у него источник (§8).

Объём гейтов

  • Всегда: typecheck, npm test, npm run build + bundle-policy --verify (копии сверяются только на кандидате, #657); при диффе по src/** — ещё node scripts/check-docs.mjs. Зелёный Validate на SHA материала подтверждает дешёвые гейты (§8).
  • По диффу и AC: смоки — названные в AC плюс вывод node scripts/smoke-select.mjs --base <base> --head <head> с решением по каждой строке; golden:verify при видимом изменении; pytest tests_backend при правке Python; инварианты модели при правке геометрии; performance — если назван в AC. Полные наборы — предрелизный гейт, а не гейт ревью (§8).
  • Условие честности сужения: ревьюер обязан перечислить, какие гейты прогнал, какие нет и почему (§8).
  • Зелёный pytest tests_backend без Home Assistant скипает test_ha_*.py и ничего не доказывает — это «чего не проверял» (docs/TESTING.md; §8).

Повторный раунд

  • Предмет повторного раунда — дельта, а не задача целиком: найти вердикт и материал предыдущего раунда (блок «Материал раунда»), объявить git diff <тот SHA>..HEAD, по каждой находке показать, чем она закрыта, заново проверить только AC, которые дельта задевает (§2.10).
  • Если SHA не резолвится — это не находка, а обычное дело: материал ищется по дереву и блобу. Находка — SHA, мёртвый уже в момент публикации отчёта (§2.10).
  • Обязателен раздел «Унаследовано из r<N−1>»: что принято без повторной проверки, с документом и материалом того раунда (§2.10).
  • Разбор остаётся полным, если дельта не локальна: ребейз на ушедший вперёд dev, смена контракта, новая подсистема, объём сопоставим с задачей. Сокращается объём разбора, а не строгость (§2.10).
  • Перед разбором подсистемы — её строки в docs/reviews/INDEX.md (§2.10).

Находки и вердикт

  • High блокирует. Medium в скоупе чинится в текущем issue: без High это жёлтый вердикт и повторный цикл. Medium вне скоупа — отдельный issue со ссылкой. Low правится или снимается ревьюером с записью (§3 п.8, §2.7).
  • Жёлтый вердикт допустим и при выполненных AC, если изменение не решает заявленный сценарий или ухудшает смежный; продуктовое рассуждение не отменяет AC и не меняет скоуп (§2.7).
  • Строка вердикта, первой строкой комментария: Вердикт: зелёный/жёлтый/красный · заход r<N> · блокирующих циклов K/<лимит> · High: N · Medium: N → в задаче | #… · Документ: docs/reviews/… («→ #…» — только у Medium вне скоупа) (§7.2).
  • Вперёд двигает только зелёный вердикт; жёлтый и красный возвращают автору (§7.2).
  • Зелёный вердикт цикла не образует; лимит — 4 цикла, на track:show 2; бюджет считается по этапу (§4, §10.4).
  • Запрещено: Medium-находки, оставленные как TODO в документе ревью; ревью-документы вне репозитория (§12).

Трек show

  • Ревью show судит корректность и AC: Medium — дефект поведения, который увидит пользователь, или невыполненный AC; бухгалтерия — нет мутанта или записи в реестре, нечувствительный тест на побочный вызов — Low и цикла не открывает (§10.4, §5).
  • Мутанты по диффу на show не запрашиваются; их отсутствие не находка (§10.4).
  • Ветка show с чистым слиянием к dev до ревью не приводится: материал — ветка как есть, кандидат проверит Validate при слиянии (§10.4).

Пакетное ревью ship

  • Задачи track:ship слиты без ревью модели; перед бетой ship-review.yml читает их код одной сессией: по строке ТЗ каждой задачи и её коммитам (§11.7).
  • Вопросы к задаче: делает ли код заявленное и только его, не ломает ли соседнее, не вышла ли правка из ship по смыслу (§11.7, §5).
  • Документ docs/reviews/SHIP-REVIEW-<тег>.md публикует детерминированный шаг; High не пускает бету, Medium и Low решает владелец (§11.7).

Независимое ревью линии

  • Перед стабильным релизом release-review.yml судит поверхности всей линии бет против пользователя, а не дифф против ТЗ: ТЗ задач и документы раундов не читаются, основа — docs/SCOPE.md и docs/USER-GUIDE.ru.md (§11.5).
  • Проверка исполнением: посимвольный ввод, настоящие Escape и крестик, фикстура ha-dialog (#505) для диалогов; по каждой поверхности — обычный сценарий и самый рискованный соседний (§2.6, §11.5).
  • Документ docs/reviews/RELEASE-REVIEW-vX.Y.Z.md — рекомендация: выпуск не блокируется, решение по находкам за владельцем; ревьюер ничего не публикует и issue не заводит (§11.5).