13 KiB
CODE-REVIEW-709-r2
Материал раунда: git log --oneline origin/dev..HEAD = три коммита поверх
dev@18c9f8e7:
09d35c8d docs(testing): the manual pre-push run lists no mutants (#709 r1)
920e6269 docs: review document for #709
a8321e32 process: mutants run only in the nightly full registry; speed rules for ship/show (#709)
Заход r2, трек show, блокирующих циклов израсходовано 1 из 2 (r1 —
жёлтый, Medium в скоупе, цикл не открывал по счётчику до r1, но возвратил
автору; см. заголовок задачи «блокирующих циклов израсходовано 1 из 2» —
использую как есть).
Скоуп
Дельта этого раунда — ровно один коммит 09d35c8d (докстрока
docs(testing): the manual pre-push run lists no mutants (#709 r1)), диффом
трогающий только docs/TESTING.md (13 строк) плюс публикацию документа
предыдущего раунда docs/reviews/CODE-REVIEW-709-r1.md коммитом 920e6269
(шаг конвейера, не автор). Класс C (документация) — трейлеры не обязательны
(§3 п.10), но коммит их всё равно несёт (Issue: #709, User-Visible: no) —
корректно, поведение продукта не меняется.
Единственная цель дельты — закрыть Medium из r1: docs/TESTING.md
противоречил сам себе в разделе «Локальный набор перед пушем» (одна строка
говорила «мутантов в ручном pre-push-gate нет», а пример команд и абзац «Что
прогоняется» двумя абзацами ниже всё ещё описывали --no-mutants/
--max-mutants и мутанты по диффу как часть прогона).
Как проверялось
Разбор по дельте (§2.10) — предмет один Medium, дельта локальна (13 строк в
одном файле, тот же файл и тот же раздел, который правил r1), новых AC не
добавлено, контракт не менялся, ребейза на ушедший вперёд dev не было
(dev тот же 18c9f8e7, что и в r1). Полный повторный разбор AC1–AC3 не
требуется: они уже доказаны в r1 и эта дельта их не задевает.
Закрытие раунда r1
| Находка | Чем закрыта | Где это видно |
|---|---|---|
Medium: docs/TESTING.md противоречит себе — заявляет «мутантов в ручном режиме нет» и тут же показывает --no-mutants --max-mutants=1 в примерах, а «Что прогоняется» называет мутанты по диффу частью ручного набора |
Коммит 09d35c8d: примеры команд (было docs/TESTING.md:276–277) больше не содержат --no-mutants/--max-mutants; абзац «Что прогоняется» (было :280–282) больше не упоминает мутанты, вместо этого одним предложением поясняет, что оба флага приняты для совместимости и ничего не меняют |
git diff a8321e32..09d35c8d -- docs/TESTING.md, строки 273–286 (сейчас); проверено дополнительно кодом: scripts/pre-push-gate.mjs:193-199 — парсер флагов flag()/intArg() работает через argv.includes(...), неизвестные/устаревшие флаги молча игнорируются, ошибки не бросает — заявление «ничего не меняют» не расходится с реализацией |
Проверено и то, что автор не тронул вслепую: заново прочитан весь файл
docs/TESTING.md (не только изменённые строки) на предмет других мест,
где могло остаться расхождение — их нет. Формулировка на строках 67–68
(«Для разбора ночного сбоя (не гейт задачи, #709) —
mutation-gate.mjs --changed») согласована с формулировкой на строках
114–119 («--id и --changed остаются инструментами разбора ночного сбоя,
а не гейтом задачи») — та часть файла, которую r1 не касался, уже была
написана в этом ключе и осталась без противоречий.
Гейты — что прогнано и что нет
| Гейт | Прогнан | Результат |
|---|---|---|
Validate на 09d35c8d (workflow_dispatch, run 36625652363) |
зелёный прогон уже есть на этом SHA, не переисполнял (§8, #343) | success, 2 мин 53 с |
node --test test/process-digests.test.mjs |
да | 5/5 зелёные |
node scripts/mutation-gate.mjs --check |
да | 0 FAIL, 3 предсуществующих WARN (#650, вне скоупа — не задеты диффом) |
Чтение всего docs/TESTING.md и кода scripts/pre-push-gate.mjs (парсинг флагов) |
да | расхождений не найдено; поведение флагов соответствует новому тексту |
npx tsc --noEmit, полный npm test, npm run build + сверка бандла |
нет | дифф раунда — только docs/TESTING.md, класс C; зелёный Validate на этом SHA уже подтверждает (#343); класс A/B файлов в дельте r1→r2 нет |
Смоки/golden/pytest tests_backend/инварианты модели/performance/smoke-select.mjs |
нет | дельта не содержит src/**, Python, demo/golden/** или геометрии — неприменимо по диффу и по AC; тело issue не называет смоук |
actionlint, process-gate --range |
нет | дельта — документация, не workflow/скрипты; неприменимо |
Находки
Нет. Medium из r1 закрыт точным патчем той же строки, которую он называл; других расхождений в перечитанном файле не найдено. High не заводился ни в r1, ни здесь.
Что проверено и корректно
- AC1–AC3 остаются доказанными выводами r1 (см. раздел «Унаследовано» ниже) — дельта их не касается.
docs/TESTING.md, раздел «Локальный набор перед пушем»: текст теперь внутренне непротиворечив — «мутантов нет» (строка ~267), пример команд без--no-mutants/--max-mutants(~276–277), «Что прогоняется» без мутантов и с явным пояснением про no-op флаги (~280–283).- Попутная правка той же задачи (не требовалась Medium из r1, но в тему):
строки 67–68 сменили формулировку с «Локально для дельты задачи —
mutation-gate --changed» на «Для разбора ночного сбоя (не гейт задачи, #709) — …» — устраняет ещё одно потенциальное место, где читатель мог принять--changedза обязательный локальный гейт. Корректно и не выходит за рамки AC2 (тот же файл, та же тема — согласованность канона). - Код
scripts/pre-push-gate.mjsне менялся в этой дельте (сравнениеgit diff a8321e32..HEAD -- scripts/pre-push-gate.mjs— пусто), значит поведение, которое описывает новый текст, — то самое поведение, которое проверил r1 (секция мутантов убрана изmanualGate, флаги не влияют ни на что). Документация просто наконец описывает код верно. - Трейлеры коммита
09d35c8d:Issue: #709,User-Visible: no— верно, документ не меняет наблюдаемое поведение продукта, changelog не тронут и не должен быть тронут. - Ни одного числа/значения, видимого пользователю, дельта не вводит — это README/тестовая документация процесса, не UI и не API.
Чего не проверял
- Полный
npx tsc --noEmit,npm test,npm run build+ троекратную сверку бандла — дельта раунда не содержит класса A/B, зелёный Validate на этом же SHA (09d35c8d, run 36625652363) уже подтверждён (#343). actionlint,process-gate --range— дельта не workflow/скрипты, неприменимо.- Смоки, golden,
pytest tests_backend, инварианты модели, performance — неприменимо: диффа вsrc/**, Python,demo/golden/**и геометрии нет ни в этом раунде, ни накопительно с r1. - Не перепроверял то, что уже доказано в r1 полным разбором (AC1, AC3 полностью; AC2 — вся часть, кроме закрытого Medium) — см. раздел «Унаследовано» и сам документ r1.
Унаследовано из r1
Документ: docs/reviews/CODE-REVIEW-709-r1.md, материал —
a8321e32cc8299a521657b71aba6c43f41d93e6b (дерево f1cb9e76e348…).
Принято без повторной проверки в этом раунде:
- AC1 — доказан юнитами
process-track/classify-changes(39/39), подтверждён мутантами реестра (dev-mutants-requested-again,track-pays-for-mutants-again), статически сверенmutation-gate --check(0 FAIL). Дельта r1→r2 файлов AC1 (scripts/process-track.mjs,scripts/classify-changes.mjs,.github/workflows/*) не касается — подтвержденоgit diff a8321e32..HEAD --stat(толькоdocs/TESTING.mdи сам документ ревью r1). - AC2 (кроме закрытого Medium) — согласованность
PROCESS.md,docs/process/AUTHOR.md,docs/process/REVIEWER.md,AGENTS.mdмежду собой; снятиеci:mutantsиз таблиц меток — не перечитывал заново, эти файлы в дельте r1→r2 не менялись (git diff --statвыше это подтверждает списком затронутых путей). - AC3 — правила скорости
ship/showвPROCESS.md§8, флаг--smokes(scripts/gate-small.mjs:34) реальный — не перечитывал заново, файлы не менялись в этой дельте. - Наблюдение r1 «метка
ci:mutantsне удалена из GitHub, оставленаRetired, решение за владельцем — соответствует AC2» остаётся в силе, вне репозитория ничего не изменилось.
Вердикт
Единственная находка предыдущего раунда закрыта точно тем патчем, который она требовала; новых находок в дельте нет. AC1–AC3 доказаны (частично — в r1, точечно — довешено здесь). Зелёный.
Материал раунда
- Ветка:
issue/709-mutants-nightly-only, коммит09d35c8d2c11— ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. - Дерево материала:
6f511338537bb2dd6eaac4bda778618d95705eccgit log --all --format='%H %T' | grep 6f511338537b - Тело issue:
914787f126c442dc2e4cacb96385538eb2f0e315dbaa828e3e0241a2a9ba81e5 - Вердикт конвейера:
green· High 0