Files
2026-09-29 20:27:24 +00:00

13 KiB
Raw Permalink Blame History

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 — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
  • Дерево материала: 6f511338537bb2dd6eaac4bda778618d95705ecc
    git log --all --format='%H %T' | grep 6f511338537b
    
  • Тело issue: 914787f126c442dc2e4cacb96385538eb2f0e315dbaa828e3e0241a2a9ba81e5
  • Вердикт конвейера: green · High 0