Files
houseplan-card/docs/reviews/SPEC-REVIEW-463-r2.md
T
2026-09-05 14:38:15 +00:00

72 lines
12 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-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 и «Контракт». ТЗ готово к переходу на код-ревью.
---
<!-- material-anchors: сгенерировано конвейером (#414) -->
## Материал раунда
- Ветка: `dev`, коммит `` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
- Якоря снять не удалось: ветки задачи нет, материал читался по `dev`.