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

82 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 без изменений, так как дельта их не задевает.