15 KiB
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)
- Прочитан документ и вердикт предыдущего раунда:
docs/reviews/SPEC-REVIEW-649-r1.md— жёлтый, одна находка Medium (M1, opacity тени для сочетания «тёмная тема + светлый пол» не определена) и одна снятая Low (L1, неточная строка кода дляiso-floor-sceneв разделе «Проблема»). - Прочитан комментарий-ответ автора (Matysh, 25.09 12:41:23): заявлены ровно
два изменения — таблица 4×(сдвиг/размытие/opacity) в разделе «Тень на
полу» вместо двух независимых правил, и разнесение строки кода на
_renderSunRays~9870 /iso-floor-scene~10901. - Прочитано тело issue #649 целиком в текущей редакции (раздел
## ТЗ, r2) — не только делта, весь документ, чтобы исключить незаявленные правки в остальных разделах. - Дельта сверена построчно с текстом, который цитирует сам документ 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» — разнесено на две точные координаты.
- Числа новой таблицы пересчитаны из базы 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, тот же метод, применённый к новым числам). - Проверены цвета пола, на которых, по тексту, снят
getComputedStyle(#737777,#eee8de), по формуле luma из самого ТЗ (0.2126R+0.7152G+0.0722B):luma(#737777) ≈ 0.463 < 0.55(тёмный пол),luma(#eee8de) ≈ 0.912 > 0.55(светлый пол) — согласуется с ярлыками строк таблицы, не противоречие. - Исправленные координаты L1 сверены с кодом на том же SHA, что и в r1
(
b7079ead— HEADf68878ccдокой-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}. Обе координаты точны. - Остальные разделы ТЗ (сценарий, скоуп/не-скоуп, разделы 1–4, модель данных, AC1–AC13, план тестов, риски, откат, release-артефакты, «Принято предположительно») прочитаны в текущей редакции целиком и структурно совпадают с тем, что описывал и проверял r1 — построчных расхождений с описанием r1, кроме заявленной делты, не найдено.
- Не запускались никакие гейты (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
Материал раунда
- Ветка:
dev, коммитf68878cc44b8— ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. - Дерево материала:
fb70cdc705198bd470005c6e486a6b63dff537abgit log --all --format='%H %T' | grep fb70cdc70519 - Тело issue:
e7d94f185bc9a5d2d7e168933579903e54c88a9819347cb49f0f7c35db60a9e7 - Вердикт конвейера:
green· High 0