docs: review document for #649

Issue: #649
User-Visible: no
This commit is contained in:
claude[bot]
2026-09-25 12:48:25 +00:00
parent f68878cc44
commit 7372e977b8
2 changed files with 178 additions and 1 deletions
+2 -1
View File
@@ -1,10 +1,11 @@
# Индекс ревью
Генерируется `node scripts/reviews-index.mjs` (#635) — не редактировать руками. Документов: 1057, issue: 373. Вердикт: 🟢 зелёный · 🟡 жёлтый · 🔴 красный · ⚪ не распознан (свободная форма старых документов). H/M — число High/Medium по строке вердикта или заголовкам находок. Файлы — пути, названные в находках; ищите по имени файла: `grep form-kit INDEX.md`.
Генерируется `node scripts/reviews-index.mjs` (#635) — не редактировать руками. Документов: 1058, issue: 373. Вердикт: 🟢 зелёный · 🟡 жёлтый · 🔴 красный · ⚪ не распознан (свободная форма старых документов). H/M — число High/Medium по строке вердикта или заголовкам находок. Файлы — пути, названные в находках; ищите по имени файла: `grep form-kit INDEX.md`.
| Issue | Документ | Этап · раунд | Вердикт | H | M | Находки | Файлы |
|---|---|---|---|---:|---:|---|---|
| #649 | [SPEC-REVIEW-649-r1.md](SPEC-REVIEW-649-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | в скоупе задачи (возвращается автору); принято ревьюером с записью, правки не требует | `lab.js` `houseplan-card.ts` |
| #649 | [SPEC-REVIEW-649-r2.md](SPEC-REVIEW-649-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — |
| #647 | [SPEC-REVIEW-647-r1.md](SPEC-REVIEW-647-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | П.4 ТЗ переносит на новый слот прежнее; ТЗ не упоминает и не защищает документированный | `src/styles/dialogs.styles.ts` `src/styles.ts` `smoke_glow_blending.mjs` `smoke_test_facade.mjs` `smoke_unified_wall_tool.mjs` `docs/UX-MODES.md` `docs/reviews/CODE-REVIEW-195-r1.md` `src/styles/chrome.styles.ts` |
| #647 | [SPEC-REVIEW-647-r2.md](SPEC-REVIEW-647-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — |
| #647 | [CODE-REVIEW-647-r1.md](CODE-REVIEW-647-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — |
+176
View File
@@ -0,0 +1,176 @@
# SPEC-REVIEW-649-r2
Этап: spec (PROCESS.md §2.4). Заход r2, блокирующих циклов израсходовано 1 из 4
(потрачен на жёлтый r1; зелёный вердикт цикла не образует, §4).
## Скоуп
Issue #649 — без изменений с r1: 2.5D выходит из experimental и становится
публичным режимом; меняются плитки маркеров/замков (объём, торец, тень на
полу), свет из окон (мягкая заливка по солнцу), чинятся два бага декора/стен
(толщина линий мебели, независимость цвета стен от темы), добавляется
`settings.volumetric_view` в «Общих настройках». Flat, `houseplan-space-card`
и оба редактора не меняются. Полный трек — критерии §5 нарушены так же, как
в r1 (сложность 9/10, несколько поверхностей, новое конфиг-поле с
backend-валидацией, новый публичный UX-контракт, влияние на производительность
и touch); в скоупе `docs/SCOPE.md` — поименованное исключение #89.
Материал ревью — тело issue #649, раздел `## ТЗ` (редакция r2, 25.09), плюс
комментарий Matysh «ТЗ r2 — ответ на SPEC-REVIEW-649-r1» от 25.09 12:41:23,
объявляющий делту явно.
## Как проверялось (объём по дельте, §2.10)
1. Прочитан документ и вердикт предыдущего раунда:
`docs/reviews/SPEC-REVIEW-649-r1.md` — жёлтый, одна находка Medium (M1,
opacity тени для сочетания «тёмная тема + светлый пол» не определена) и
одна снятая Low (L1, неточная строка кода для `iso-floor-scene` в разделе
«Проблема»).
2. Прочитан комментарий-ответ автора (Matysh, 25.09 12:41:23): заявлены ровно
два изменения — таблица 4×(сдвиг/размытие/opacity) в разделе «Тень на
полу» вместо двух независимых правил, и разнесение строки кода на
`_renderSunRays` ~9870 / `iso-floor-scene` ~10901.
3. Прочитано тело issue #649 целиком в текущей редакции (раздел `## ТЗ`,
r2) — не только делта, весь документ, чтобы исключить незаявленные правки
в остальных разделах.
4. Дельта сверена построчно с текстом, который цитирует сам документ r1 (это
и есть материал r1 — точные фрагменты «до»):
- было (цитата r1): «Opacity: белые тела 0.34, цветные тела и бейджи
0.50. **Тёмная тема — 0.40** (цветные 0.50). … **Светлый пол**: opacity
0.30 (цветные 0.42), размытие 0.1375 D, сдвиг (0.1 D, 0.425 D)» — два
независимых модификатора без правила пересечения;
- стало (текущее тело issue, раздел «1. Иконки-плитки» → «Тень на полу»):
таблица «Тема · пол | Сдвиг | Размытие | Opacity белых тел | Opacity
цветных тел и бейджей» на 4 строки, плюс явное правило приоритета:
«Правило тёмной темы стоит последним и перекрывает opacity пола, но не
сдвиг и размытие». Строка «тёмная · светлый пол» = сдвиг (0.1D,
0.425D), размытие 0.1375D, opacity 0.40/0.40 — именно комбинация
вложения 13, которой не хватало в r1. Ambiguity, из-за которой была
заведена M1, закрыта: для всех четырёх сочетаний есть ровно одно число,
без противоречащих друг другу модификаторов.
- Дополнительно к исходной находке автор сам поправил обнаруженную у себя
ошибку: «Поправка к r1: там для тёмной темы стояло «цветные 0.50» — это
было неверно» — в таблице тёмная тема даёт 0.40 для обоих типов тел, не
0.50 для цветных. Это сужение старого (возможно ошибочного) числа, а не
новая догадка: источник — `getComputedStyle` с лаборатории, а не чтение
исходников на глаз, то есть более сильный вид доказательства, чем то,
что стояло в r1.
- было (L1, справочный текст): «`houseplan-card.ts` ~9870, группа
`iso-floor-scene`» — одна координата на две разные сущности;
- стало: «`_renderSunRays` в `houseplan-card.ts` ~9870, группа
`iso-floor-scene` ~10901» — разнесено на две точные координаты.
5. Числа новой таблицы пересчитаны из базы **D**, заявленной в «Эталон и
единицы» (80 ед. = 1 D), и сошлись поразрядно с текстом таблицы:
`8/80=0.1`, `30/80=0.375`, `34/80=0.425`, `22/80=0.275`, `11/80=0.1375`
(см. «Как проверялось» r1, тот же метод, применённый к новым числам).
6. Проверены цвета пола, на которых, по тексту, снят `getComputedStyle`
(`#737777`, `#eee8de`), по формуле luma из самого ТЗ
(`0.2126R+0.7152G+0.0722B`): `luma(#737777) ≈ 0.463 < 0.55` (тёмный пол),
`luma(#eee8de) ≈ 0.912 > 0.55` (светлый пол) — согласуется с ярлыками
строк таблицы, не противоречие.
7. Исправленные координаты L1 сверены с кодом на том же SHA, что и в r1
(`b7079ead` — HEAD `f68878cc` докой-only, код не менялся):
`grep -n "_renderSunRays" src/houseplan-card.ts` → `9870: private
_renderSunRays(...)`; `grep -n "iso-floor-scene" src/houseplan-card.ts` →
`10901: <g class=${iso ? 'iso-floor-scene' : nothing}`. Обе
координаты точны.
8. Остальные разделы ТЗ (сценарий, скоуп/не-скоуп, разделы 1–4, модель
данных, AC1–AC13, план тестов, риски, откат, release-артефакты,
«Принято предположительно») прочитаны в текущей редакции целиком и
структурно совпадают с тем, что описывал и проверял r1 — построчных
расхождений с описанием r1, кроме заявленной делты, не найдено.
9. Не запускались никакие гейты (typecheck/test/build/смоки) — этап ревью
ТЗ, продуктовый код не пишется, гейты неприменимы (§2.5, §8), так же как
в r1.
## Находки
Нет ни High, ни Medium, ни Low.
## Закрытие раунда r1
| Находка | Чем закрыта | Где это видно |
|---|---|---|
| **M1** — opacity тени для «тёмная тема + светлый пол» не определена (независимые модификаторы темы и пола без правила пересечения) | Прозаические правила заменены таблицей 4×(сдвиг, размытие, opacity белых, opacity цветных) с явным правилом приоритета «тёмная тема перекрывает opacity пола, но не сдвиг/размытие» | Тело issue #649, `## ТЗ` → «1. Иконки-плитки (только 2.5D...)» → подраздел «Тень на полу», строка таблицы «тёмная · светлый пол» = (0.1D,0.425D) / 0.1375D / 0.40 / 0.40 |
| **L1** (Low, была снята без правки) — строка кода для `iso-floor-scene` в разделе «Проблема» указана как ~9870 (факт 10901), одна координата на два разных места | Координата разнесена: `_renderSunRays` ~9870, `iso-floor-scene` ~10901 — обе проверены `grep -n` на SHA `b7079ead` и точны | Тело issue, раздел «Проблема (по коду `dev@b7079ead`)» → пункт «Свет» |
## Унаследовано из r1
Без повторной проверки, документ `docs/reviews/SPEC-REVIEW-649-r1.md`,
материал — SHA `b7079ead801f` (код не менялся между r1 и r2: единственный
коммит между раундами, `f68878cc`, — docs-only, публикация документа r1):
- обязательные разделы ТЗ по §7.1 присутствуют по существу;
- все технические утверждения разделов «Проблема» и «Эталон и единицы» (кроме
исправленной делтой строки) сверены построчно с кодом на `b7079ead` и
подтвердились (`_renderSunRays`, `furnitureScreenScale`,
`openingInnerFaceOffsetFromIndex`, `windowLit`, `planSunAngle`,
`gridVisualUnits`, `ISO_WALL_HEIGHT`, `isoRaisedOverlayHalfSize`,
`wall_fill`, `houseplan_card_view_v1`, `projection-toggle`, `LABS_FLAGS`,
`plan.styles.ts:338-368/757`, `general-settings-dialog.ts:86-100`,
`i18n/{en,ru,de,fr}.json:766-767`, backend-прецедент `validation.py`/
`support_package.py`/`config-schema.json`, performance-профили из AC13);
- Q1–Q3 отвечены владельцем и корректно перенесены в текст;
- таблица AC1…AC13 — все три столбца заполнены для защитных AC, пустых «чем
краснеет» нет (§2.7, #435); AC12 и AC13 корректно используют другой тип
свидетельства (сравнение с макетом / предрелизный гейт);
- модель данных, миграция, откат, i18n — соответствуют принятому в проекте
паттерну (`docs/CONFIG-COMPATIBILITY.md`);
- дискрепанс вложения 11 (янтарная рамка лаборатории vs `#0C82F0` продукта)
разрешён автором заранее и не вводит находку.
## Что проверено и корректно
- Делта r2 полностью и однозначно закрывает M1: для всех четырёх сочетаний
темы и пола в таблице есть ровно одно число (сдвиг, размытие, opacity
белых, opacity цветных), включая ранее отсутствовавшую комбинацию «тёмная
тема + светлый пол» (вложение 13). Числа таблицы арифметически выводятся
из базы D, заявленной в «Эталон и единицы», без округлений на глаз.
- Самокоррекция автора («цветные 0.50» → «0.40» для тёмной темы) сделана на
более сильном виде доказательства (`getComputedStyle` с работающей
лаборатории), чем то, что стояло в r1, и не противоречит остальному тексту
ТЗ или AC.
- L1 закрыта точной координатой, подтверждённой чтением кода на
неизменившемся SHA.
- Остальной текст ТЗ (сценарий, скоуп, разделы 1–4, AC, тесты, риски, откат,
release-артефакты, «Принято предположительно») не изменился по существу
относительно того, что проверил и описал r1 — делта локальна, расширения
разбора на смену контракта/подсистему/ребейз не требуется (§2.10).
## Чего не проверял
- Не открывал архив лаборатории (`first-floor-lab-2026-09-25-sketch07.zip`) и
не сверял значение `getComputedStyle` из таблицы напрямую с `lab.css` —
как и в r1, это вне доступа ревьюера; проверена только внутренняя
непротиворечивость таблицы (единицы D, порог luma) и правдоподобие через
явно названное правило приоритета. Точное численное соответствие макету —
задача AC12 на код-ревью (side-by-side с `docs/design/649-25d-stage6/
ACCEPTANCE.md`), не текста.
- Не запускал `npx tsc --noEmit`, `npm test`, `npm run build` — на этапе
ревью ТЗ продуктовый код не меняется, гейты неприменимы (§2.5, §8); та же
практика, что и в r1.
- Не переоткрывал верификацию восьми вложений 09–16 и формулы луча
параллелограмма — делта их не касается, оставлено как унаследовано из r1.
## Вердикт
Обе находки r1 закрыты корректно и по существу — M1 таблицей с
самодостаточным правилом приоритета (числа сходятся с базой D), L1 точной
координатой (подтверждена чтением кода). Новых находок делта не вносит,
остальной текст ТЗ не изменился. High: 0, Medium: 0.
Вердикт: зелёный · заход r2 · блокирующих циклов 1/4 · High: 0 · Medium: 0
---
<!-- material-anchors: сгенерировано конвейером (#414) -->
## Материал раунда
- Ветка: `dev`, коммит `f68878cc44b8` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
- Дерево материала: `fb70cdc705198bd470005c6e486a6b63dff537ab`
```
git log --all --format='%H %T' | grep fb70cdc70519
```
- Тело issue: `e7d94f185bc9a5d2d7e168933579903e54c88a9819347cb49f0f7c35db60a9e7`
- Вердикт конвейера: `green` · High 0