# CODE-REVIEW-126-r2 - **Issue:** #126 — «Смена area устройства в HA не переносит иконку в новую комнату, если позиция была сохранена» - **Этап:** code (PROCESS.md §2.7) - **Заход:** r2 · блокирующих циклов 1/4 - **Диапазон:** `origin/dev...HEAD`, HEAD = `26cb00db` - **Вердикт:** зелёный · High: 0 · Medium: 0 ## Скоуп раунда r1 (код-ревью, `docs/reviews/CODE-REVIEW-126-r1.md`, вердикт жёлтый на SHA, названном в вердикте как `34b99b95`) нашёл один High и один Medium, оба в скоупе задачи. Ревью этого раунда — по дельте, а не заново, согласно PROCESS.md §2.9: причина не в ребейзе на ушедший вперёд `dev` (`git merge-base HEAD origin/dev` = `5c8cb58e` = сам `origin/dev`, т.е. база не сдвигалась) и не в новой подсистеме — исправления r1 локальны к тестовой обвязке и одной строке продуктового кода. **SHA-несостыковка (зафиксирована, не блокирует).** `34b99b95` из вердикта r1 не существует в текущей истории (`git cat-file -t 34b99b95` → `Not a valid object name`). По временным меткам коммитов (`633cb20e` 09:24 → `b319fc95` 09:29 → `61dd7ccb` 09:44, добавляющий сам `CODE-REVIEW-126-r1.md`) и по содержимому диффа `b319fc95` — это тот же логический снимок, что был назван `34b99b95` в вердикте: тот же продуктовый коммит + тот же screenshot-refresh, непосредственно предшествующий добавлению документа ревью. Хэш разошёлся, видимо, из-за локального reword/amend перед публикацией. Использую `b319fc95` как границу дельты — контент, а не сам хэш, подтверждён построчно ниже. Дельта — коммиты `d5268086` («fix: harden HA area relocation regressions», `User-Visible: no`) и `26cb00db` («docs: refresh canonical screenshots for area relocation», `User-Visible: no`), диапазон `b319fc95..HEAD`: ``` demo/golden/harness.mjs | 15 ++- demo/golden/matrix.mjs | 38 +++++++ demo/smoke_area_relocation.mjs | 205 +++++++++++++++++++++++++++++++++++-- demo/smoke_discovery_filters.mjs | 15 +++ demo/smoke_marker_stay.mjs | 10 +- demo/smoke_subarea.mjs | 11 +- demo/smoke_vacuum_firstuse.mjs | 21 ++-- demo/srv/demo.html | 5 + src/houseplan-card.ts | 5 + + dist/**, custom_components/houseplan/frontend/** (сгенерированные копии, класс D) + docs/images/*.png, docs/images/screenshots.json (класс C, канонические скриншоты) ``` Продуктовая логика `src/device-area-relocation.ts`, `src/types.ts`, backend (`validation.py`, `websocket_api.py`, `config-schema.json`), unit-тесты резолвера — не изменились между `b319fc95` и `HEAD` (`git diff --stat` по этим путям — пусто). По §2.9 п.4 повторно проверяю только те AC, чьё доказательство дельта задевает: AC-доказательства через browser smoke (AC2, AC6 §19 ТЗ) и Save-диалог устройства (AC-контракт `roomTouched`, r1 H1). Остальные AC наследую из r1 без повторной проверки — см. раздел ниже. ## Закрытие раунда r1 | Находка r1 | Чем закрыта | Где это видно | |---|---|---| | **H1** (High) — `demo/smoke_subarea.mjs` и `demo/smoke_marker_stay.mjs` писали `_markerDialog.room` напрямую, минуя реальное DOM-событие `#marker-room`; после введения `roomTouched` эта запись стала no-op, smoke проходил vacuously (`smoke_subarea` реально падал 6/14 на `34b99b95`) | `smoke_subarea.mjs` теперь берёт реальный `