11 KiB
CODE-REVIEW-250-r2
Скоуп раунда
Этап: code (PROCESS.md §2.7). Заход r2. Блокирующих циклов израсходовано 1 из 4 (потрачен жёлтым вердиктом r1; зелёный вердикт цикл не образует, §4).
Предыдущий раунд: r1, вердикт жёлтый, документ docs/reviews/CODE-REVIEW-250-r1.md, получен на SHA 7269550 (комментарий от 2026-08-22T23:15:18Z; SHA в самом вердикте не назван — восстановлен сопоставлением диапазона origin/dev..HEAD (4 коммита) и таймстампа комментария с git log; это отдельно отмечено в находках ниже).
Единственная находка r1 — CR-1 (Medium, в скоупе): после переименования теста test/opening-symbol.test.mjs ('shared renderer centres defaults…' → 'shared renderer centres every flip…') мутационный guard opening-gate-flip-cancels-turn в scripts/mutation-gate.mjs:1678 продолжал искать старый --test-name-pattern, ноль подтестов совпадало, node --test возвращал успех и на чистом, и на мутированном коде — guard не мог упасть.
Дельта раунда: git diff 7269550..HEAD (за вычетом коммита 7180eee, кладущего сам документ ревью r1) — коммит ed7ea29 "test: restore gate flip mutation coverage":
scripts/mutation-gate.mjs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Единственное изменение — строка паттерна:
- + '&& node --test --test-name-pattern="shared renderer centres defaults" '
+ + '&& node --test --test-name-pattern="shared renderer centres every flip" '
Дельта не трогает src/**, продуктовое поведение, контракт AC или новую подсистему — это точечное исправление тестовой инфраструктуры, ровно закрывающее CR-1. Согласно PROCESS.md §2.9 разбор ведётся по дельте, а не заново; условий для полного повторного разбора (ребейз, смена контракта, новая подсистема, объём дельты сопоставимый с задачей) нет.
Как проверялось
Всё проверено исполнением, не только чтением диффа:
node scripts/mutation-gate.mjs --id=opening-gate-flip-cancels-turn→поймано 1 из 1(guard теперь падает на мутанте, как требует ТЗ §14).grep -n "shared renderer centres every flip" test/opening-symbol.test.mjs→ тест с новым именем существует (строка 70), паттерн находит ровно один подтест.grep -rn "shared renderer centres defaults" scripts/ test/→ пусто, других устаревших ссылок на старое имя нет.- Проверены остальные записи
mutation-gate.mjs, ссылающиеся наtest/opening-symbol.test.mjs(строки 773, 1650, 1664) — их паттерны не зависят от переименованного теста, переименование их не касается. node scripts/mutation-gate.mjs --id=opening-symbol-flip-restores-edge-offset→поймано 1 из 1— повторно проверен основной мутант задачи (не был предметом CR-1, но дешёвый и относится к тому же файлу).npx tsc --noEmit→ чисто, exit 0.npm test→ 1114/1114 pass, 0 fail, 0 skip.npm run build→ зелёно;dist/houseplan-card.js,demo/srv/assets/houseplan-card.js,custom_components/houseplan/frontend/houseplan-card.js— три копии, все с одинаковым SHA-256806648ae60367be89ae4f4be1d8a6830d5ecc1f46bbd4548961536e8c27234c6(совпадает с SHA, заявленным автором на r1 — ожидаемо: дельта r2 не трогаетsrc/**, бандл не меняется).node scripts/process-gate.mjs --range origin/dev..HEAD --issues→ «гейт пройден, предупреждений 0» (полный диапазон, 6 коммитов).- Трейлеры коммита
ed7ea29:Issue: #250,User-Visible: no— корректно, правка не меняет видимого поведения.
Закрытие раунда r1
| Находка | Чем закрыта | Где это видно |
|---|---|---|
CR-1 (Medium, в скоупе): --test-name-pattern="shared renderer centres defaults" не матчит переименованный тест, guard opening-gate-flip-cancels-turn не может упасть |
Коммит ed7ea29: паттерн заменён на "shared renderer centres every flip" |
scripts/mutation-gate.mjs:1678; исполнением — node scripts/mutation-gate.mjs --id=opening-gate-flip-cancels-turn → поймано 1 из 1 (этим ревью, не только заявлением автора) |
Унаследовано из r1
Без повторной проверки в этом раунде, на основании docs/reviews/CODE-REVIEW-250-r1.md (SHA 7269550) — дельта r2 не затрагивает ни один из этих фактов:
- AC1–AC9 ТЗ
docs/specs/250-opening-centerline.md: безусловный нулевой offsetopeningSymbolOffset(), сохранение зеркала створки, независимость gate/passage, parity Flat/Static/Iso, физическая глубина косяков, tunnel/wall-cut контроль — подтверждены на7269550unit-матрицей, мутантомopening-symbol-flip-restores-edge-offsetи целевыми smoke (smoke_wall_thickness,smoke_isometric_contract,smoke_opening_preview). - Документация и оба changelog (RU/EN) правлены синхронно в user-visible коммите
0eb9ffe;docs/WALL-THICKNESS.md,docs/USER-GUIDE.ru.md,docs/ARCHITECTURE.md,docs/ISOMETRIC.mdобновлены по AC8. node scripts/check-docs.mjsбыл зелёным на7269550; в r2 не перепрогонялся, так как дельта не трогаетsrc/**(отпечаток скриншотов документации не может измениться).Docs screenshotsjob принят на точном SHA0eb9ffe480ca58f518ecce197a5431a0e45a1477, артефакт просмотрен автором.- Golden impact (
npm run golden:verify) разобран на7269550: единственная целевая изменившаяся сцена задачи (opening-symbol-flip-pairs-light) верна, остальные три целевые сцены не поехали; широкий внешний baseline drift — предбетовый гейт, не блокирует code review. В r2 не перепрогонялся: дельта не трогаетsrc/**, рендер не может измениться. smoke-selectна 6-символьной дельте r1 дал НЕОПРЕДЕЛЁННОСТЬ; автор вручную прогнал три релевантных smoke. В r2 дельта — однострочная правка тестового скрипта, не продуктового кода; смоки к ней неприменимы и не перепрогонялись.
Находки этого раунда
Блокирующих находок нет.
Low, снята с записью. SHA, на котором получен вердикт r1, не был назван в самом тексте вердикта — пришлось восстанавливать его сопоставлением диапазона коммитов и таймстампа комментария с git log. Не блокирует (восстановление однозначно и заняло одну команду), но на будущее вердикт код-ревью должен явно называть SHA диапазона, чтобы следующий раунд не тратил на это отдельный шаг.
Что проверено и корректно
- Единственное изменение дельты (
scripts/mutation-gate.mjs:1678) точно и полностью закрывает CR-1: паттерн исполнением подтверждён рабочим, мутант падает 1/1. - Побочных ссылок на старое имя теста не осталось.
- Полный диапазон
origin/dev..HEAD(6 коммитов) зелёный поtypecheck,test,build(три копии бандла идентичны),process-gate --issues. - Трейлеры коммита
ed7ea29корректны (Issue: #250,User-Visible: no), что соответствует характеру правки (тестовая инфраструктура, не видимое поведение).
Чего не проверял и почему
node scripts/check-docs.mjs— не прогонял в r2. Дельта не трогаетsrc/**, отпечаток скриншотов документации зависит только отsrc/**, поэтому результат не может измениться относительно зелёного7269550.npm run golden:verify— не прогонял в r2. Дельта не меняет ни один рендер-путь (src/**не тронут), полный разбор был выполнен и принят на7269550.- Браузерные смоки
demo/smoke_*.mjs, включаяsmoke-select— не прогонял в r2. Продуктовый код не менялся; релевантные смоки (smoke_wall_thickness,smoke_isometric_contract,smoke_opening_preview) были прогнаны и зелёные на7269550, дельта r2 их не касается. python -m pytest tests_backend -q— не требуется,custom_components/**/*.pyне тронут ни в одном коммите диапазона.- Performance-профили — не требуются, в AC не названы и чувствительные к перфу пути не тронуты.
Вердикт
Зелёный. Единственная находка предыдущего раунда закрыта точечно и подтверждена исполнением (мутант падает 1/1). Новых находок в дельте r2 нет, кроме Low-замечания к процессу (не блокирует). AC1–AC9 наследуются из r1 без изменений, так как дельта их не задевает.