mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
@@ -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. Новых находок нет.
|
||||
|
||||
---
|
||||
|
||||
<!-- material-anchors: сгенерировано конвейером (#414) -->
|
||||
|
||||
## Материал раунда
|
||||
|
||||
- Ветка: `issue/513-mutation-gate-nightly`, коммит `0b9acd6382e5` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
|
||||
- Дерево материала: `7401a1eedfb837c8c9577c2f7b4b7fcb75bbec98`
|
||||
```
|
||||
git log --all --format='%H %T' | grep 7401a1eedfb8
|
||||
```
|
||||
- Вердикт конвейера: `green` · High 0
|
||||
Reference in New Issue
Block a user