docs: review document for #654

Issue: #654
User-Visible: no
This commit is contained in:
claude[bot]
2026-09-26 05:29:35 +00:00
parent 6297af6701
commit 6d3738adef
2 changed files with 171 additions and 1 deletions
+2 -1
View File
@@ -1,10 +1,11 @@
# Индекс ревью
Генерируется `node scripts/reviews-index.mjs` (#635) — не редактировать руками. Документов: 1069, issue: 377. Вердикт: 🟢 зелёный · 🟡 жёлтый · 🔴 красный · ⚪ не распознан (свободная форма старых документов). H/M — число High/Medium по строке вердикта или заголовкам находок. Файлы — пути, названные в находках; ищите по имени файла: `grep form-kit INDEX.md`.
Генерируется `node scripts/reviews-index.mjs` (#635) — не редактировать руками. Документов: 1070, issue: 377. Вердикт: 🟢 зелёный · 🟡 жёлтый · 🔴 красный · ⚪ не распознан (свободная форма старых документов). H/M — число High/Medium по строке вердикта или заголовкам находок. Файлы — пути, названные в находках; ищите по имени файла: `grep form-kit INDEX.md`.
| Issue | Документ | Этап · раунд | Вердикт | H | M | Находки | Файлы |
|---|---|---|---|---:|---:|---|---|
| #654 | [SPEC-REVIEW-654-r1.md](SPEC-REVIEW-654-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | «Release-артефакты» не называют обновление docs/ISOMETRIC.md | `docs/ISOMETRIC.md` `docs/CHANGELOG.md` `docs/CHANGELOG.ru.md` `docs/reviews/INDEX.md` |
| #654 | [SPEC-REVIEW-654-r2.md](SPEC-REVIEW-654-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — |
| #651 | [SPEC-REVIEW-651-r1.md](SPEC-REVIEW-651-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | устаревшая формулировка «экспериментальный 2.5D-вид» противоречит текущему статусу функции | `CHANGELOG.md` `CHANGELOG.ru.md` `docs/ISOMETRIC.md` `docs/USER-GUIDE.ru.md` `docs/STATUS.md` `USER-GUIDE.ru.md` |
| #651 | [SPEC-REVIEW-651-r2.md](SPEC-REVIEW-651-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — |
| #651 | [CODE-REVIEW-651-r1.md](CODE-REVIEW-651-r1.md) | code · r1 | 🟡 жёлтый | 0 | 2 | AC1 «другая комната исключена» не доказан ни тестом, ни мутацией; AC4 «деградированный fallback группы» не доказан ни тестом, ни мутацией; неточная формулировка в комментарии к реализации (снято без правки) | `src/iso-overlays.ts` `test/iso-overlays.test.mjs` `scripts/mutation-registry.mjs` |
+169
View File
@@ -0,0 +1,169 @@
# SPEC-REVIEW-654-r2
**Issue:** [#654](https://github.com/Matysh/houseplan-card/issues/654) — «2.5D: цвет бумаги читается `getComputedStyle` в `render()` — на первом кадре все полы «тёмные»; вероятная вспышка Flat→2.5D при холодной загрузке дашборда»
**Этап:** spec (ревью ТЗ, PROCESS.md §2.4)
**Заход:** r2 · блокирующих циклов израсходовано (после этого вердикта): 1 из 4 (зелёный вердикт цикла не образует, PROCESS.md §4)
## Вердикт
**Зелёный.** High: 0 · Medium: 0 · Low: 0.
Единственная находка r1 (Medium, в скоупе — «Release-артефакты» не называли обновление
`docs/ISOMETRIC.md`) закрыта точечной правкой тела issue: в разделе
«Release-артефакты» добавлена строка, дословно фиксирующая новый инвариант
жизненного цикла из «Контракта поведения и UX» (первый кадр 2.5D скрыт
загрузочной поверхностью до готовности ленивого рантайма, включая kiosk;
terminal failure безопасно возвращает Flat). Делта раунда локальна — единственная
добавленная строка текста, ни один AC, ни один другой обязательный раздел
ТЗ не менялись; технические предпосылки и контракт поведения, проверенные в r1
построчно по `dev`, актуальны без изменений.
## Скоуп проверки (делта, PROCESS.md §2.10)
Раунд r2 — проверка по дельте, не с нуля: делта локальна (одна строка текста в
одном разделе, без ребейза, смены контракта или новой подсистемы), поэтому
разбор ограничен:
1. Тем, что делта закрывает ровно ту находку r1, которая её вызвала, и текст
закрытия точен, а не декларативен.
2. Тем, что делта не тронула ни один AC1–AC6 и ни один другой обязательный
раздел §7.1 — то есть выводы r1 по остальному ТЗ остаются в силе без
повторной построчной проверки кода.
3. Тем, что новая строка сама по себе не вводит новую неоднозначность,
недокументированный продуктовый вопрос или расхождение с
`docs/ISOMETRIC.md`/`docs/USER-GUIDE.ru.md`.
4. Тем, что материал раунда (тело issue, git-дерево `dev`) корректно
зафиксирован для следующего раунда/код-ревью.
## Как проверялось
- Тело issue #654 и его 4 комментария получены `gh issue view 654 --json
body,comments,labels,state` (MCP `mcp__github__get_issue`/`get_issue_comments`
недоступны без разрешения пользователя в этой сессии — эквивалентный путь к
тому же публичному API).
- Прочитан целиком документ предыдущего раунда `docs/reviews/SPEC-REVIEW-654-r1.md`
и его блок «Материал раунда» (тело issue `bd46753e…`, дерево `b4eeb2b0…`,
дерево-коммит `dev@803c0f0e`).
- Комментарий автора после r1 (`2026-09-26T05:23:38Z`): «Исправлен Medium r1: в
release-артефакты и затронутую документацию добавлен docs/ISOMETRIC.md с
контрактом pending-поверхности для обычного View/kiosk и Flat-fallback при
terminal failure» — сверен с фактическим текущим текстом раздела
«Release-артефакты» (см. «Закрытие раунда r1» ниже): строка присутствует
дословно так, как её описал автор, а не только заявлена в комментарии.
- Пересчитан sha256 нормализованного тела issue тем же алгоритмом, что использует
конвейер (`scripts/review-doc-guard.mjs` → `normalizeIssueBody`/`issueBodyDigest`:
`\r\n`→`\n`, обрезка хвостовых пробелов построчно, обрезка финальных пустых
строк, sha256 UTF-8): текущий хеш —
`d96095b1978fa9259b2fe1fa89ed256c0a292a59b2850e254cb56b8fb19a4ad1`, что отличается
от зафиксированного в r1 (`bd46753eac9a5a3b908addb0135b2054eea85c66f89eda4b4f8bdae8d80d78cd`) —
подтверждает, что тело действительно редактировалось между раундами, а не
просто переставлена метка.
- Проверен текущий `docs/ISOMETRIC.md` (`Activation`, строки 10–28) — контракт
«Activation» пока не описывает pending-поверхность (реализации ещё нет);
ТЗ корректно ставит его обновление в «Release-артефакты» как будущий коммит
реализации, а не как факт о сегодняшнем состоянии документа — расхождения нет.
- Проверен `docs/reviews/INDEX.md` на прецедент того же паттерна «находка r1 →
точечная правка → r2 зелёный»: #651 (r1 жёлтый Medium за терминологию
`docs/ISOMETRIC.md`/`USER-GUIDE.ru.md` → r2 зелёный) и #649 (аналогично) — тот
же класс находки на той же подсистеме закрывался тем же способом.
- Проверено через `gh api repos/Matysh/houseplan-card/issues/654/timeline`, что
никакой посторонней активности (доп. правок, вопросов, споров) между r1 и
комментарием о фиксе не было — только ожидаемая последовательность
`label(S4)→verdict→fix comment→label(S4)`.
- Рабочая копия — `git log -1`: `HEAD` = `6297af6701f990e0f067017f2a00107e4b85d8ec`
(«docs: review document for #654», это же коммит публикации документа r1),
дерево `968d87dd97df129defb9581ed5cdbb497bad896a`; это тот же `dev`, что был
проверен в r1 (`803c0f0e`) плюс сам коммит публикации r1-документа — код
продукта между раундами не менялся, ветка реализации не создана. Гейты §8
(`tsc`/`npm test`/`npm run build`/`check-docs`) не прогонялись: на этапе
`spec` предмет ревью — текст ТЗ, диффа исходного кода ещё нет.
## Закрытие раунда r1
| Находка r1 | Чем закрыта | Где это видно |
|---|---|---|
| Medium: «Release-артефакты» не называют обновление `docs/ISOMETRIC.md`, хотя контракт вводит новый инвариант первого кадра/kiosk-pending | В раздел «Release-артефакты» тела issue добавлена строка: «`docs/ISOMETRIC.md`: обновить раздел Activation — до готовности ленивого 2.5D-рантайма промежуточный Flat-план скрыт существующей загрузочной поверхностью, включая kiosk; terminal failure снимает ожидание и оставляет безопасный Flat-fallback» — дословно соответствует рекомендации r1 («план скрыт до готовности ленивого рантайма… это распространяется на kiosk, terminal failure безопасно возвращает Flat») | Тело issue #654, раздел `## ТЗ` → «Release-артефакты», вторая строка (проверено чтением текущего тела issue, не по заявлению автора) |
## Унаследовано из r1 (без повторной проверки)
Документ `docs/reviews/SPEC-REVIEW-654-r1.md`, материал — `dev@803c0f0eaab3aea1ea9a87215c35b638a679dafb`, тело issue `bd46753eac9a5a3b908addb0135b2054eea85c66f89eda4b4f8bdae8d80d78cd`:
- Обязательные разделы §7.1 присутствуют полностью (сценарий и видимое
изменение, проблема/причины, скоуп/не-скоуп, контракт поведения и UX, модель
данных/совместимость, i18n, AC1–AC6, план автотестов, риски, «принято
предположительно», откат, release-артефакты).
- Однозначность и доказуемость AC1–AC6, включая конкретный вид доказательства
(unit/AST/smoke) для каждого.
- Построчная сверка технических предпосылок ТЗ с `dev`: `getComputedStyle` в
`_renderBody()` (`src/houseplan-card.ts:10701`), `_effectiveProjection()`
(`:6002-6008`), предзагрузка чанка в `connectedCallback` (`:2568`), поведение
kiosk в `setConfig()` (`:3095`), безусловный потолок `BOOT_MAX_MS=1200`
(`:332-337`, `_bootWatch()` `:6356-6373`), чистота `isoLightFloorRooms`
(`src/iso-materials.ts:91-99`) и существующее unit-покрытие
(`test/iso-stage6.test.mjs`).
- Реальность плана автотестов: существующие
`demo/smoke_isometric_contract.mjs`, `demo/smoke_iso_tiles.mjs`,
`demo/smoke_iso_theme_walls.mjs`, `demo/smoke_volumetric_setting.mjs`
(последний подтверждённо без `page.reload()`).
- Соответствие `docs/SCOPE.md`: задача внутри узкого исключения #89
(детерминированная 2.5D-презентация той же геометрии), без расширения
исключения.
- Отсутствие скрытых продуктовых вопросов владельцу: единственная пограничная
зона (новое поведение kiosk) уже зафиксирована как решение в контракте.
- Раздел «Принято предположительно» корректно закрывает найденное техническое
напряжение `bootveil` vs `BOOT_MAX_MS=1200` как открытый технический выбор
автора, а не как находку.
Эти выводы не переоценивались заново в r2, так как делта раунда (см. выше) их
не задевает: ни один процитированный файл/строка/AC не менялся между r1 и r2.
## Что проверено и корректно (r2)
- Строка-фикс находится в правильном разделе, соответствует формулировке из
«Контракта поведения и UX» п.1 и «Сценария» (уже провалидированных в r1),
не противоречит текущему `docs/ISOMETRIC.md` (документ пока не содержит этого
пункта — ожидаемо, так как реализации ещё нет; ТЗ верно ставит это как будущий
release-артефакт, а не факт).
- Новых продуктовых вопросов, скрытых предположений или расхождений с
`docs/USER-GUIDE.ru.md` правка не вносит: новый текст — не пользовательская
формулировка (нет новой кнопки/индикатора/строки UI, что подтверждено ещё в
r1 и не изменилось), а описание внутреннего инварианта для канонического
документа подсистемы.
- Материал раунда зафиксирован (тело issue, дерево `dev`) для следующего этапа
(код-ревью), чтобы делта следующего раунда считалась корректно.
- Прецедент (#651, #649): тот же паттерн «Medium за пропуск
`docs/ISOMETRIC.md` в Release-артефактах → точечная правка → зелёный r2» уже
подтверждён дважды на этой же подсистеме — решение согласуется с устоявшейся
практикой ревью, а не является разовым снисхождением.
## Чего не проверял
- Повторно не проверял AC1–AC6, обязательные разделы §7.1, построчное
соответствие технических предпосылок коду `dev` — делта их не касается, весь
объём унаследован из r1 (см. раздел выше) без повторного исполнения.
- Не прогонял `tsc`/`npm test`/`npm run build`/`check-docs` — на этапе `spec`
нет диффа исходного кода (ветка задачи не создана), гейты §8 к этому раунду
неприменимы; это будет предметом код-ревью после реализации.
- Не проверял браузерное поведение и не запускал `smoke-select`/`golden` —
реализации нет, нечего исполнять.
- Не оценивал заново фактическую длительность загрузки чанка `iso-scene-render`
относительно `BOOT_MAX_MS` — этот пункт остался открытым техническим выбором
автора («принято предположительно»), как и в r1, делта его не трогает.
- Не запрашивал у владельца ничего: технических вопросов к владельцу в делте
нет, продуктовых открытых вопросов не появилось.
---
---
<!-- material-anchors: сгенерировано конвейером (#414) -->
## Материал раунда
- Ветка: `dev`, коммит `6297af6701f9` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
- Дерево материала: `968d87dd97df129defb9581ed5cdbb497bad896a`
```
git log --all --format='%H %T' | grep 968d87dd97df
```
- Тело issue: `d96095b1978fa9259b2fe1fa89ed256c0a292a59b2850e254cb56b8fb19a4ad1`
- Вердикт конвейера: `green` · High 0