Files
houseplan-card/docs/reviews/SPEC-REVIEW-471-r1.md
T
2026-09-06 11:23:51 +00:00

181 lines
14 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-471-r1
- **Issue:** https://github.com/Matysh/houseplan-card/issues/471
- **Этап:** ревью ТЗ (PROCESS.md §2.4)
- **Заход:** r1 · блокирующих циклов израсходовано 0 из 4 (лимит лёгкого трека
не применяется — задача идёт полным треком)
- **Артефакт ТЗ:** `docs/specs/471-isometric-overlay-white-plates.md`,
коммит `5dbcbb81ef24f729f0febd2b836a46196faaf861` на ветке
`issue/471-isometric-overlay-plates` (docs-only, класс C)
- **Вердикт:** зелёный
## Скоуп ревью
Первый заход ревью ТЗ. Разбор полный (не по дельте — предыдущего раунда нет).
Проверялось:
1. Соответствие `docs/SCOPE.md` — задача внутри уже утверждённого исключения
`#89` (2.5D presentation скрытого изометрического режима) и не расширяет
его; никакой новой функциональности, только визуальный откат декоративного
элемента.
2. Правильность классификации трека — файл ТЗ существует (задача не `small`),
что подтверждено и собственным комментарием владельца в issue
(`лёгкий трек: нет — меняется принятый UX-контракт #160`).
3. Полнота обязательных разделов §7.1.
4. Однозначность и доказуемость каждого AC (AC1…AC8), в т.ч. наличие метода
доказательства у каждого.
5. Не выдана ли догадка за факт — все технические утверждения о текущем
поведении сверены с реальным кодом и документами, а не приняты на слово
автора.
6. Отсутствие продуктовых вопросов, которые следовало задать владельцу, но
вместо этого решены технически.
## Как проверялось
Читал только — правки в код и ТЗ не вносил (роль ревьюера ТЗ).
- Прочитаны `docs/SCOPE.md`, `AGENTS.md`, `PROCESS.md` полностью.
- Прочитано тело issue #471 и оба комментария (оценка владельца, занятие
автором).
- Прочитан файл ТЗ `docs/specs/471-isometric-overlay-white-plates.md`
целиком (395 строк).
- Технические утверждения ТЗ сверены построчно с исходным кодом:
- `src/iso-scene-render.ts` — существование и сигнатуры
`ISO_RAISED_FOOTPRINT`, `isoRaisedOverlayHalfSize()`; ветки для
`device` / `room-label` / `opening-lock`; точные числа
`roomMetricTextCharacters` (`temperature: 10, humidity: 8, lqi: 6,
light: 24`) — совпадают с текстом issue дословно.
- `src/iso-overlays.ts` — наличие `resolveIsoOverlayPlacement()`.
- `src/styles/plan.styles.ts` — точное значение заливки
`.iso-overlay-plate { fill: rgba(248, 249, 247, 0.9) }` (свет),
`rgba(68, 77, 81, 0.92)` (тёмная тема), forced-colors ветка с
`fill: Canvas`, `.iso-overlay-plate-texture`.
- `test/isometric-contract.test.mjs` — текущие assert на
`class="iso-overlay-plate ..."`, на dark/forced-colors CSS-правила —
подтверждают, что контракт сегодня действительно требует видимый
polygon, как и заявляет ТЗ (AC2 будет требовать обратного).
- `demo/golden/baselines/isometric-stage3-overlays-{light,dark}.png` —
файлы существуют.
- `docs/ISOMETRIC.md` (4 упоминания `plate`/`footprint`),
`docs/adr/160-isometric-stage3-overlays.md` (raised plate описан как
видимая floor-parallel поверхность), `docs/ARCHITECTURE.md` (строки
719–726, «raised plate corners», «floor-parallel SVG plate») — все три
документа сегодня действительно описывают plate как видимую
поверхность, значит их обновление в скоупе задачи обосновано, а не
придумано.
- `docs/STATUS.md` — подтверждено, что Stage 3 (#160) сейчас
«hidden … without public enablement or changelog entry», что
оправдывает `User-Visible: no` в §17 ТЗ по аналогии с исходным
коммитом `ee7d4869` (`feat: implement isometric stage 3`, тоже
`User-Visible: no`).
- `docs/TESTING.md` — упоминания слова «plate» в этом файле относятся к
не связанной подсистеме (working-state plate иконки устройства), не к
isometric raised overlay; ТЗ корректно ограничивает правку `TESTING.md`
фразой «только в части действующего Stage 3».
- `src/iso-scene-render.ts:1130` — `hp-iso-overlay-texture` паттерн
привязан к `root === 'overlays'` и используется отдельно от wall/floor
material nuance — подтверждает, что удаление overlay-текстуры (W6) не
затрагивает материалы стен/пола, как и заявлено в §8 ТЗ.
- Файлы, перечисленные в §16 «Ожидаемые файлы реализации», проверены на
существование: `test/iso-overlays.test.mjs`, `test/iso-scene-render.test.mjs`,
`test/isometric-contract.test.mjs`, `demo/smoke_isometric_contract.mjs`,
`demo/smoke_isometric_live_touch.mjs`, `docs/specs/160-isometric-stage3.md`,
`docs/adr/160-isometric-stage3-overlays.md` — все существуют.
Гейты (typecheck/test/build) не гонялись: изменение этого раунда — только
docs (класс C), продуктовый код не тронут, гейты кода к ревью ТЗ не
относятся.
## Находки
Нет High. Нет Medium. Одна Low-находка, снимается ревьюером без возврата
автору.
- **Low — отсутствует буквальный раздел «Проблема» (§7.1).** ТЗ переходит от
§2 «Что человек увидит до/после» сразу к §3 «Подтверждённая причина и
заменяемый контракт», не давая отдельного заголовка «Проблема». Содержательно
проблема полностью раскрыта — в issue (детальное «Проблема» и
«Воспроизведение») и в §1–§3 ТЗ (сценарий, видимый эффект, причина). Снимаю
без правки: дублировать содержание issue под отдельным заголовком добавило
бы только повторение, не новую информацию.
## Что проверено и признано корректным
- **Полнота §7.1.** Все обязательные разделы присутствуют по содержанию:
сценарий (§1), видимый эффект до/после (§2), проблема/причина (§3),
скоуп/не-скоуп (§5, §6), контракт поведения (§4, §7, §8), UX (§10), модель
данных и миграция (§11), i18n (§11, «новых строк нет»), AC1…AC8 с методом
доказательства у каждого (§14), план автотестов (§15, плюс таблица red
witness — избыточно хорошо для этапа ТЗ), риски (§18), откат (§19),
release-артефакты (§17).
- **Ни одной догадки, выданной за факт.** Каждое утверждение о текущем
поведении кода и документов, которое я выборочно перепроверил, подтвердилось
дословно (см. «Как проверялось»). Технические предположения на будущее
корректно вынесены в явный блок §20 «Принятые технические предположения —
можно менять на ревью» и не маскируются под решённые факты.
- **Продуктовых вопросов, скрытых как технические, не найдено.** §20.3
(fit/home сохраняет прежний envelope) на первый взгляд похож на продуктовый
вопрос о видимом framing, но по факту фиксирует нулевое изменение уже
видимого поведения (защита от регресса, а не новое решение) и явно
откладывает возможное последующее уточнение framing в отдельную задачу —
корректно решать технически, эскалации не требовалось.
§20.4 и §20.5 не новые решения, а повтор того, что уже прямо сказано в
теле issue.
- **Классификация трека верна.** Файл ТЗ создан (не `small`), что совпадает и
с собственной оценкой владельца в issue-комментарии. Критерий, который
задача не проходит, назван явно («меняется принятый UX-контракт #160»),
как того требует AGENTS.md.
- **Согласованность с `docs/SCOPE.md`.** Работа не расширяет ранее одобренное
исключение #89 (2.5D presentation), а чинит визуальный дефект внутри него;
из категорий Out-of-scope ничего не затронуто.
- **AC доказуемы и не размыты.** Каждый из AC1–AC8 формулирует проверяемое
условие («нет .iso-overlay-plate в SVG», «anchors/nudge/tether совпадают
на fixtures до/после», «44×44 px сохраняется», и т.д.) и называет способ
доказательства (`unit`/`contract`/`smoke`/`golden`/`review`), как того
требует DoR (PROCESS.md §2.5).
- **Не-скоуп закрывает реальный риск расползания.** Явно исключены смежные и
правдоподобно соблазнительные правки — камера, footprint размеры,
редизайн typography/shell, альтернативная текстовая подложка вместо белой
plate (последнее прямо описано как «отдельное продуктовое решение»).
- **Откат и release-артефакты согласованы с прецедентом.** `User-Visible: no`
подтверждён тем же выбором в исходном коммите Stage 3 (`ee7d4869`) и
текущим статусом `docs/STATUS.md` («hidden … without public enablement»).
## Чего не проверял
- Не читал сам продуктовый код в объёме, достаточном для код-ревью
(`src/iso-overlays.ts` целиком, полную реализацию `render...` функций) —
это задача этапа код-ревью, а не ревью ТЗ; здесь код читался только
выборочно, чтобы верифицировать конкретные фактические утверждения ТЗ.
- Не гонял typecheck/test/build/golden — код ещё не менялся, гейты
неприменимы на этом этапе.
- Не проверял `docs/specs/160-isometric-stage3.md` и
`docs/adr/160-isometric-stage3-overlays.md` построчно целиком — только
выборочно, для подтверждения текущей терминологии «plate».
- Не оценивал визуально сам артефакт (белые прямоугольники) — ручного
тестирования на этапе ревью ТЗ нет, а сам артефакт не оспаривается: автор
и владелец (в оценке) уже согласны, что дефект существует и воспроизводим.
## Материал раунда
- Ветка: `issue/471-isometric-overlay-plates`
- SHA материала: `5dbcbb81ef24f729f0febd2b836a46196faaf861`
- ТЗ: `docs/specs/471-isometric-overlay-white-plates.md` (единственный
коммит на дельте к `dev`)
---
<!-- material-anchors: сгенерировано конвейером (#414) -->
## Материал раунда
- Ветка: `issue/471-isometric-overlay-plates`, коммит `5dbcbb81ef24` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
- Дерево материала: `3d667d66b10115b9300bca5ad1b406447aff97b0`
```
git log --all --format='%H %T' | grep 3d667d66b101
```
- ТЗ `docs/specs/471-isometric-overlay-white-plates.md`, блоб `1ef8a58c9af0140089c3e20a2ded7c72cfac7402`
```
git log --all --find-object=1ef8a58c9af0140089c3e20a2ded7c72cfac7402 -- docs/specs/471-isometric-overlay-white-plates.md
```