12 KiB
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<dialog>» действительно не упоминает самовосстановление модальности и ветвление по факту 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.