diff --git a/docs/reviews/SPEC-REVIEW-489-r2.md b/docs/reviews/SPEC-REVIEW-489-r2.md
new file mode 100644
index 00000000..06e22526
--- /dev/null
+++ b/docs/reviews/SPEC-REVIEW-489-r2.md
@@ -0,0 +1,109 @@
+# SPEC-REVIEW-489-r2
+
+- **Issue:** https://github.com/Matysh/houseplan-card/issues/489
+- **Этап:** ТЗ на ревью (PROCESS.md §2.4)
+- **Материал:** `docs/specs/489-data-hp-contract.md` на SHA `e072b222749d38fc1c7b5000b16907438bc5c6ee`
+ (commit `e072b222`, ветка `issue/489-data-hp-contract`).
+- **Предыдущий раунд:** r1, вердикт жёлтый, SHA `9cf10bdde7696e13c049fe83b4dc284622386127`
+ (commit `9cf10bdd`), документ `docs/reviews/SPEC-REVIEW-489-r1.md`. SHA в вердикте
+ комментария не был назван явно — восстановлен по истории коммитов (`9cf10bdd` —
+ единственный коммит, добавивший этот файл, непосредственный родитель следующего
+ коммита-документа `a48827ec`).
+- **Заход:** r2. Блокирующих циклов израсходовано 1 из 4 (лимит на полном треке — 4).
+
+## Скоуп разбора
+
+Дельта — `git diff 9cf10bdd..e072b222 -- docs/specs/489-data-hp-contract.md`:
+26 строк (18 добавлено / 8 удалено), без ребейза (история линейна,
+`git merge-base 9cf10bdd e072b222` = `9cf10bdd`, HEAD — прямой потомок). Дельта
+целиком лежит в четырёх местах документа, и все четыре — это ровно три находки
+r1:
+
+1. §6.2 — строка `data-hp-mode` (M3);
+2. §6.3 — три строки `zoom-in`/`zoom-out`/`zoom-fit` (M1);
+3. §10 AC7/AC8 — формулировка гейта документации (M2);
+4. §14 release-артефакты + §15 принятые предположения — те же M2/M3, раскрытые
+ подробнее.
+
+Новых подсистем, нового публичного поведения или изменения контракта дельта не
+вводит — это правки формулировок в тех же разделах, что r1 уже разобрал построчно.
+Объём разбора этого раунда: закрытие всех трёх находок проверено чтением
+актуального кода/скриптов (не только текста ТЗ), продуктовая рамка и разделы,
+которых дельта не касается, — унаследованы из r1 без повторной проверки (раздел
+ниже).
+
+## Закрытие раунда r1
+
+| Находка | Чем закрыта | Где это видно |
+|---|---|---|
+| **M1** — условие «когда отображается header» для zoom-кнопок требовало нового render-условия либо вводило в заблуждение | Формулировка заменена на «как сейчас: в ordinary plan render; в kiosk остаётся в DOM внутри скрытого CSS header» — выбран вариант (a) из r1: хук существует как сегодня, kiosk не меняет DOM | `docs/specs/489-data-hp-contract.md` §6.3, строки zoom-in/zoom-out/zoom-fit. Проверено чтением `src/houseplan-card.ts:11400` (`
`) — `.zoomctl` (строка 11471) рендерится безусловно внутри `.hdr`, kiosk добавляет только CSS-класс `kioskhide`, элемент остаётся в DOM. Формулировка ТЗ теперь совпадает с кодом дословно |
+| **M2** — гейт `check-docs` не назван обязательным, команда не та (`check:docs` вместо `check-docs.mjs`), пересъёмка скриншотов не упомянута в §14 | AC7/AC8 переписаны на точную команду `node scripts/check-docs.mjs`, названную обязательной («поскольку меняется `src/**`, дополнительно обязателен»); §14 получил новый пункт про канонический комплект docs screenshots из workflow **Docs screenshots**, принятый `npm run docs:accept -- --reviewed --from=<распакованный-артефакт>`, с явным запретом локальной пересъёмки | §10 AC7/AC8 и §14. Проверено: `scripts/check-docs.mjs` существует и реализует ровно то поведение, что описано (`scripts/docs-freshness.mjs` — по умолчанию `strict`, т.е. без флага фейлит при устаревшем отпечатке, не просто предупреждает); `npm run docs:accept` в `package.json:18` → `node scripts/docs-accept.mjs`, поддерживает `--reviewed --from=`; формулировка о workflow **Docs screenshots** и запрете локальной пересъёмки совпадает дословно с `PROCESS.md` §8 (строки 648–651) |
+| **M3** — `data-hp-mode="device"` (ед. число) расходился с уже опубликованным `mode-devices` без объяснения | Значение изменено на `devices`, словарь `view/plan/devices/decor`; §15 явно фиксирует: «`devices` сохраняет уже опубликованное имя `.stage.mode-devices`... отдельное третье имя `device`... не вводится» | §6.2 и §15. Проверено: `docs/STYLING-HOOKS.md:286` обещает стабильность `mode-devices`; внутренний код везде использует `_mode === 'devices'` (`src/houseplan-card.ts:1768, 2947, 5727, 6826` и др.) и `data-editor-navigation="devices"` уже существует (`src/houseplan-card.ts:11446` при `m` из `['plan','devices','decor']`). Новое значение ТЗ совпадает с обоими существующими публичными именами, расхождение устранено, а не переименовано в третье |
+
+Все три находки закрыты по существу, не декларативно: формулировки ТЗ после
+правки проверены построчно против текущего кода и скриптов, а не приняты на
+слово автора.
+
+## Унаследовано из r1
+
+Без повторной проверки в этом раунде приняты выводы `docs/reviews/SPEC-REVIEW-489-r1.md`
+(SHA `9cf10bdde7696e13c049fe83b4dc284622386127`), поскольку дельта их не задевает:
+
+- структура документа содержит все обязательные разделы §7.1;
+- продуктовая рамка (сценарий, персона, отсутствие нового пользовательского
+ поведения, соответствие job'у из `docs/SCOPE.md` через инфраструктуру
+ тестирования) — без конфликта;
+- открытых продуктовых вопросов владельцу нет и не должно быть — все решения
+ технические;
+- §6.3 `space-add`/`space-settings`, §6.4 (три редактора, `toolbar`/`tool`/
+ `editor-close`/`tray`, `EditorSecondaryController` как кандидат под `tray`),
+ §6.5 (диалоги, выборка 10 из 33 call site), §6.6 (панель #486, единственный
+ `menu`-обработчик и заголовок) — сверены с кодом в r1, дельта их не трогает;
+ доверяю выводу без повторного построчного сравнения;
+- §9 i18n (тривиально выполнено — ссылки в `USER-GUIDE.ru.md` пока нет);
+- пустое состояние (§6.3 `empty`/`create-space`) и три его ветки — без
+ расхождений в r1;
+- открытые технические детали, оставленные на этап кода без блокировки:
+ полнота словаря `data-tool` по launcher-группам, оставшиеся 23 из 33
+ call site диалогов, реализуемость regex/AST-сканера AC6.
+
+## Что проверено в этом раунде (сверх таблицы закрытия)
+
+- Линейность истории между r1 и r2: `git log --oneline`, `git merge-base` —
+ ребейза не было, полный разбор по этому основанию не требуется.
+- Дельта не выходит за пределы четырёх мест, перечисленных в «Скоуп разбора»:
+ сверено полным `git diff 9cf10bdd..e072b222` (не только упомянутые в
+ коммит-сообщении места).
+- Внутренняя согласованность новых формулировок друг с другом и с остальным
+ документом (§14 бюллет не дублирует и не противоречит AC7/AC8; §15 пункт про
+ `devices` не противоречит §6.2).
+
+## Чего не проверял
+
+- Гейты (typecheck/test/build) не гонялись: правка — только markdown ТЗ, кода
+ для проверки нет, как и в r1.
+- Разделы вне дельты (см. «Унаследовано») не перечитывались построчно повторно.
+
+## Вердикт
+
+`Вердикт: зелёный · заход r2 · блокирующих циклов 1/4 · High: 0 · Medium: 0`
+
+Все три Medium из r1 закрыты по существу и подтверждены чтением актуального
+кода/скриптов, а не только текста правки. Новых находок дельта не создала.
+ТЗ готово к переходу на код-ревью (S7).
+
+---
+
+
+
+## Материал раунда
+
+- Ветка: `issue/489-data-hp-contract`, коммит `e072b222749d` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
+- Дерево материала: `885a8d6d361cac9ce02dae5c998fd60df6c65759`
+ ```
+ git log --all --format='%H %T' | grep 885a8d6d361c
+ ```
+- ТЗ `docs/specs/489-data-hp-contract.md`, блоб `127ce9505c272a9a4152b92157d71d78b96b1070`
+ ```
+ git log --all --find-object=127ce9505c272a9a4152b92157d71d78b96b1070 -- docs/specs/489-data-hp-contract.md
+ ```