mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-02 21:01:21 +00:00
82 lines
11 KiB
Markdown
82 lines
11 KiB
Markdown
# 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 без изменений, так как дельта их не задевает.
|