From eaeada16ae03ce6d1e882bf27fd426d0c0eef3b3 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <209825114+claude[bot]@users.noreply.github.com> Date: Tue, 29 Sep 2026 20:27:24 +0000 Subject: [PATCH] docs: review document for #709 Issue: #709 User-Visible: no --- docs/reviews/CODE-REVIEW-709-r2.md | 159 +++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 docs/reviews/CODE-REVIEW-709-r2.md diff --git a/docs/reviews/CODE-REVIEW-709-r2.md b/docs/reviews/CODE-REVIEW-709-r2.md new file mode 100644 index 00000000..e03335e3 --- /dev/null +++ b/docs/reviews/CODE-REVIEW-709-r2.md @@ -0,0 +1,159 @@ +# 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