9.9 KiB
CODE-REVIEW — issue #601, заход r1
Материал: a551af9219083b2828cc2d840a22f5105d526bad (единственный коммит поверх dev=57572d8c).
Класс изменений: B (.github/workflows/**, scripts/**, test/**) + C (PROCESS.md, AGENTS.md, docs/TESTING.md) — ни одного файла класса A, маршрут «инфраструктура» подтверждён.
User-Visible: no, Issue: #601 — трейлеры на месте, changelog не требуется (изменение не задевает продукт).
Скоуп
Мутанты по диффу (changed_mutants в validate.yml) сужаются с пяти точек запроса (кандидат ревью, кандидат слияния, кандидат беты Release:, workflow_dispatch full=true, PR) до трёх: кандидат ревью, кандидат слияния, PR. Кандидат беты и full=true больше не тянут mutant-job — обоснование владельца: к бете задача уже прогнана мутантами дважды (ревью + слитый после ребейза кандидат), а ночь покрыта полным реестром mutation-gate.yml. Симметрично меняется политика release в ci-proof.mjs (mutants: false), иначе proof кандидата беты без запрошенных mutant-jobs объявлялся бы stale.
Вне docs/SCOPE.md — чисто инфраструктурное решение о структуре CI, продуктового поведения не касается.
Как проверялось
Материал уже на a551af92, git fetch/checkout не делал.
- Прочитан полный
git diff origin/dev...HEAD(10 файлов, +147/-45) — построчно, все хунки. - Прочитано тело issue #601 и комментарий-хендофф автора (SHA, таблица AC↔доказательство, перечень непрогнанного).
scripts/classify-changes.mjsиscripts/ci-proof.mjsпрочитаны целиком, не только дифф — проверена согласованность сигнатур и мест вызова.- Точечные прогоны (Validate на этом SHA уже зелёный по ссылке из инструкции —
npx tsc/npm test/npm run buildне перегонял):node --test --test-name-pattern="#510" test/classify-changes.test.mjs— pass;node --test --test-name-pattern="#601" test/classify-changes.test.mjs— pass;node --test test/ci-proof.test.mjs test/classify-changes.test.mjs— 38 pass, 0 fail;node --test test/release-gate.test.mjs test/merge-candidate.test.mjs test/validate-gate.test.mjs— 38 pass, 0 fail (эти три потребителяCI_PROOF_POLICIES/mutantsRequestedдиффом не тронуты —git diff --statпо ним пуст, подтверждено).
- Дисциплина «тест умеет падать» — прогнаны все четыре заявленных мутанта реальным
node scripts/mutation-gate.mjs --id=<id>, а не по слову автора:mutants-run-on-every-push→ поймано 1 из 1;mutants-run-on-beta-candidate→ поймано 1 из 1;mutants-run-on-full-dispatch→ поймано 1 из 1;release-proof-demands-mutant-jobs→ поймано 1 из 1.
- Сверены места вызова
mutantsRequested— единственный вызов вscripts/classify-changes.mjs:172(CLI), сигнатура ({eventName, mutantsInput}) согласована с телом функции; лишние поля (headMessage,fullInput), которые CLI по-прежнему передаёт, просто игнорируются деструктуризацией — не баг. - Проверено, что
validate.ymlне имеетon: schedule:— веткаscheduleвmutantsRequestedдействительно была мёртвой, её удаление безопасно (issue сам это утверждает, подтверждено чтением workflow). - Проверено, что явный
mutants=trueдёргают толькоscripts/merge-candidate.mjs:161иscripts/validate-gate.mjs:136(кандидат слияния и кандидат ревью) — оба файла вне диффа, поведение конвейера ревью/слияния не меняется. - Проверена документация:
PROCESS.mdправка лежит внутри §10.4 (заголовок на строке 930, правка на 962–971) — соответствует AC5;docs/TESTING.md,AGENTS.md, комментарийmutation-gate.yml— все называют #601 и новый список мест. git diff --statподтверждает 0 файловsrc/**—node scripts/check-docs.mjs(гейт свежести скриншотов документации) не требуется.
Находки
Нет. Ни High, ни Medium.
Что проверено и корректно
- AC1 (
mutantsRequested): все пять исходов из AC воспроизведены тестом и вручную прочитаны в коде —push+Release:→ false,workflow_dispatch full=true,mutants=false→ false,workflow_dispatch mutants=true→ true,pull_request→ true, обычный push → false. Мутантыmutants-run-on-every-pushиmutants-run-on-beta-candidateреально красят тест при отмене этого поведения (проверено исполнением, не чтением). - AC2 (
heavyGatesRequestedне изменился): дифф не касается этой функции; тестheavy=true\nmutants_requested=falseдляRelease:/full=trueпроходит. - AC3 (
evaluateCiProofс политикойrelease):mutants: falseне ослабляетreview/merge— единственное место чтения политики (ci-proof.mjs:294,if (policy?.mutants && !asBool(...))) прочитано и подтверждено; тест «#601 AC3» покрывает все три политики явно; мутантrelease-proof-demands-mutant-jobsкрасит тест при регрессии. - AC4 (
merge-candidate.mjs/validate-gate.mjsне тронуты): подтверждено пустымgit diff --statпо обоим файлам и их тестам; мутантmutants-run-on-full-dispatchперепроверяет смежную ветку. - AC5 (документы называют оба места и #601): подтверждено чтением всех четырёх файлов, включая номер параграфа PROCESS.md.
- Продуктовое рассуждение: решение сокращает дорогой, но малоинформативный к моменту беты гейт (тесты уже дважды промутированы к этой точке), не ослабляя требование для ревью и слияния — риск регрессии тестового покрытия к релизу не растёт, а критический путь короче. Согласуется с прежним решением по #513 («мутационный гейт проверяет не продукт, а тесты»).
Чего не проверял и почему
npx tsc --noEmit,npm test(полный),npm run buildсо сверкой бандла — не гонял: Validate на этом SHA уже зелёный (ссылка в инструкции ревью),src/**диффом не тронут.node scripts/check-docs.mjs— не требуется,src/**вне диффа.- Инварианты модели (
npm run invariants) — не требуются, геометрия/layout/толщины стен диффом не тронуты. - Браузерные смоки
demo/smoke_*.mjsиnpm run golden:verify— не требуются, диф не касается рендера/UI, продукт не меняется (User-Visible: no). python -m pytest tests_backend— не требуется,custom_components/**/*.pyне тронут.- Полный
node --testпо всемуtest/**— не перегонял отдельно от точечных файлов; Validate уже подтвердил зелёный прогон на этом SHA (2795 pass по хендоффу автора, независимо проверять весь набор избыточно при таком узком диффе).
Вердикт
Зелёный. Диф соответствует AC дословно, все мутанты, названные автором, реально ловятся (проверено исполнением), документация обновлена в том же коммите, класс изменений и трейлеры корректны, побочных потребителей не задето.
Материал раунда
- Ветка:
issue/601-mutants-only-on-request, коммитa551af921908— ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. - Дерево материала:
4152b94d017f32f74759407836389ccc380e58c5git log --all --format='%H %T' | grep 4152b94d017f - Тело issue:
e9249b2960498c7d67400304134713f5fea221329f558e1f1d433c753ce96a91 - Вердикт конвейера:
green· High 0