Files
houseplan-card/docs/reviews/SPEC-REVIEW-561-r2.md
T
2026-09-12 22:53:12 +00:00

159 lines
13 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-561-r2
## Скоуп
Issue #561 (`bug`, `P3`, `S4-spec-review`, полный трек). Этап — ревью ТЗ, второй
заход (r1 был жёлтым с единственной Medium-находкой M1). Предмет этого раунда —
**дельта тела issue между материалом r1 и текущим состоянием**, а не задача
целиком (PROCESS.md §2.10, issue #214).
ТЗ живёт в теле issue, раздел `## ТЗ` (#517); файл в `docs/specs/` не создаётся.
## Материал и дельта
Материал r1 (из блока «Материал раунда» документа `docs/reviews/SPEC-REVIEW-561-r1.md`,
коммит `d527ff8d`, уже в `dev`):
- Ветка/дерево: `dev` на `b26d9694025e`.
- Тело issue на момент r1: `sha256` `5c619c9775f834a6607d8623a303f1ba412d1f0cf9c4f4fa8b0e2fcf50cef47b`.
- Вердикт r1: жёлтый, High 0, Medium 1 (M1).
Тело issue в GitHub правится редактированием, а не коммитом, поэтому «SHA не
резолвится» здесь неприменимо — дельта взята напрямую через историю правок
контента (`userContentEdits` GraphQL issue #561): ровно одна правка тела после
вердикта r1, `editedAt: 2026-09-12T22:48:15Z` (вердикт r1 опубликован
`22:46:56Z`, правка тела после публикации). Правка, которую рецензировал r1,
сделана раньше, в `22:38:44Z`, и совпадает по содержанию с материалом,
описанным в документе r1 (тот же текст `## ТЗ`, без слов touch/kiosk).
Дословный дифф (нормализация CRLF→LF, иных отличий нет):
```diff
2. Полная перезагрузка страницы, возврат на тот же route, технический remount и адаптивный переход между разным числом Masonry-колонок без редактирования dashboard сохраняют настройку именно своей карточки.
+
+**Touch/kiosk:** в основном поддерживаемом kiosk-сценарии поворот сенсорного устройства и смена orientation могут пересобрать Masonry и изменить число колонок, но не переносят local show/scale между карточками. Существующие touch-жесты, hit targets и kiosk-controls не меняются. Полный remount после ротации доказывает AC1, живой responsive reflow/remount — AC3.
3. Редактирование порядка или структуры dashboard может изменить логическую identity. ...
```
Ничего больше не изменилось: разделы 1, 3–8, все AC1–AC8, контракт identity,
риски, откат, принятые предположения — байт в байт как на r1. Дельта локальна
(одна вставленная во 2-й раздел двухпредложная ремарка), не ребейз, не смена
контракта поведения, не новая подсистема — полный повторный разбор не требуется
(§2.10).
## Как проверялось
- Получено тело issue #561 (`gh issue view 561 --json body,labels,comments`) и
сверено через `gh api graphql` (`userContentEdits`) с версией, которую видел
r1, — построчный диф выше.
- Прочитан документ r1 (`docs/reviews/SPEC-REVIEW-561-r1.md`, коммит `d527ff8d`)
целиком, включая находку M1 и блок «Материал раунда».
- Проверено соответствие добавленного текста `docs/TOUCH-SUPPORT.md`: строка 21
(`Kiosk | Supported | Primary supported environment`), строка 44 (сводная
панель обязана «remain usable after backgrounding, resize, orientation
changes and warm remount»), строки 48–49 (сводная панель — поддерживаемая
View-поверхность). Утверждение ТЗ «полный remount после ротации доказывает
AC1, живой reflow/remount — AC3» согласуется буквально с формулировками AC1
(«full reload и rebalancing») и AC3 («живой reflow и remount») из раздела 4
ТЗ, которые дельта не трогала.
- Проверено, что вставка не задевает нумерацию/содержание AC1–AC8 (раздел 4
ТЗ), контракт identity (раздел 3) и решение Q1 (раздел 2 п.5) — они лежат вне
диффа, дословно совпадают с материалом r1.
- Проверено состояние репозитория: код не тронут (`git log --all --oneline |
grep 561` — только доc-коммит `d527ff8d` с документом r1; ветки
`issue/561-*` нет), что соответствует стадии `S4-spec-review` и прямому
указанию в теле issue «код пока не менять».
- Кода/гейтов не запускал — на этапе ревью ТЗ реализации ещё нет, проверять
нечего (как и в r1).
## Закрытие раунда r1
| Находка | Чем закрыта | Где это видно |
|---|---|---|
| **M1** — ТЗ не называет touch/kiosk-влияние (обязательный блокирующий пункт DoR §2.5) | В раздел 2 ТЗ после п.2 вставлено явное `**Touch/kiosk:** …`, называющее сценарий (поворот устройства, пересборка колонок), гарантию (`show/scale` не переезжают между карточками), что не меняется (жесты/hit targets/kiosk-controls), и АС-доказательства (AC1 — full remount, AC3 — живой reflow) | Тело issue #561, раздел `## ТЗ` → `### 2. Пользовательский контракт`, абзац `Touch/kiosk:` между пп. 2 и 3; правка `userContentEdits` `editedAt=2026-09-12T22:48:15Z` |
| L1 (низкая, снята ещё в r1 с записью) | Не тронуто в этом раунде — решение r1 остаётся в силе, повторно не проверялось | `docs/reviews/SPEC-REVIEW-561-r1.md`, раздел «Low» |
## Унаследовано из r1
Без повторной проверки в этом раунде принято всё, чего дельта не касается —
документ `docs/reviews/SPEC-REVIEW-561-r1.md`, материал `dev@b26d9694025e`,
тело issue `sha256=5c619c97…ef47b`:
- Риск подтверждён по реальным ссылкам на исходники HA `20260729.7`
(`hui-view.ts`, `hui-masonry-view.ts`) — не голословное заявление.
- Контракт раздела 3 (canonical Masonry identity: composed ancestor chain,
`masonry.cards`, versioned slot, nested suffix, fail-closed unresolved,
fallback для не-Masonry hosts) прослежен к существующему
`src/summary-panel-identity.ts`, который он заменяет.
- Q1 решён предсказуемо и зафиксирован в разделе 2 п.5 (нет миграции старых
DOM-path ключей, обычные defaults + legacy scale seed).
- Все AC1–AC8 проверяемы, каждый называет способ доказательства; AC7 закладывает
именованный mutation witness уже на этапе спецификации.
- Скоуп не размыт: явно исключены новый `card_id`, серверная миграция, перенос
после ручного reorder, расширение на Sections/unknown wrappers.
- Откат и release-артефакты названы (раздел 7, раздел 5); i18n и серверная
совместимость явно «без изменений» (раздел 6), включая частную проверку r1,
что `summary.storage_unavailable` можно переиспользовать для AC4 без нового
ключа.
- Полный трек обоснован явно названным нарушенным критерием `small`
(сложность/риск 5/10 в комментарии аналитики).
- L1 (оформление порядка подразделов) снята с записью в r1, не переоткрывается.
## Находки
Нет. High: 0, Medium: 0 (M1 закрыта дельтой, ничего нового не привнесено), Low:
0 новых сверх уже снятой в r1 L1.
## Что проверено и корректно
- Дельта — ровно одна вставка, точно закрывающая M1 по существу и по форме,
которую просил r1 («одно-два предложения `Touch/kiosk:` с указанием AC»).
- Формулировка не противоречит `docs/TOUCH-SUPPORT.md` и не вводит новый,
ранее не описанный touch-контракт — она лишь называет словами то, что уже
проектировали AC1/AC3.
- Ни один AC, ни контракт раздела 3, ни решение Q1 дельтой не задеты — их
повторная проверка не требовалась по правилу «только то, что задевает
дельта» (§2.10 п.4), и я это подтвердил построчным диффом, а не поверил на
слово.
- Код продукта не менялся — соответствует стадии и прямому указанию issue.
- DoR-чек-лист (§2.5) теперь закрыт полностью: ТЗ есть, AC1–AC8 пронумерованы
с доказательствами, файлы/модули названы, i18n «без изменений» обосновано,
compatibility/Q1 решены, touch/kiosk теперь назван явно, откат и
release-артефакты названы, открытых продуктовых вопросов нет.
## Чего не проверял
- Не запускал `typecheck`/`test`/`build`/mutation-gate — кода нет, ревью ТЗ
этого не требует (как и в r1).
- Не проверял заново #493/#552 на дублирование — унаследовано из r1 без
повторной сверки, так как дельта их не касается.
- Не проверял живое поведение `hui-masonry-view` в реальном HA — унаследовано
из r1, который сверился с исходниками `20260729.7` по ссылкам с номерами
строк.
- Косметический эффект вставки на markdown-нумерацию (пункт 2 и «3.» после
невставленного в список абзаца формируют технически два `<ol>`, GitHub
рендерит второй с `start="3"`, визуально номерация не рвётся) — не
находка: чисто визуальный вопрос без влияния на смысл или на AC, тот же
класс, что снятая в r1 L1.
## Вывод
Единственная блокировавшая переход находка r1 (M1) закрыта точной, локальной
правкой тела issue; ничего другого не изменилось и не сломалось. Открытых
находок нет. Вердикт — зелёный, бюджет циклов не тратится (§4, #227): ревью
ТЗ выполнено, `## ТЗ` готово к переходу в `S5-ready`.
---
<!-- material-anchors: сгенерировано конвейером (#414) -->
## Материал раунда
- Ветка: `dev`, коммит `d527ff8dcc8b` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
- Дерево материала: `c1255d61460377be66b85a7b06252621b0149854`
```
git log --all --format='%H %T' | grep c1255d614603
```
- Тело issue: `9543698e33142ca2ceb66d906e271f5158a010ed8bfb00e873019519e5743970`
- Вердикт конвейера: `green` · High 0