mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-06 22:49:16 +00:00
@@ -0,0 +1,160 @@
|
||||
# SPEC-REVIEW-544-r1
|
||||
|
||||
Issue: #544 · Этап: spec (PROCESS.md §2.4) · Заход: r1 · блокирующих циклов 0/4
|
||||
|
||||
Материал: тело issue #544, раздел `## ТЗ`, на момент ревью. Метка `S4-spec-review`,
|
||||
предыдущих раундов ревью в комментариях issue нет — это первый заход, полный
|
||||
разбор без раздела «Унаследовано».
|
||||
|
||||
Продуктовая постановка (`## Пользовательский дефект` … `## Требуемый результат`)
|
||||
и `## ТЗ` — один документ одной задачи; расхождений между ними нет, ТЗ прямо
|
||||
ссылается на тот же механизм и тот же браузерный свидетель (45 396 px).
|
||||
|
||||
## Скоуп ревью
|
||||
|
||||
Проверялось: полнота обязательных разделов §7.1, однозначность и доказуемость
|
||||
каждого AC, соответствие продуктовой рамке `docs/SCOPE.md` (J1/J3), соответствие
|
||||
`docs/TOUCH-SUPPORT.md` (View pan/pinch — release-blocking гарантия) и
|
||||
`docs/CANVAS.md` §5 (модель камеры/pan не меняется), фактическая проверка
|
||||
технических утверждений ТЗ по коду на точном SHA `66a6485418c7663d749642c8c5740c95d3c9f490`
|
||||
(рабочая копия репозитория стоит на этом коммите — сверено `git rev-parse HEAD`).
|
||||
|
||||
Продуктовых вопросов к владельцу нет (сценарий и видимое поведение зафиксированы
|
||||
однозначно); открытых технических вопросов нет — все нетривиальные решения
|
||||
оформлены явным блоком «Принятые технические предположения — можно менять на
|
||||
ревью» и разобраны ниже.
|
||||
|
||||
## Как проверялось
|
||||
|
||||
Это первый заход, поэтому разбор полный, а не по дельте.
|
||||
|
||||
1. Прочитаны `docs/SCOPE.md`, `AGENTS.md`, `PROCESS.md` §2.4/§2.9/§7.1/§7.2/§4.
|
||||
2. Прочитано тело issue #544 целиком и единственный комментарий (S2-аналитика,
|
||||
`origin/dev` `66a64854`, трек — полный, `small` не выполнен по performance и
|
||||
touch-контракту).
|
||||
3. Прочитаны `docs/TOUCH-SUPPORT.md` (пункт «support convenient pan, pinch zoom
|
||||
and space switching» в разделе release-blocking гарантий) и `docs/CANVAS.md`
|
||||
§5 (Zoom and pan — «Pinch and pan remain direct 1:1 gestures», модель pan не
|
||||
входит в скоуп задачи и в не-скоупе прямо исключена).
|
||||
4. Прочитан `docs/ARCHITECTURE.md`, раздел «Live viewport: a transform per
|
||||
frame, a `viewBox` on a budget (#531, 2026-09-11)» — канонический текст
|
||||
подсистемы, которую трогает задача.
|
||||
5. Прочитан текущий код на точном SHA, названном в issue, и сверен построчно с
|
||||
техническими утверждениями ТЗ (детали — в разделе «Находки» и «Проверено»).
|
||||
6. Прочитаны файлы, которые ТЗ называет доказательной базой: `test/live-viewport.test.mjs`,
|
||||
наличие `demo/smoke_live_pan_viewbox.mjs` и `scripts/mutation-gate.mjs` с
|
||||
существующими мутантами на `live-viewport.ts`.
|
||||
|
||||
Гейты (typecheck/test/build/golden) на этом этапе не прогонялись и не нужны:
|
||||
этап — ревью ТЗ, продуктового кода ещё нет; предмет проверки — текст, а не
|
||||
бинарник.
|
||||
|
||||
## Находки
|
||||
|
||||
Ни одной High или Medium находки. Ниже — то, что специально проверялось и не
|
||||
подтвердилось как дефект, для прозрачности разбора.
|
||||
|
||||
- **Проверено и не является находкой: покрытие К3 для декоративных iso-слоёв.**
|
||||
`.iso-underlay-svg`, `.iso-shadows-svg`, `.iso-walls-svg`, `.iso-overlays-svg`
|
||||
уже имеют постоянный `overflow: visible` в `src/styles/plan.styles.ts:255-261`
|
||||
— то есть контракт К3, применённый к ним по общему селектору
|
||||
`[data-hp-live-viewbox]`, окажется для них no-op (временная запись/снятие
|
||||
одного и того же эффективного значения). Это не расходится с К2 («осевший DOM
|
||||
остаётся тем же, что до задачи») и не создаёт двойной работы для ревьюера
|
||||
кода: единственные SVG, которые реально нуждаются в исправлении — безымянный
|
||||
flat/floor SVG (`data-hp-live-viewbox="floor"`, без класса, `houseplan-card.ts:11513`)
|
||||
и iso-камера (`class="plan-svg"`, `data-hp-live-viewbox="camera"`, та же
|
||||
строка) — оба без явного `overflow`, то есть с вычисленным `hidden` по
|
||||
умолчанию для corner SVG. Формулировка К3 «и другим целым сценовым SVG»
|
||||
достаточна именно потому, что механизм в `paintLiveViewport` уже сейчас
|
||||
обходит оба атрибута общим `querySelectorAll`, без адресного перечисления —
|
||||
разработчику естественно расширить тот же общий селектор, а не подбирать
|
||||
список вручную.
|
||||
- **Проверено и не является находкой: `vactrail`/`radar-ranges`.** Эти два
|
||||
корневых SVG тоже несут `data-hp-live-viewbox="camera"`
|
||||
(`houseplan-card.ts:12412`, `radar-render.ts:46`), но уже имеют постоянный
|
||||
`overflow: visible` (`devices.styles.ts:555-562`, `plan.styles.ts:1460-1467`)
|
||||
— они не входят в число реально затронутых SVG и не требуют отдельного
|
||||
упоминания в не-скоупе; попадание под общий селектор для них так же
|
||||
безопасно, как и для iso-слоёв выше.
|
||||
- **Проверено и не является находкой: механизм задачи.** Три ключевых
|
||||
технических утверждения ТЗ сверены построчно с кодом на названном SHA и
|
||||
подтвердились: (а) `needsViewBoxRefresh` в `src/live-viewport.ts:93-103`
|
||||
проверяет только `now - anchor.at`, вызывается исключительно из
|
||||
`scheduleHouseplanViewport`, которую planner вызывает только в ответ на
|
||||
реальные события камеры (`_pan`/`_zoomAt`/колесо/жест —
|
||||
`houseplan-card.ts:6462,6662,6951`), и никакой таймер не запускает
|
||||
перерисовку сам по себе — значит held-дефект действительно может жить дольше
|
||||
100 мс, как заявлено в «Механизм»; (б) `setViewBox`/`setLayerProjection`
|
||||
пишут DOM только на изменение строки, что соответствует заявлению AC1/AC5 о
|
||||
«нет повторных записей на неизменный кадр»; (в) `docs/ARCHITECTURE.md`
|
||||
описывает тот же бюджет (100 мс / 15 %) и тот же композиторный transform без
|
||||
расхождений с ТЗ.
|
||||
- **Проверено и не является находкой: fake-DOM тесты.** Ссылка ТЗ на
|
||||
`test/live-viewport.test.mjs#L35` (строки/атрибуты, не пиксели) точна —
|
||||
прочитан целиком фрагмент `fakeRoot`, он оперирует строковыми `style`/`attrs`,
|
||||
подтверждая заявленный пробел в текущем оракуле.
|
||||
|
||||
## Проверка обязательных разделов (PROCESS.md §7.1)
|
||||
|
||||
Все обязательные разделы на месте: сценарий · что человек увидит до/после ·
|
||||
проблема · скоуп и не-скоуп · контракт поведения (К1–К6) · UX · модель данных и
|
||||
миграция (нет) · i18n (нет) · критерии приёмки AC1–AC7 с доказательством
|
||||
(`unit`/`smoke`/`mutation`/`gates`) · план автотестов · риски · откат ·
|
||||
release-артефакты. Плюс необязательные, но полезные разделы: затронутые файлы,
|
||||
производительность/бюджеты, «принятые технические предположения».
|
||||
|
||||
- **Сценарий/видимое поведение** — обе фразы персона-центричны (домочадец на
|
||||
touch, admin на desktop), не используют терминов реализации («промежуточный
|
||||
кадр» и «камера» — уже канонические термины подсистемы по `CANVAS.md`, не
|
||||
изобретены задачей).
|
||||
- **AC однозначны и проверяемы.** Каждый AC называет способ доказательства и,
|
||||
где применимо, отрицательного свидетеля (AC1, AC2, AC5, AC6), как того
|
||||
требует §7.1/§2.5. AC2 отдельно требует красного текущего `origin/dev` хотя
|
||||
бы по одному направлению — это то самое условие «тест умеет падать» будущего
|
||||
код-ревью, зафиксированное уже в самом ТЗ.
|
||||
- **Скоуп/не-скоуп** согласован с `SCOPE.md` (J1/J3, touch — гарантированная
|
||||
поверхность View по `TOUCH-SUPPORT.md`) и не расширяет задачу: явно исключены
|
||||
новая камера-модель, изменение бюджета #531, новые настройки/лейблы, точный
|
||||
touch для редакторов.
|
||||
- **Технические предположения** оформлены отдельным блоком «можно менять на
|
||||
ревью» с обоснованием (диагностический эксперимент 45 396 → 0 px) — это
|
||||
ровно то разделение «продуктовое решает владелец, техническое — авторы»,
|
||||
которое требует §7.1. Открытых продуктовых вопросов, замаскированных под
|
||||
технические, не найдено.
|
||||
- **Риски** называют именно те места, где предположение может не сработать
|
||||
(риск 1 — постоянный `overflow:visible` меняет osевший raster; риск 3 — iso
|
||||
camera/floor не сливать в одну проекцию) — это честные, не декоративные
|
||||
риски.
|
||||
|
||||
## Что не проверялось и почему
|
||||
|
||||
- Гейты `typecheck`/`test`/`build`/`golden` — не прогонялись: продуктового кода
|
||||
ещё нет, предмет этапа — текст ТЗ, а не бинарник.
|
||||
- Реализация мутанта AC6 и содержимое будущего `demo/smoke_live_pan_coverage.mjs`
|
||||
— не существуют на этом этапе, поэтому не проверялись; их проверит код-ревью.
|
||||
- Ручного/физического touch-тестирования не проводилось и не требовалось —
|
||||
ТЗ прямо и корректно ограничивает это релизным гейтом, не доказательством
|
||||
этой ветки (К6).
|
||||
|
||||
## Вердикт
|
||||
|
||||
Зелёный. Спецификация полна, однозначна, каждый AC проверяем и снабжён
|
||||
доказательством и (где нужно) отрицательным свидетелем, технические
|
||||
утверждения о механизме дефекта подтверждены прямым чтением кода на названном
|
||||
SHA, а не приняты на веру. Продуктовых вопросов владельцу нет. Задача может
|
||||
переходить в «Готово к разработке».
|
||||
|
||||
---
|
||||
|
||||
<!-- material-anchors: сгенерировано конвейером (#414) -->
|
||||
|
||||
## Материал раунда
|
||||
|
||||
- Ветка: `dev`, коммит `66a6485418c7` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
|
||||
- Дерево материала: `0d80c47762ca4c2f97c5de2c705b8128788dd307`
|
||||
```
|
||||
git log --all --format='%H %T' | grep 0d80c47762ca
|
||||
```
|
||||
- Тело issue: `41fec2c0272d4aa14d3bd714f7664c58f874613196541c14f746ebca2572005d`
|
||||
- Вердикт конвейера: `green` · High 0
|
||||
Reference in New Issue
Block a user