Files
houseplan-card/docs/reviews/SPEC-REVIEW-649-r2.md
T
2026-09-25 12:48:25 +00:00

15 KiB
Raw Blame History

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


Материал раунда

  • Ветка: dev, коммит f68878cc44b8 — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
  • Дерево материала: fb70cdc705198bd470005c6e486a6b63dff537ab
    git log --all --format='%H %T' | grep fb70cdc70519
    
  • Тело issue: e7d94f185bc9a5d2d7e168933579903e54c88a9819347cb49f0f7c35db60a9e7
  • Вердикт конвейера: green · High 0