Files
houseplan-card/docs/reviews/CODE-REVIEW-250-r2.md
T
2026-08-22 23:23:02 +00:00

11 KiB
Raw Blame History

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 разбор ведётся по дельте, а не заново; условий для полного повторного разбора (ребейз, смена контракта, новая подсистема, объём дельты сопоставимый с задачей) нет.

Как проверялось

Всё проверено исполнением, не только чтением диффа:

  1. node scripts/mutation-gate.mjs --id=opening-gate-flip-cancels-turn → поймано 1 из 1 (guard теперь падает на мутанте, как требует ТЗ §14).
  2. grep -n "shared renderer centres every flip" test/opening-symbol.test.mjs → тест с новым именем существует (строка 70), паттерн находит ровно один подтест.
  3. grep -rn "shared renderer centres defaults" scripts/ test/ → пусто, других устаревших ссылок на старое имя нет.
  4. Проверены остальные записи mutation-gate.mjs, ссылающиеся на test/opening-symbol.test.mjs (строки 773, 1650, 1664) — их паттерны не зависят от переименованного теста, переименование их не касается.
  5. node scripts/mutation-gate.mjs --id=opening-symbol-flip-restores-edge-offset → поймано 1 из 1 — повторно проверен основной мутант задачи (не был предметом CR-1, но дешёвый и относится к тому же файлу).
  6. npx tsc --noEmit → чисто, exit 0.
  7. npm test → 1114/1114 pass, 0 fail, 0 skip.
  8. npm run build → зелёно; dist/houseplan-card.js, demo/srv/assets/houseplan-card.js, custom_components/houseplan/frontend/houseplan-card.js — три копии, все с одинаковым SHA-256 806648ae60367be89ae4f4be1d8a6830d5ecc1f46bbd4548961536e8c27234c6 (совпадает с SHA, заявленным автором на r1 — ожидаемо: дельта r2 не трогает src/**, бандл не меняется).
  9. node scripts/process-gate.mjs --range origin/dev..HEAD --issues → «гейт пройден, предупреждений 0» (полный диапазон, 6 коммитов).
  10. Трейлеры коммита 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: безусловный нулевой offset openingSymbolOffset(), сохранение зеркала створки, независимость gate/passage, parity Flat/Static/Iso, физическая глубина косяков, tunnel/wall-cut контроль — подтверждены на 7269550 unit-матрицей, мутантом 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 screenshots job принят на точном SHA 0eb9ffe480ca58f518ecce197a5431a0e45a1477, артефакт просмотрен автором.
  • 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 без изменений, так как дельта их не задевает.