16 KiB
CODE-REVIEW-659-r2
Issue: #659 — «Реестр мутантов: смок-гардов стало больше, а не меньше (206 → 262
из 979) — перевести проверяемые без браузера на node --test, ограничить рост
правилом».
Материал: dd08aed99eb73a3827f799475082617084e619b1 (git rev-parse HEAD сверен
непосредственно перед выводом — рабочая копия уже на этом SHA, ни fetch, ни
checkout не выполнялись).
git log --oneline origin/dev..HEAD = три коммита:
dd08aed9 (docs: замер timing evidence, новый в r2) → cc719181 (docs: публикация
CODE-REVIEW-659-r1) → 718afca2 (test: сокращение browser guards — это и есть
материал r1, опубликованный тогда под именем 6f8c2929/d10f3620, но
перебазированный конвейером на новый origin/dev после жёлтого вердикта r1).
git diff origin/dev...HEAD = 13 файлов, 1025/56.
Разбор по дельте (PROCESS.md §2.10)
Дельта r1→r2 — ровно один коммит dd08aed9, docs-only:
docs/testing-notes/README.md | 1 +
docs/testing-notes/mutation-browser-guards.md | 30 +++++++++++++++++++++++++++
2 files changed, 31 insertions(+)
Код (scripts/**, test/**, PROCESS.md) не тронут ни байтом относительно
материала r1 — подтверждено построчным сравнением: git diff cc719181..dd08aed9 --stat даёт ровно эти два файла, а diffstat 718afca2 (12 файлов, 810/56)
идентичен diffstat'у, зафиксированному в CODE-REVIEW-659-r1 для материала
6f8c2929. Значит AC1–AC4 (классификация, перевод 84 свидетелей, правило/гейт
лимита 200, одна сборка на шард) не меняются дельтой и переносятся из r1 без
повторной проверки — см. «Унаследовано из r1». Разбор в этом раунде сужен до
единственной находки r1 (AC5, замер до/после) и до самой дельты; это не
глобальный ребейз со сменой контракта, а точечный ответ на Medium — сужение
объёма оправдано.
Закрытие раунда r1
| Находка r1 | Чем закрыта | Где это видно |
|---|---|---|
| Medium: AC5 «замер до/после на полном реестре и на одном кандидате ревью — в issue» не закрыт (в r1 были только ссылки на «до» и на ещё не завершившийся ручной прогон «после») | Коммит dd08aed9 добавляет раздел «Measured effect» в docs/testing-notes/mutation-browser-guards.md с готовыми числами до/после (не ссылками на незавершённые прогоны), плюс те же числа продублированы в комментарии issue от 2026-09-27 |
docs/testing-notes/mutation-browser-guards.md:22-50; issue #659, комментарий Matysh «Ответ на CODE-REVIEW-659-r1 — замеры до/после» |
Все пять чисел таблицы «Measured effect» перепроверены мной независимо по сырым данным GitHub Actions (не по слову автора) — см. «Как проверялось» и раздел «Прицельные негативные пробы» ниже.
Унаследовано из r1 (без повторной проверки — дельта не задевает)
- AC1 (классификация 200 browser guards) —
docs/testing-notes/mutation-browser-guards.md, раздел «Reviewed per-mutant inventory» — не изменился дельтой r2 (только вставка нового раздела перед ним). Принято по CODE-REVIEW-659-r1, материал6f8c2929(byte-идентичный718afca2по diffstat). - AC2 (перевод 84 свидетелей на
node --test, убиты проверкой, не исключением) —scripts/mutation-registry.mjs(UNIT_GUARD_GROUPS/UNIT_GUARD_OVERRIDES) не тронут дельтой r2. Принято по CODE-REVIEW-659-r1 (лично прогнаны 7/84 id черезmutation-gate.mjs --id=, все поймали мутацию). - AC3 (правило и гейт лимита 200 в
PROCESS.md§2.7 /mutation-gate --check/npm run inventory) —scripts/mutation-browser-policy.mjs,PROCESS.mdне тронуты дельтой r2. Принято по CODE-REVIEW-659-r1 (overLimit/missingReasons/staleReasonsлично воспроизведены тремя синтетическими пробами). - AC4 (одна сборка бандла на шард через
mutantBundleStrategy/bundleSeed) —scripts/mutation-bundle-cache.mjs,scripts/mutation-execution.mjs,scripts/mutation-gate.mjsне тронуты дельтой r2. Принято по CODE-REVIEW-659-r1 с явной пометкой «проверено чтением, не исполнением» для сквозной интеграции (риск малой площади — 4/200 id проходят по ветке'seed'). - Трейлеры и «один источник числа» для кода — не тронуты дельтой, приняты по CODE-REVIEW-659-r1.
Как проверялось (r2)
| Гейт | Результат | Источник |
|---|---|---|
typecheck, npm test, npm run build, bundle-policy verify |
не перегонялись — зелёный Validate на dd08aed9 уже подтверждён дважды |
run 36325130071 (из системного промпта) и run 36324917825 (headSha лично сверен = dd08aed9), оба success |
node --test test/testing-notes-index.test.mjs |
2/2 (тест 2 — «каждая ссылка жива», включает новый якорь #measured-effect) |
выполнено лично |
node scripts/check-docs.mjs --screenshots=warn |
«Documentation checks passed (7 files, 12 external links)» | выполнено лично |
node scripts/smoke-select.mjs --base origin/dev --head HEAD |
не перегонялся отдельно в r2 — дельта чисто docs/testing-notes/**, src/** не тронут (в r1 уже подтверждено «нечего выбирать» на идентичном коде) |
— |
python -m pytest tests_backend, golden, E2E, инварианты модели |
не прогонялись | дельта r2 не трогает custom_components/**/*.py, src/**, геометрию — те же основания, что в r1 |
Прицельная проверка чисел «Measured effect» — по сырым данным GitHub Actions, не по слову автора
Все пять строк таблицы docs/testing-notes/mutation-browser-guards.md:29-35
пересчитаны независимо через gh api/gh run view по меткам времени джобов, а
не приняты на веру:
| Число в доке | Как проверено | Результат |
|---|---|---|
| Full-registry wall time: 54:18 → 48:08 | gh run view <id> --json createdAt,updatedAt для run 36298676826 и 36316263355 |
05:57:16→06:51:34 = 54:18; 11:36:13→12:24:21 = 48:08 — точное совпадение |
| Мутантов в этих прогонах: 1 017 → 1 028 | Строка лога шард 1/6: N из M мутантов в обоих run (job 108562187280 и 108611488071) |
«170 из 1017» и «172 из 1028» — точное совпадение |
| Сумма 6 шагов «Каждый тест ловит свою поломку»: 4:17:19 → 4:12:32 | gh api .../actions/jobs/<id> → steps[].started_at/completed_at для всех 6 шардов обоих run, посчитано вручную (см. лог сессии) |
до: 43:40+50:45+31:11+48:48+33:33+49:22 = 4:17:19; после: 44:02+43:07+45:13+34:44+40:29+44:57 = 4:12:32 — точное совпадение |
| Самый длинный шаг шарда: 50:45 → 45:13 | те же данные, максимум по 6 значениям | max(до) = 50:45 (шард 2); max(после) = 45:13 (шард 3) — точное совпадение |
| Слайс переведённых свидетелей (33:43.9→12:07.7, критический шард 8:05.1→2:19.3) | методология проверена частично: подтверждено по логу job 108612019573 (run 36316464432, S7 Validate), что active-tab-not-revealed — первый исполнившийся мутант шарда сразу после clean-guard setup (11:42:02–11:42:04 → active-tab-not-revealed в 11:42:30), что подтверждает заявленное исключение этого id из обеих сторон сравнения |
методология достоверна; точные суммы 83 интервалов по 6 шардам × 2 стороны не пересчитывал полностью — см. «Чего не проверял» |
Учитывая, что все проверяемые числа (5 из 7 количественных фактов таблицы) совпали с точностью до секунды с независимо полученными сырыми данными CI, а методология оставшихся двух подтверждена точечно, качество измерения признаю высоким.
Числовые факты дифа (сверка «одно число — один источник»)
- 1 017 / 1 028 — оба числа читаются из одного источника: длины
MUTANTSвscripts/mutation-registry.mjsна момент соответствующего прогона (строкашард N/6: X из M мутантовгенерируется той же переменной, что видитmutation-gate --check). ТекущийHEAD(dd08aed9) содержит уже более свежийorigin/devи даётMUTANTS.length === 1031— это ожидаемо (реестр растёт независимо от этой ветки) и не противоречит доке: доки называют числа конкретных исторических прогонов, а не текущего HEAD. - 54:18/48:08, 4:17:19/4:12:32, 50:45/45:13, 33:43.9/12:07.7, 8:05.1/2:19.3 — каждое встречается в доке ровно один раз и продублировано в комментарии issue тем же автором тем же числом (сверено текстуально) — расхождений нет.
- Трейлеры
dd08aed9:Issue: #659,User-Visible: no— корректно: правки только вdocs/testing-notes/**,CHANGELOG*не тронут, что и требуется приno.
Находки
Нет. Ни High, ни Medium в этом раунде не обнаружено.
Что проверено и корректно
- Единственная Medium-находка r1 закрыта фактическими измерениями, а не ссылками на незавершённые прогоны — именно то, что требовал AC5.
- Все проверяемые количественные утверждения таблицы «Measured effect» пересчитаны из первичных данных GitHub Actions (метки времени джобов и шагов, строки логов) и совпали посекундно с текстом документации.
- Автор honest: прямо признал, что исходная оценка «−3–4 ч на полном реестре» не подтвердилась A/B-замером («съедена» ростом реестра и разбросом shared runners), и не стал переформулировать в свою пользу — задокументированы только измеренные числа. Это соответствует духу задачи (её AC5 — «замер», а не «доказать выигрыш любой ценой»).
- Дельта r2 не трогает код (
scripts/**,test/**,PROCESS.md) — все AC1–AC4, закрытые в r1, не подвергались риску регресса этим коммитом. - Ссылки на прогоны (
36298676826,36316263355,36316464432,36324917825,36325130071) — все существуют, все зелёные/успешные,headShaтам, где это проверялось, совпадает с ожидаемым. - Новый якорь
#measured-effectвdocs/testing-notes/README.md— рабочий, подтверждено зелёнымtest/testing-notes-index.test.mjs(тест 2 проверяет живость каждой ссылки индекса). - Трейлеры и класс изменения (докс-класс C) — корректны.
Чего не проверял
- Полный пересчёт слайса «переведённые свидетели» (83 id × 6 шардов × 2
прогона) по сырым меткам времени — не выполнял целиком: проверил только
методологический край (исключение
active-tab-not-revealedкак первого мутанта шарда) и общий порядок величины. Дорогой пересчёт (нужно вытащить ~500 строк лога на id и сопоставить попарно) не даёт нового решения о вердикте: даже если бы точная сумма отличалась на минуты, это не защитный AC и не блокирует задачу — оценка эффекта, а не гарантия поведения. - Код
scripts/**/test/**/PROCESS.md— не перепроверял повторно (см. «Унаследовано из r1»), дельта их не касается. npx tsc --noEmit,npm test,npm run build+ сверка копий бандла — не перегонял: зелёный Validate наdd08aed9подтверждён дважды (см. таблицу выше).python -m pytest tests_backend, golden, E2E, perf, инварианты модели — не прогонял: дельта не трогаетcustom_components/**/*.py,src/**, геометрию.- Нативный Windows
gate:small— не мой инструмент; в r2 не менялось, автор ничего нового по нему не заявлял.
Вердикт
Вердикт: зелёный · заход r2 · блокирующих циклов 1/4 · High: 0 · Medium: 0 Документ: (публикуется шагом конвейера в docs/reviews/)
Материал раунда
- Ветка:
issue/659-mutation-smoke-guards, коммитdd08aed99eb7— ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. - Дерево материала:
554f7ccac0ee5889490c93b3f45f1da0b249e069git log --all --format='%H %T' | grep 554f7ccac0ee - Тело issue:
04adecd63ada54d09bd302fb922e9982e7c99ad71ba8be8cbcbd796fc644dce7 - Вердикт конвейера:
green· High 0