Files
houseplan-card/docs/reviews/CODE-REVIEW-513-r2.md
T
2026-09-09 18:09:24 +00:00

16 KiB

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