# 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.» после невставленного в список абзаца формируют технически два `
    `, GitHub рендерит второй с `start="3"`, визуально номерация не рвётся) — не находка: чисто визуальный вопрос без влияния на смысл или на AC, тот же класс, что снятая в r1 L1. ## Вывод Единственная блокировавшая переход находка r1 (M1) закрыта точной, локальной правкой тела issue; ничего другого не изменилось и не сломалось. Открытых находок нет. Вердикт — зелёный, бюджет циклов не тратится (§4, #227): ревью ТЗ выполнено, `## ТЗ` готово к переходу в `S5-ready`. --- ## Материал раунда - Ветка: `dev`, коммит `d527ff8dcc8b` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. - Дерево материала: `c1255d61460377be66b85a7b06252621b0149854` ``` git log --all --format='%H %T' | grep c1255d614603 ``` - Тело issue: `9543698e33142ca2ceb66d906e271f5158a010ed8bfb00e873019519e5743970` - Вердикт конвейера: `green` · High 0