# CODE-REVIEW-513-r2 Заход: r2 · блокирующих циклов израсходовано 1 из 2 ## Материал - Предыдущий вердикт: r1, жёлтый, High 0 / Medium 1 (M1), получен на SHA `61905bacdc5a9f08cd70562d7a43b50b8ad88c4a` — SHA назван самим документом r1 (`docs/reviews/CODE-REVIEW-513-r1.md`, блок «Материал раунда»), не находка. - Дельта этого раунда: `git diff 61905bacdc5a9f08cd70562d7a43b50b8ad88c4a..HEAD` (за вычетом некодового коммита `f5fb7a0f` — публикация документа r1): ``` docs/TESTING.md | 5 +++-- scripts/mutation-gate.mjs | 4 ++-- scripts/pre-push-gate.mjs | 11 ++++++----- test/mutation-gate.test.mjs| 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) ``` Один коммит `0b9acd6382e5f01e264d3516d936819055255ea3` — «docs: the local pre-push gate no longer calls the full mutation registry a pre-release gate», текст коммита сам указывает на закрытие M1 из r1. Рабочая копия на этом SHA (`git rev-parse HEAD` = `0b9acd63…`, совпадает с материалом ревью). - Трейлеры коммита: `Issue: #513`, `User-Visible: no` — присутствуют, формат верный. Диффу не трогает `src/**`/`custom_components/**`, только комментарии/строки консоли в трёх `scripts/*.mjs`+`test/*.mjs` и один абзац `docs/TESTING.md` → `User-Visible: no` фактически верен, changelog не тронут — правильно, `git diff --stat` подтверждает отсутствие правок `docs/CHANGELOG*.md`. - Дельта не сопоставима по объёму с исходной задачей, не задевает новую подсистему, ребейза на ушедший вперёд `dev` не было (диапазон `origin/dev..HEAD` = два коммита, `f5fb7a0f`+`0b9acd63`, оба поверх материала r1) — локальный разбор по дельте применим, полный прогон не требуется. ## Скоуп (наследовано из r1, не меняется дельтой) Issue #513, лёгкий трек: полный мутационный прогон переводится с еженедельного/предрелизного триггера на ночное расписание, вне цикла разработки и релиза. Дельта r2 не меняет ни cron, ни условие report-job, ни какую-либо логику — только формулировки в комментариях/выводе, закрывающие ровно M1. ## Закрытие раунда r1 | Находка r1 | Чем закрыта | Где это видно | |---|---|---| | M1 (Medium, в скоупе): `scripts/pre-push-gate.mjs` (строки 22–24 комментарий, 182–183 `console.log`) продолжал называть «весь мутационный реестр» предрелизным гейтом — прямое противоречие AC3 и новому тексту `docs/TESTING.md`/`mutation-gate.mjs`, принятому этим же диффом | Обе строки переформулированы: комментарий и фактический вывод скрипта теперь говорят «HA-харнесс — heavy-набор Validate на кандидате; весь мутационный реестр — ночное расписание (#513)» | `scripts/pre-push-gate.mjs:22-25` (шапка) и `scripts/pre-push-gate.mjs:183-184` (`console.log`), проверено чтением диффа и `node --check` (синтаксис корректен) | Автор в комментарии заявил более широкий охват фикса (`test/mutation-gate.test.mjs` шапка, дифф-режим `scripts/mutation-gate.mjs`, `docs/TESTING.md` §pre-push) — проверено построчно, все три правки на месте и синхронны по формулировке: - `scripts/mutation-gate.mjs:8491,8789` — «полный набор остаётся предрелизным контрактом» / «полный реестр остаётся предрелизным контрактом» → «полный набор идёт ночным расписанием (#513)» / «полный реестр идёт ночным расписанием (#513)». - `test/mutation-gate.test.mjs:16` — комментарий шапки: «предрелизный» → «ночное расписание (#513)». Логика теста (cron/day-of-week/фраза-запрет) не менялась — унаследована из r1 без повторной проверки падения теста (см. ниже). - `docs/TESTING.md:1058-1060` — тот же абзац, что и в `pre-push-gate.mjs`, переформулирован идентично. Полнотекстовый повторный поиск по всему дереву (не только по изменённым файлам, как и в r1) подтверждает: ни один *живой* документ процесса (`scripts/**`, `test/**`, `docs/TESTING.md`, `docs/PROCESS.md`, `AGENTS.md`, `.github/workflows/**`) больше не называет полный мутационный реестр шагом разработки или релиза. ``` grep -rln "предрелизн" scripts test docs --include="*.md" --include="*.mjs" --include="*.yml" \ | grep -v docs/reviews ``` даёт только `scripts/smoke-select.mjs` (о полной матрице смоков — не о мутационном реестре, вне AC3) и файлы `docs/specs/*.md` других задач (их упоминания «предрелизн…» не о мутационном гейте). Оставшиеся упоминания «весь мутационный реестр — предрелизный гейт» — только в архивных `docs/reviews/CODE-REVIEW-513-r1.md` (сам документ r1, зафиксированное прошлое состояние) и в исторических `CODE-REVIEW-478-r1.md`/ `CODE-REVIEW-472-r2.md` (написаны раньше решения владельца от 09.09, речь там о другом наборе — performance smoke / гейт до этого решения). Это не живые документы процесса, а замороженные артефакты ревью прошлых задач — правка их задним числом не требуется и не предусмотрена процессом (§9, исторические ревью «описывают код, которого уже нет»). **Вывод: AC3 закрыт полностью.** ## Разбор по AC — что перепроверено дельтой, что унаследовано - **AC1** (cron ежедневный `0 1 * * *`; тест краснеет при смене на недельное). Дельта r2 не трогает ни `mutation-gate.yml`, ни логику `test/mutation-gate.test.mjs` (только строка комментария в шапке файла) — **унаследовано из r1** без повторной проверки падения теста, доказательство ниже не могло измениться. - **AC2** (report-job заводит issue только для `schedule`). Не затронут дельтой r1 и r2 — **унаследовано из r1**. - **AC3** (ни один документ процесса не называет полный мутационный прогон шагом разработки/релиза). Был не закрыт в r1 (M1); дельта r2 — целевой фикс. **Перепроверено заново** в этом раунде (см. «Закрытие раунда r1» выше) — выполнен полностью. - **AC4** (`User-Visible: no`; UX/i18n/модель данных не затронуты). Дельта r2 не трогает `src/**`, только комментарии и текст CLI-вывода — **перепроверено**: трейлер коммита `0b9acd63` соответствует, changelog не правился, соответствует факту. ## Как проверялось 1. Нашёл вердикт и материал r1 в `docs/reviews/CODE-REVIEW-513-r1.md` и в комментариях issue #513 (`gh issue view 513 --json body,comments,labels`). 2. Объявил дельту: `git log`/`git diff` `61905bacdc5a…HEAD`, отдельно исключив некодовый коммит публикации документа r1. 3. Построчно сверил дифф с заявлением автора в хендоффе r2 («M1 закрыт…») — каждая упомянутая правка (`pre-push-gate.mjs`, `mutation-gate.mjs`, `test/mutation-gate.test.mjs`, `docs/TESTING.md`) присутствует и согласована по формулировке. 4. Полнотекстовый `grep` по дереву (не ограничиваясь диффом) на предмет остаточных упоминаний «мутационный реестр — предрелизный/по понедельникам» — ничего живого не осталось (см. раздел выше). 5. `node --check` на всех трёх изменённых `.mjs`-файлов — синтаксис корректен. 6. `node --test test/mutation-gate.test.mjs` — 42/42 зелёных (совпадает со счётом r1; расхождение с заявленными автором «44/44» в r2-хендоффе не проверено отдельно — то же несоответствие уже отмечено и не признано находкой в r1, логика теста дельтой не менялась). 7. Подтвердил, что дифф не трогает `src/**`/`custom_components/**/*.py` (`git diff …--stat -- src/ custom_components/` — пусто). ## Что проверено и корректно - M1 из r1 закрыт по существу и по формулировке, согласован во всех трёх местах, где жила стилистическая ошибка, плюс синхронно поправлен `docs/TESTING.md`. - Термин «heavy-набор Validate на кандидате» — не новодел: совпадает с уже установленной терминологией `scripts/classify-changes.mjs` (`heavyGatesRequested`) и с формулировками из прежних ревью (`heavy=false/true`, «heavy-гейтинг»), значит не вносит нового расхождения словаря. - Трейлеры коммита `0b9acd63` (`Issue: #513`, `User-Visible: no`) верны и соответствуют фактическому диффу. - Диапазон `origin/dev..HEAD` не содержит стороннего кода — только документ ревью r1 (класс C, публикация) и текущий фикс-коммит (тоже класс C: `scripts/**`, `test/**`, `docs/**`). ## Чего не проверял и почему - `npx tsc --noEmit`, `npm test` (полный), `npm run build` со сверкой трёх копий бандла, `node scripts/check-docs.mjs` — **не прогонял отдельно**. Validate на точном SHA материала `0b9acd63` зелёный (https://github.com/Matysh/houseplan-card/actions/runs/34386523768), и дельта r2 не трогает `src/**`/`custom_components/**` — те же основания, что и в r1, дельтой не задеты. - Браузерные смоки, `golden:verify`, `pytest tests_backend`, performance-профили — не применимо: дельта меняет только текст комментариев/CLI-вывода в трёх нетронутых r1 местах и один абзац документации; ни рендер, ни бэкенд, ни перф-пути не затронуты. - `npm run invariants` / инварианты модели — не применимо, геометрия и ссылки на неё дельтой не задеты (унаследовано из r1). - Полный `node scripts/mutation-gate.mjs` (без `--changed`) — не прогонял: дорогой прогон (~37 мин), сама задача выводит его из цикла ревью; вместо него — дешёвый `test/mutation-gate.test.mjs` (п.6 выше). - «Одно число — один источник» — не применимо: дельта не добавляет и не меняет ни одной пользовательски видимой величины. ## Унаследовано из r1 Без повторной проверки принято (документ `docs/reviews/CODE-REVIEW-513-r1.md`, материал: ветка `issue/513-mutation-gate-nightly`, коммит `61905bacdc5a`, дерево `0ff88d8c67bc15b1170c5a0164b6d94f15af2bfe`): - AC1 — тест `test/mutation-gate.test.mjs` пинит cron `0 1 * * *` и умеет падать (r1 экспериментально откатывал cron на недельный, тест краснел, `not ok 14`); дельта r2 логику теста не трогает. - AC2 — условие `github.event_name == 'schedule'` в report-job (`.github/workflows/mutation-gate.yml:125`) не менялось ни r1, ни r2. - Отсутствие пересечения по времени с ночным Validate (cron 01:00 UTC vs 02:30 UTC) — геометрия расписания дельтой не затронута. - Класс изменений (C: workflow/скрипты/тест/доки), отсутствие правок `src/**` — верно в r1 и остаётся верным в r2. - `docs/specs/README.md` не содержит упоминаний мутационного гейта ни до, ни после дельты r1 — не проверял заново, дельта r2 этот файл не трогает. ## Вердикт Зелёный. M1 (единственная блокирующая жёлтый вердикт находка r1) закрыт по всем упомянутым автором местам и подтверждён полнотекстовым поиском по дереву — ни один живой документ процесса больше не называет полный мутационный реестр шагом разработки или релиза. AC1–AC4 выполнены: AC1/AC2 унаследованы из r1 (дельта их не касается), AC3 перепроверен и закрыт в этом раунде, AC4 подтверждён на текущем SHA. Новых находок нет. --- ## Материал раунда - Ветка: `issue/513-mutation-gate-nightly`, коммит `0b9acd6382e5` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. - Дерево материала: `7401a1eedfb837c8c9577c2f7b4b7fcb75bbec98` ``` git log --all --format='%H %T' | grep 7401a1eedfb8 ``` - Вердикт конвейера: `green` · High 0