docs: review document for #709

Issue: #709
User-Visible: no
This commit is contained in:
claude[bot]
2026-09-29 20:27:24 +00:00
parent 09d35c8d2c
commit eaeada16ae
+159
View File
@@ -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, точечно — довешено здесь). **Зелёный.**
---
---
<!-- material-anchors: сгенерировано конвейером (#414) -->
## Материал раунда
- Ветка: `issue/709-mutants-nightly-only`, коммит `09d35c8d2c11` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
- Дерево материала: `6f511338537bb2dd6eaac4bda778618d95705ecc`
```
git log --all --format='%H %T' | grep 6f511338537b
```
- Тело issue: `914787f126c442dc2e4cacb96385538eb2f0e315dbaa828e3e0241a2a9ba81e5`
- Вердикт конвейера: `green` · High 0