mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-30 11:49:16 +00:00
@@ -0,0 +1,158 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user