# SPEC-REVIEW-463-r2 **Issue:** #463 — «Нативные диалоги прижимаются к краю и теряют модальность после переподключения» **Этап:** ТЗ на ревью (S4-spec-review), лёгкий трек (`small`) **Заход:** r2 · блокирующих циклов израсходовано 1 из 2 (лимит лёгкого трека — 2) **Материал:** тело issue #463 на момент ревью (канонический блок «ТЗ лёгкого трека») + правка-комментарий владельца от 2026-09-05T14:33:32Z, описывающий внесённые исправления после r1 + `src/hp-dialog.ts`, `docs/ARCHITECTURE.md`, `demo/golden/matrix.mjs`, `docs/CHANGELOG*.md` на `HEAD=f6956fa4` (dev, без изменений с r1 — задача ещё не реализована). Код продукта не менялся между r1 и r2 (задача в стадии ТЗ, `src/hp-dialog.ts` не тронут). Дельта раунда — правка текста issue после красного вердикта r1 (комментарий `2026-09-05T14:33:32Z`). ## SHA предыдущего раунда Вердикт r1 (красный, `docs/reviews/SPEC-REVIEW-463-r1.md`) не называл явный SHA основного материала issue (у текста issue нет коммитов/SHA — только правка через комментарий и редактирование тела). SHA сопутствующего кода в r1 был назван: `HEAD=fc0c6166`. Между `fc0c6166` и текущим `f6956fa4` в диапазон входит только сам коммит публикации `docs/reviews/SPEC-REVIEW-463-r1.md` (`f6956fa4`) — код, ARCHITECTURE.md, PROCESS.md, AGENTS.md, SCOPE.md не менялись (`git log fc0c6166..HEAD -- PROCESS.md AGENTS.md docs/SCOPE.md` — пусто). Дельта этого раунда полностью локальна к тексту issue. ## Объявление дельты Дельта — редактирование тела issue после r1, зафиксированное комментарием владельца: > «условная оговорка о golden удалена; зафиксированы обязательная приёмка полного фактического inventory (сейчас 29 dialog-сцен) и 4 docs-кадров; backdrop уточнён как видимый scrim с alpha > 0. Дополнительно исправлены пути changelog, уточнён ARCHITECTURE-контракт и заголовок issue». Пять точек правки: раздел «Release-артефакты» (golden-оговорка), формулировка AC1 (backdrop), пути changelog в «Затронутые поверхности», строка ARCHITECTURE.md в «Затронутые поверхности», заголовок issue. Раздел «Контракт» (пп. 1–6), AC2–AC6, «Не входит», «Совместимость, touch и производительность», «Откат» дельту не задевают — наследуются из r1 без повторной проверки. ## Как проверялось - Прочитано текущее тело issue #463 целиком (канонический блок ТЗ) и комментарий от `2026-09-05T14:33:32Z`. - Сверено дословно: старая формулировка golden-оговорки, процитированная в `docs/reviews/SPEC-REVIEW-463-r1.md` («Новый golden не обязателен, если восстановленный вид побайтово совпадает с действующими эталонами...») — в текущем теле отсутствует; на её месте — безусловное «Golden обязателен» с требованием пересъёмки полного inventory и явной приёмки изменившихся кадров. - Сверена старая формулировка AC1 («backdrop непрозрачен», отмеченная Low в r1) — заменена на «вычисленный backdrop виден (alpha > 0)», дословно совпадает с рекомендацией r1. - `grep -c "dialog: '" demo/golden/matrix.mjs` → 29 — совпадает с заявленным в ТЗ «matrix содержит 29 scenario.dialog»; не голословная оценка, а проверяемое число. - Прочитан `docs/ARCHITECTURE.md` (пункт 5 «One modal contract», строки 127–130): текущее описание «delegates surface semantics... falls back to native ``» действительно не упоминает самовосстановление модальности и ветвление по факту DOM — заявленное в ТЗ «уточнение уже неточного описания» соответствует реальному состоянию документа, не выдумка. - Проверены пути `docs/CHANGELOG.md`, `docs/CHANGELOG.ru.md` (`ls`/`Glob`) — оба существуют, названы верно. - Заголовок issue («Нативные диалоги прижимаются к краю и теряют модальность после переподключения») не приписывает `alert`-диалогу немодальность — согласуется с воспроизведением («конкретный hp-confirm уже open и :modal»), исходная неточность заголовка, отмеченная владельцем, устранена. - Перепроверены на взаимное непротиворечие только задетые дельтой разделы: AC1 (backdrop) и «Release-артефакты» (golden) — не создают новых противоречий с AC2–AC6 и «Контрактом», которые их не упоминают. - Гейтов кода нет: стадия ТЗ, продуктовый код не менялся ни в этом раунде, ни между раундами. ## Находки Нет. Обе находки r1 (High и Low) закрыты правкой текста; новых находок в дельте не обнаружено. ## Закрытие раунда r1 | Находка r1 | Чем закрыта | Где это видно | |---|---|---| | **High** — раздел «Release-артефакты» ложно утверждал, что golden не обязателен при «побайтовом совпадении», хотя все сцены с диалогом рендерятся нативной веткой и уже показывают дефект | Оговорка удалена; текст теперь безусловно требует пересъёмки и приёмки golden для всех dialog-сцен | Тело issue, «Release-артефакты»: «Golden обязателен. На момент ТЗ matrix содержит 29 scenario.dialog... После реализации переснимается фактический полный inventory dialog-сцен; принимается явный список только после визуального просмотра каждого изменившегося кадра. Допустимая дельта — центрирование и связанный scrim; любое иное расхождение блокирует приёмку.» | | **Low** — AC1 «backdrop непрозрачен» буквально конфликтует с действующим `rgb(0 0 0 / 0.45)` | Формулировка заменена на «виден (alpha > 0)», дословно как рекомендовано в r1 | Тело issue, AC1: «...а вычисленный backdrop виден (alpha > 0)» | ## Унаследовано из r1 Без повторной проверки в этом раунде принято на основании `docs/reviews/SPEC-REVIEW-463-r1.md` (материал на `HEAD=fc0c6166`, код с тех пор не менялся): - Продуктовая рамка и скоуп: задача — багфикс общего modal-контракта `hp-dialog` (используется в 31 месте), не новая функциональность; конфликта с `docs/SCOPE.md` нет (предпосылка к J3/J4/J6, восстанавливает уже описанный контракт). - Техническая база контракта (два независимых дефекта — geometry native outer dialog и потеря `:modal` после detach/reattach) согласуется с прочитанным `src/hp-dialog.ts`: единичный вызов `showModal()` в `firstUpdated()`, отсутствие повторной проверки при апдейтах/переподключении. - AC2–AC6 сформулированы как проверяемые критерии с мутационными свидетелями там, где нужно; пограничный случай п.5 контракта (уже открытый native-fallback экземпляр не пересоздаётся при поздней регистрации `ha-dialog`) — приемлемое решение, не требует эскалации владельцу. - «Не входит», «Откат», «Совместимость, touch и производительность» — присутствуют, согласованы с фактическим состоянием, замечаний нет. - Дублирования с существующим `demo/smoke_danger_confirm_branches.mjs` нет — этот смок не проверяет геометрию/`:modal`/`::backdrop`. ## Чего не проверял - Не проверял docs-capture раздел («4 из 10 кадров... space-create, device-editor, device-display-preview, device-info») отдельно в этом раунде — не упомянут в комментарии о правках, дельта его не касалась; не нашёл в нём противоречий при чтении, но отдельно не пересчитывал состав 10 кадров. - Не запускал `typecheck`/`test`/`build`/`golden:verify`/инварианты — кода нет, стадия ТЗ, гейты неприменимы (как и в r1). - Не проверял поведение реального Home Assistant frontend — вне материала ревью ТЗ. ## Вердикт Зелёный. Обе находки r1 закрыты точными правками текста, дельта не создала новых противоречий и не задела ранее принятые AC2–AC6 и «Контракт». ТЗ готово к переходу на код-ревью. --- ## Материал раунда - Ветка: `dev`, коммит `` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. - Якоря снять не удалось: ветки задачи нет, материал читался по `dev`.