Files
houseplan-card/docs/reviews/SPEC-REVIEW-489-r2.md
T
2026-09-08 18:08:10 +00:00

110 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.
# 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` (`<div class="hdr ${this._kiosk ? 'kioskhide' : ''}">`) — `.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).
---
<!-- material-anchors: сгенерировано конвейером (#414) -->
## Материал раунда
- Ветка: `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
```