16 KiB
SPEC-REVIEW-218-r2
- Issue: #218 — одна комната с floating-point шумом в координатах гасит свечение во всём пространстве
- Артефакт ТЗ:
docs/specs/218-glow-floor-geometry.md - Ветка/SHA:
issue/218-glow-floor-geometry@72275de - Предыдущий раунд: SPEC-REVIEW-218-r1.md @
c6ff34c(SHA назван явно — в r1 SHA тоже был указан, повторного нарушения нет) - Цикл: r2/4
- Вердикт: зелёный · High: 0 · Medium: 0
Скоуп ревью r2
Это второй цикл — разбор по дельте (PROCESS.md §2.9/§2.10). Дельта — правки
после r1, объявленная явно: git diff c6ff34c..72275de -- docs/specs/218-glow-floor-geometry.md
(commit 72275de, "docs: add risk analysis for glow geometry"; коммит
f9accc1 между ними — публикация самого документа r1-ревью, ТЗ не меняет).
Дельта состоит из трёх правок одного файла:
- новый раздел §15 «Риски» (таблица риск/последствие/снижение + строка про откат);
- переномерация разделов §15–§19 → §16–§20 из-за вставки;
- точечная правка AC1 (§16, было AC1 в §15 r1) и новый пункт 6 в «Принятых предположениях» (§20).
Дельта локальна: новая подсистема не задета, контракт поведения не изменился,
ребейза на dev не было (issue-ветка стоит на актуальном dev, коммиты между
раундами — только доки этого же issue). Объём дельты (34 добавленные / 12
удалённых строк в разделах «Риски» и AC1) несопоставим с исходным ТЗ (337
строк) — критерий «разбор полным» из §2.10 не наступает. Сокращённый разбор
корректен.
Единственная находка r1 была одна (Medium, «Риски»), поэтому раздел «дельта плюс всё, до чего она дотягивается» здесь совпадает с самой дельтой: правка AC1 — часть того же коммита, который автор прислал как ответ на замечание, и именно эта правка меняет доказательство AC1, поэтому AC1 разобран заново (п.4 §2.10 — «AC, чьё доказательство дельта задевает»). Остальные AC2–AC10 не затронуты дельтой ни текстуально, ни по цепочке зависимостей — унаследованы без повторной проверки (см. раздел ниже).
Как проверялось
git diff c6ff34c..72275de -- docs/specs/218-glow-floor-geometry.md— построчно, весь diff воспроизведён и сверен с текущим файлом (docs/specs/218-glow-floor-geometry.md:222–235— §15;:239–245— AC1;:357–359— assumption 6).- Сверка нового §15 с явным списком «Что чинить» из SPEC-REVIEW-218-r1.md (4 обязательных пункта) — см. таблицу закрытия ниже.
- Сверка перенумерации:
grep -n "§\d+"по всему файлу — оба оставшихся внутренних якоря (§9в §14,§19в §15) указывают на корректные разделы после сдвига («Диагностика» и «Откат» соответственно); битых ссылок нет. docs/specs/README.mdи структура остальных разделов (§1–§14,§17–§20) сверены на отсутствие случайных побочных правок — diff их не касается, наблюдение подтверждено самим diff (единственный изменённый файл —218-glow-floor-geometry.md, единственные секции diff — новый блок и окружение AC1).- Трейлеры коммита
72275de:Issue: #218,User-Visible: no— корректно для правки только ТЗ. - AC1 передумано по существу (не просто «текст добавлен»): сверено с
§17.3 «Mutation gate» (
union-quantization-removed→ guard «AC1/AC2 unit») и с §16 AC2 (регрессия шестикомнатной fixture, red-before-fix). Разделение ответственности «AC1 доказывает normalization contract через мутационный red, AC2 доказывает сам баг через red-before-fix» внутренне согласовано — ни один из двух AC не потерял свою «умеющую падать» проверку, они её просто по-разному помечают. - Новая формулировка AC1 и assumption 6 сверены друг с другом: assumption 6
прямо признаёт, что простая пара прямоугольников с 1 ULP, по всей
видимости, не воспроизводит реальный сбой polyclip на сегодняшнем коде (сбой
требует конфликтующей многокомнатной топологии — это же прямо описано в
теле issue:
union(Кухня + Туалет) → FAILотносится к паре с координатами из реального экспорта, а не к произвольной синтетической паре). Это корректно помечено как предположение (§20 п.6), а не выдано за факт — соответствует правилу «размытое место помечается, а не додумывается». Технически декларация не проверялась исполнением (кода ещё нет на этом этапе), это ожидаемо для стадииspecи совпадает с ограничением, уже зафиксированным в r1. - PROCESS.md §2.5 (DoR), §2.9/§2.10 (дельта-раунды), §7.1 (обязательные разделы ТЗ), §7.2 (формат вердикта) — перечитаны для проверки, что новый §15 закрывает именно пункт DoR «риски перечислены», а не просто заголовок.
Закрытие раунда r1
| Находка r1 | Чем закрыта | Где это видно |
|---|---|---|
| Medium — отсутствует обязательный раздел «Риски» (только заголовка не было, содержательного свода тоже) | Добавлен раздел §15 «Риски» — таблица из 6 строк (риск/последствие/снижение и доказательство) + отдельная строка про безопасность отката | docs/specs/218-glow-floor-geometry.md:222–235 |
→ требование 1: риск для соседних потребителей общего unionBodies() |
Строка 1 таблицы: «Квантование находится в общем unionBodies(), а не только в Glow» → мера: существующие wall/floor/physical-geometry tests и golden обязаны остаться зелёными |
:226 |
| → требование 2: легаси-планы с перекрывающимися комнатами | Строка 2 таблицы: fallback может дать иное evenodd-покрытие → мера: fast path сохраняется, добавлена overlap-fixture | :227 |
| → требование 3: наблюдение Glow-base может не воспроизвестись той же причиной | Строка 3 таблицы: смоук фиксирует результат, при иной причине — отдельный issue только после подтверждения | :228 |
| → требование 4: стоимость полного mutation-gate для review-цикла | Строка 4 таблицы: перед S7 обязательны --check и целевые мутанты, полный реестр — предрелизный гейт |
:229 |
Low (снята с записью, без цикла) — неточная конверсия 1e-6 единицы плана в метры в §8.1 |
Не тронуто и не требовалось: ревьюер r1 явно снял находку без цикла («правки не требую») | SPEC-REVIEW-218-r1.md, раздел «Low» |
Все четыре обязательных пункта Medium закрыты содержательно, не только по заголовку — проверено построчным сравнением с текстом самой находки r1, а не принято на слово автора.
Унаследовано из r1
Следующее принято без повторной проверки в r2, основание — SPEC-REVIEW-218-r1.md
@ c6ff34c, поскольку дельта их не касается:
- диагноз причины (§3 ТЗ, цепочка
_renderGlowLayer → intersectionPaths → unionBodies → polyclip) — сверен построчно с кодом в r1 (src/physical-geometry.ts:224–275,src/houseplan-card.ts:14880–15117); дельта r2 эти разделы не меняет; - соответствие обязательным разделам §7.1 PROCESS.md (сценарий, что увидит
человек, scope/не-scope, контракт поведения, UX/accessibility/touch,
данные/i18n, архитектура, performance/security, план автотестов,
release-артефакты, откат) — подтверждено в r1, диффом r2 не затронуто, кроме
самого раздела «Риски» (закрыт выше) и AC1 (разобран заново выше);
AC2–AC10 не изменились текстуально относительно
c6ff34c— сверено тем жеgit diff, где только блок AC1 внутри списка помечен как изменённый; - соответствие
docs/SCOPE.md(Core user job J1, «живая пространственная картина происходящего сейчас», не расширяет радиус/цвет/opacity/blend/ visibility-алгоритм) — привязка не менялась, скоуп/не-скоуп раздел (§6/§7 ТЗ) не в дельте; - согласованность с
docs/LIGHT.mdи прецедентом #197 (docs/WALL-THICKNESS.md:125,198,213,docs/ARCHITECTURE.md:414) — подтверждено в r1, разделы §4/§8.2 ТЗ, на которые опирается эта сверка, не в дельте; - существование
demo/smoke_glow*.mjs,demo/benchmark_glow.mjs,scripts/mutation-gate.mjsи их формат — подтверждено в r1, дельта их не упоминает заново; - отсутствие открытых продуктовых вопросов владельцу — подтверждено в r1 (сценарий и приоритет уже решены аналитикой владельца), дельта чисто техническая и продуктовых вопросов не добавляет.
Проверка «догадка выдана за факт» (по дельте)
Единственное новое фактическое утверждение дельты — assumption 6 (простая 1-ULP пара, вероятно, не падает на текущем polyclip). Оно явно оформлено как предположение в §20, а не как решённый факт, и согласовано с эмпирикой issue (бинарный поиск владельца ловил сбой только на реальных многокомнатных парах координат, а не на произвольной синтетической паре). Нарушения не найдено. Остальные новые строки (таблица рисков) — оценочные, не фактические утверждения о поведении кода, эта проверка к ним неприменима.
Соответствие SCOPE.md / TOUCH-SUPPORT.md / CONFIG-COMPATIBILITY.md
Не переоценивалось — дельта не касается ни персоны, ни поверхности, ни touch-контракта, ни конфига/схемы; выводы r1 наследуются целиком (см. раздел выше).
Чего не проверял
- Реальный код и его исполнение — не проверялись и не должны на этапе
spec; ТЗ по-прежнему описывает будущую реализацию, кода нет. - Гейты
npx tsc --noEmit/npm test/npm run buildне гонялись: правка этого раунда — исключительно документdocs/specs/218-glow-floor-geometry.md, продуктовый код не менялся ни в этом коммите, ни с момента r1. Прогон этих команд не проверил бы дельту и был бы потраченным временем без сигнала. - Полный повторный разбор AC2–AC10 не выполнялся — дельта их не задевает (см. «Унаследовано из r1»); по правилу §2.10 п.4 это корректное сужение, а не пропуск.
- Точная эмпирика assumption 6 (падает ли реально простая ULP-пара на текущем
polyclip) не воспроизводилась запуском — на этапе
specнет кода для запуска; заявление корректно помечено как предположение, а не как проверенный факт, поэтому дальнейшая проверка не требуется до кода.
Вердикт
Зелёный: High 0, Medium 0. Единственная находка r1 закрыта содержательно (раздел «Риски» с полным составом требуемых пунктов), сопутствующая правка AC1 внутренне согласована с mutation-gate таблицей и AC2 и корректно помечена как предположение там, где она делает утверждение о текущем поведении кода. Готово к разработке.