# SPEC-REVIEW-384-r2 Issue: [#384](https://github.com/Matysh/houseplan-card/issues/384) · этап: `S4-spec-review` · трек: `small` (ТЗ в теле issue) · заход r2 · SHA рабочего дерева на момент ревью: `3aac9bd2`, ветка `dev`. ## Скоуп Родитель — #373 (`fit: house`). Продуктовый скоуп не изменился с r1: гейтить вклад тел стен (~:432), extras (~:438) и нулевых стен (~:442) в кадре `fit: house` тем же `disp.showBorders`, которым уже гейтится их рендер (:657, :882, :914), и вернуть `needsCanonicalWallGeometry` (:388) к виду до #373. Единственное изменение между r1 и r2 — правка раздела 7 ТЗ («i18n / Release-артефакты») в ответ на единственную находку r1 (M1). Код продукта не менялся и не мог меняться: реализации всё ещё нет, это ревью ТЗ. ## Предыдущий раунд и дельта - Вердикт r1: жёлтый, High: 0, Medium: 1 (в скоупе) — документ `docs/reviews/SPEC-REVIEW-384-r1.md`, SHA `9c162c09`. - Дельта — правка тела issue #384, раздел 7, между комментарием ревьюера (`IC_kwDOTOcLQM8AAAABReJaQw`, 2026-08-30T07:38:09Z) и следующим комментарием владельца (`IC_kwDOTOcLQM8AAAABReKJ9w`, 2026-08-30T07:41:10Z: «Редакция 2 по SPEC-REVIEW-384-r1 M1 … Возвращаю S4»). - Проверено `git log --oneline 9c162c09..HEAD -- src/space-render.ts docs/USER-GUIDE.md docs/USER-GUIDE.ru.md docs/CANVAS.md` — пусто; `git diff 9c162c09..HEAD --stat` трогает только `docs/reviews/SPEC-REVIEW-384-r1.md` и несвязанный `docs/specs/385-audit-lows.md`. Делта полностью локальна тексту issue, ни один файл кода или доки не менялся — сокращённый разбор оправдан (не ребейз, не смена контракта, не новая подсистема). ## Закрытие раунда r1 | Находка r1 | Чем закрыта | Где это видно | |---|---|---| | Medium: раздел 7 утверждал «Доки: не задеты», хотя `docs/USER-GUIDE.md:798-800`, `docs/USER-GUIDE.ru.md:1543-1544` и `docs/CANVAS.md:232-233` безусловно обещают стены/перегородки/колонны в кадре `fit: house` | Раздел 7 переписан: явно называет все три файла с теми же номерами строк, требует добавить во все три места оговорку «если они видимы (`show_borders`)» по аналогии с существующей оговоркой про backdrop/decor, и добавляет способ проверки | Тело issue #384, раздел «7. i18n / Release-артефакты»: *«Доки (M1 r1): `docs/USER-GUIDE.md:798-800`, `docs/USER-GUIDE.ru.md:1543-1544` и `docs/CANVAS.md:232-233` сегодня безусловно обещают стены/перегородки/колонны в кадре `fit: house` — во все три места добавляется оговорка «если они видимы (`show_borders`)» … AC-док: grep на код-ревью.»* | Проверка закрытия — не только заявление автора: - Строки `798-800` в `docs/USER-GUIDE.md`, `1543-1544` в `docs/USER-GUIDE.ru.md` и `232-233` в `docs/CANVAS.md` прочитаны заново на текущем SHA — они всё ещё безусловны («fits every room, wall, partition, column…», «сохранит в кадре все комнаты, стены, перегородки, колонны…», «every sane room, positive/zero wall, independent wall or saved draft, column… participates») и все три ссылки в правке точно указывают на них — номера строк не съехали со времени r1 (код доков не менялся, см. дельту выше). - Раздел 7 теперь называет ровно те три файла, которые требовала находка r1, с тем же предложением оговорки («если видимы»), и добавляет способ доказать правку на код-ревью (`grep`) — закрывает и требование «указание способа доказательства» для этого AC. - Асимметрия по проёмам (`hide_openings`), которую r1 отдельно отметил как предсуществующий и вне-скоуповый пробел, в правке не тронута — это верно: r1 явно сказал, что её отсутствие не создаёт эта задача. Находка r1 закрыта полностью, новых пробелов правка не вносит. ## Унаследовано из r1 Без повторной проверки на этом раунде — документ `docs/reviews/SPEC-REVIEW-384-r1.md`, SHA `9c162c09`, дельта эту часть не задевает: - Фактическая база ТЗ: построчные ссылки на `src/space-render.ts` (:388, :424-467, :654-657, :882, :914) и происхождение условия `needsCanonicalWallGeometry` (реверт к состоянию до коммита #373 `0d33691f`, исходно `955de3e6`) — подтверждены чтением кода и `git log -S` в r1. - Согласованность гейта: `disp.showBorders === true` не меняет поведение; `floorMinusBodies` (:791) использует сырой `extras`, путь «чистого пола» не задет. - AC1–AC3 однозначны и доказуемы (twin-фикстура `smoke_space_card` с `show_borders: false`; регресс на существующих tight-ассертах, которые используют фиксированный `show_borders: true` и физически не пересекаются с новым гейтом). - AC4 («полный гейт зелёный; бюджет ≈ 0») корректен по характеру изменения (два булевых гейта + возврат одного условия). - План тестов и mutation-gate («убрать гейт → красный смок») пригодны. - Откат — обычный `git revert`, без флагов/миграций. - Раздел 8 («принятые предположения») — единственное предположение явно помечено как предположение, продуктового вопроса не требует. - Проверка трека `small` — все пять критериев §5 выполняются одновременно. - Открытых продуктовых вопросов нет. ## Как проверялось (этот раунд) - Прочитан текущий текст issue #384 и все три комментария (`gh issue view 384 --json body,comments`). - Сопоставлен новый раздел 7 с формулировкой находки M1 из r1 — построчно, файл за файлом. - Перепроверены сами три доковые ссылки на текущем SHA (см. выше) — не устарели. - `git log`/`git diff` подтвердили локальность дельты (только текст issue, никакой код или докфайл не менялся с r1). - Не перепроверялись AC1–AC4, факт-база ТЗ по коду, трек `small` — дельта их не задевает, унаследованы из r1 (раздел выше). ## Что проверено и корректно - Единственная находка r1 (Medium, в скоупе) закрыта по существу: все три файла названы с теми же строками, оговорка сформулирована, способ проверки на код-ревью указан. - Правка не вносит догадок, выданных за факт: формулировка «сегодня безусловно обещают» повторяет уже проверенный в r1 факт, новых непроверяемых утверждений нет. - Правка не расширяет и не сужает скоуп задачи (AC1–AC4, раздел 2 «Объём» не тронуты) и не меняет трек `small`. ## Чего не проверял - Не запускал никакие гейты (`tsc`, `test`, `build`, смоки, invariants) — это по-прежнему ревью ТЗ, реализации ещё не существует, кода для проверки нет. - Не проверял точную будущую формулировку доковой оговорки в трёх файлах — ТЗ (лёгкий трек) обязано назвать файлы/строки и содержание оговорки, а не дать готовый текст патча; точную формулировку и её реальное наличие в трёх файлах проверит код-ревью через названный автором `grep`. - Не проверял `fit: content` и i18n-строки интерфейса — вне дельты, и уже не проверялись в r1 по тем же причинам (гейт живёт только в блоке `fit === 'house'`). ## Вердикт Зелёный. High: 0. Medium: 0. Единственная находка r1 закрыта по существу, новых находок делта не вносит. Готово к переходу в разработку.