diff --git a/docs/reviews/SPEC-REVIEW-288-r2.md b/docs/reviews/SPEC-REVIEW-288-r2.md new file mode 100644 index 00000000..f22d3045 --- /dev/null +++ b/docs/reviews/SPEC-REVIEW-288-r2.md @@ -0,0 +1,145 @@ +# SPEC-REVIEW-288-r2 + +- **Issue:** https://github.com/Matysh/houseplan-card/issues/288 +- **Этап:** spec (PROCESS.md §2.4) +- **Заход:** r2 · блокирующих циклов израсходовано 1 из 4 (r1 был жёлтым и + потратил 1 цикл; зелёный вердикт цикла не образует, #227) +- **Документ ТЗ:** `docs/specs/288-bounded-multiwall-corridor.md` +- **SHA r1 (найден в документе r1, не в комментарии-вердикте):** + `cb0f9e7351e919701666dfd05b53f0e218e672a5` +- **SHA r2 (текущий HEAD, дельта этого раунда):** + `fba615e9f6ec8841c6e6e0f9a7cc5fe0d1fc7c25` +- **Разбор — по дельте** (PROCESS.md §2.10): единственный коммит между SHA r1 + и HEAD — `fba615e9 docs: add risks and rollback to junction spec` + (`docs/specs/288-bounded-multiwall-corridor.md`, +21/-4 строк). Дельта + локальна: только текст, только два новых раздела плюс одна строка в шапке; + не задета ни одна формулировка сценария, контракта, scope или AC. Условия + «разбор остаётся полным» (ребейз на ушедший вперёд `dev`, смена контракта + поведения, новая подсистема, объём дельты сопоставим с исходной задачей) не + выполнено ни одно — исходное ТЗ 208 строк, дельта 25 строк правки двух + разделов. Полный повторный разбор не требуется. + +## Дельта (что менялось) + +``` +git diff cb0f9e73..fba615e9 -- docs/specs/288-bounded-multiwall-corridor.md +``` + +- добавлен раздел «7. Риски и меры» (3 пункта: регрессия семи прежних + junction-контрактов → мера AC4/оба плана/golden; над-/недосечение соседней + стены → мера AC3/AC5/AC7; расхождение polygon между Plan/View/Static/Iso → + мера AC5 + запрет consumer-specific post-fix); +- добавлен раздел «8. Откат» (один абзац: чистый revert, флаг/миграция не + нужны, т.к. persisted model не меняется); +- последующие разделы («Ожидаемые файлы», «Release…», «Принятые технические + предположения») перенумерованы 7→9, 8→10, 9→11 без потери и без дублей + (проверено `grep -n "^## "` по всему файлу — последовательность 1…11 без + пропусков); +- в шапку «Связано» добавлен `#279`. + +Коммит несёт корректные трейлеры: `Issue: #288`, `User-Visible: no` (класс C, +поведение не меняется). + +## Закрытие раунда r1 + +| Находка r1 | Чем закрыта | Где это видно | +|---|---|---| +| **M1** (Medium, в скоупе) — отсутствуют обязательные разделы «Риски» и «Откат» (§7.1, DoR §2.5) | Добавлены разделы «7. Риски и меры» (3 пункта с мерами, привязанными к AC3/AC4/AC5/AC7) и «8. Откат» (чистый revert, без флага/миграции) | `docs/specs/288-bounded-multiwall-corridor.md:170-185`, коммит `fba615e9` | +| **L1** (Low) — «Связано» не включает #279, хотя AC4 на него ссылается | `#279` добавлен в строку «Связано» | `docs/specs/288-bounded-multiwall-corridor.md:11`, коммит `fba615e9` | + +Оба пункта закрыты содержательно, а не формальным упоминанием слова: риск 1 +прямо называет затронутый общий код (`bevelMultiWallBody`) и все семь прежних +контрактов по номерам, риск 2 и 3 — конкретные меры отказа (перекрытие, +недосечение, рассинхронизация consumers) с привязкой к конкретным AC, а не +общими словами. Формулировки рисков корректно хеджированы («может вернуть», +«может разойтись») — это анализ риска, а не факт о поведении, выданный без +основания. Откат сформулирован как утверждение и совпадает с уже +зафиксированным в шапке фактом «persisted model не меняется» — не новое +недоказанное утверждение, а следствие уже принятого в r1 факта. + +## Унаследовано из r1 + +Всё, что не затронуто дельтой, принимается без повторной проверки по +документу `docs/reviews/SPEC-REVIEW-288-r1.md` (SHA `cb0f9e7351e919701666dfd05b53f0e218e672a5`): + +- диагноз причины (узел `577,299`, лучи `349/120/5` шагов, толщины `30/30/30` + см, соседняя стена `20` см, радиус `4×15=60`, вырез `60−15=45`) — сверен + ревьюером r1 с телом issue буквально; +- существование и корректность использования идентификаторов контракта + (`MITRE_LIMIT`, `MultiWallNodeRay.supports`/`halfDepth`) в + `src/wall-thickness.ts` — проверено чтением кода в r1, дельта этого файла + не касается; +- привязка AC1/AC2 к существующему `demo/smoke_real_plan_masonry.mjs` и + корректность его логики подсчёта разрывов — не менялась; +- table-driven конструкция AC3 как независимая от AC1 unit-гарантия — текст + AC3 не тронут дельтой; +- список регрессионных контрактов AC4 (#249/#261/#271/#272/#275/#278/#279), + сверенный с `docs/WALL-THICKNESS.md`, — текст AC4 не тронут; #279 добавлен + только в шапку «Связано», в самом AC4 он уже присутствовал в r1; + сверено `git diff cb0f9e73..HEAD -- docs/specs/288-bounded-multiwall-corridor.md` + — раздел AC (строки 98–156 текущего файла) в дельте не участвует; + мутационное требование AC7 — не менялось; +- корректность Scope/«Не входит» (исключение #289/#290 и глобальных + констант) — не менялось; + «Принятые технические предположения» — не менялись по содержанию, только + перенумерованы (9→11); +- отсутствие продуктовых вопросов, требующих участия владельца, — не + менялось; новый текст рисков и отката тоже не содержит продуктовой + развилки, ниже проверено отдельно. +- совместимость/touch/performance (раздел 6) — не менялась. + +## Что проверено заново в этом раунде + +- Полный просмотр итогового файла (`docs/specs/288-bounded-multiwall-corridor.md`, + 226 строк) для проверки целостности нумерации разделов и отсутствия висячих + перекрёстных ссылок на старые номера — ссылок по номеру раздела в тексте + документа нет вообще (`grep -n "раздел\|§[0-9]"` — 0 совпадений), поэтому + перенумерация 7→9/8→10/9→11 безопасна. +- Содержательность нового раздела «Риски и меры»: каждый из трёх пунктов + называет конкретный failure mode и конкретную меру, привязанную к + проверяемому AC, а не общую фразу «будем осторожны». Прецедентная сверка + формы с `docs/specs/275-multiwall-strip-containment.md` и + `docs/specs/278-wall-union-isolation.md` (использовались как эталон в r1) + показывает сопоставимую структуру: конкретный риск → конкретная мера. +- Раздел «Откат»: соответствует требованию DoR §2.5 «откат: как выключить + или вернуть назад» — здесь ответ «чистый revert» обоснован отсутствием + изменений модели данных, что само по себе уже было зафиксировано в шапке + ТЗ («Модель данных: schema, config, layout и Optimize не меняются») и в + r1 это не оспаривалось. +- Продуктовая рамка не пересматривалась целиком (не требуется по §2.10, дельта + не продуктовая), но точечно проверено: новые два раздела не вводят решения, + которое следовало бы адресовать владельцу (нет пограничного случая, нет + конфликта персон, нет вопроса об объёме видимых изменений) — оба раздела + чисто технические, что соответствует их месту в документе (после AC, + до release-раздела). +- Трейлеры коммита `fba615e9`: `Issue: #288`, `User-Visible: no` — корректно + для документации класса C без изменения поведения. + +## Гейты + +Этап — spec, продуктовый код не менялся (diff ограничен `docs/specs/288-*.md`, +класс C). Как и в r1, гейты §8 (`typecheck`/`test`/`build`/`check-docs`/ +smoke/invariants/golden) к этапу spec-review не относятся и не запускались — +это гейты этапа code-review (§2.7), где эта задача окажется позже. Дельта +этого раунда тем более не продуктовая (только текст ТЗ), так что необходимость +их прогона не возникла и по факту дельты. + +## Находки + +Нет. High: 0, Medium: 0, Low: 0. Обе находки r1 закрыты содержательно (см. +таблицу выше), новых находок дельта не порождает. + +## Чего не проверял + +- Повторно не проверял идентичность кода `src/wall-thickness.ts` контракту + §3.1 — код не менялся с r1, наследуется. +- Не запускал `demo/smoke_real_plan_masonry.mjs` и `npm run invariants` — + реализации ещё нет, как и в r1; вопрос сохраняется до code-review. +- Не проверял golden baseline — как и в r1, AC6 описывает будущую работу. + +## Вердикт + +``` +Вердикт: зелёный · заход r2 · блокирующих циклов 1/4 · High: 0 · Medium: 0 +Документ: docs/reviews/SPEC-REVIEW-288-r2.md +```