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