# SPEC-REVIEW-199-r2 — Optimize geometry preflight - **Issue:** https://github.com/Matysh/houseplan-card/issues/199 - **ТЗ:** `docs/specs/199-optimize-geometry-preflight.md`, коммит `b76f89a` на ветке `issue/199-optimize-geometry-preflight`. - **Предыдущий раунд:** `docs/reviews/SPEC-REVIEW-199-r1.md`, получен на SHA `0ac63b6` (SHA в документе r1 назван явно автором ревью — не находка). - **Трек:** обычный (issue не помечен `small`), файл ТЗ обязателен. - **Заход:** r2. Блокирующих циклов израсходовано **1 из 4** — r1 был жёлтым (тратит бюджет), текущий заход при отсутствии High/Medium зелёный и бюджет не расходует (PROCESS.md §4, решение владельца по #227). ## Скоуп ревью — по дельте (PROCESS.md §2.10) Дельта объявлена явно: `git diff 0ac63b6..HEAD` затрагивает ровно два файла — появление `docs/reviews/SPEC-REVIEW-199-r1.md` (артефакт предыдущего раунда, не предмет проверки) и правку `docs/specs/199-optimize-geometry-preflight.md` на 4 добавленные / 1 удалённую строку внутри §8.1: ```diff -- EN: equivalent plain-language text without implementation terms. +- EN: `Could not safely verify the geometry of the following spaces: + {spaces}{more}.` +- EN hint: `Plans were not changed. Update House Plan and try again. If the + error persists, attach a space export to the bug report.` ``` Дельта локальна: чистая правка текста одного UX-сообщения, без ребейза (родитель коммита — тот же `0ac63b6`, `dev` не уходил вперёд), без смены контракта поведения, без новой подсистемы, объём несопоставимо меньше исходной задачи. Условия «разбор остаётся полным» (§2.10) не выполнены — разбор по дельте корректен, полный повторный прогон ТЗ не требуется. Единственная находка r1 — Medium M1 («EN-текст сообщения об отказе и подсказки не зафиксирован дословно») — целиком лежит внутри этой дельты: это ровно тот участок, который автор поправил. Значит объём проверки в r2 покрывает 100% дельты, ничего не остаётся «вне поля зрения». ## Закрытие раунда r1 | Находка r1 | Чем закрыта | Где это видно | |---|---|---| | **M1** (Medium, в скоупе): §8.1 не даёт дословный EN-текст главного сообщения об отказе и подсказки — AC6 непроверяем для EN-локали, несогласованность с уже дословным EN у `Space N`/`and N more` в том же разделе. | В §8.1 добавлены две новые строки: дословный `EN:` для главного сообщения и отдельный `EN hint:` для подсказки, оба — точный перевод соответствующих RU-строк, без implementation-терминов (никаких «polyclip», «boolean pass», «exception»). | `docs/specs/199-optimize-geometry-preflight.md:213-216` (коммит `b76f89a`), см. diff выше. | | Low (для протокола, не блокирует): артефакт шаблона «Коммит: $sha.» в хендофф-комментарии автора. | Не в скоупе правки ТЗ и не требовала действия по итогу r1 (ревьюер не правит issue-комментарии). Автор в r2 указал реальный SHA (`b76f89a`) в новом хендоффе — комментарий приведён в порядок сам по себе. | Комментарий issue #199 от 2026-08-22T13:08:18Z. | ## Проверка M1 по существу (не на слово автора) - **Терминология.** RU «пространство» и EN «space» — установленный термин продукта, а не изобретение: `docs/USER-GUIDE.ru.md` («Пространства», раздел 7) и `docs/USER-GUIDE.md` («Space | Floor, yard, garage or building») используют его идентично. Совпадает с уже принятым в том же §8.1 `Space N`/`and N more`. - **Точность перевода.** Построчное сравнение: - RU «Не удалось безопасно проверить геометрию следующих пространств: {spaces}{more}.» ↔ EN «Could not safely verify the geometry of the following spaces: {spaces}{more}.» — тот же плейсхолдер, тот же смысл, без технических терминов (соответствует решению владельца Q3). - RU hint «Планы не изменены. Обновите House Plan и повторите. Если ошибка останется, приложите экспорт пространства к отчёту об ошибке.» ↔ EN hint «Plans were not changed. Update House Plan and try again. If the error persists, attach a space export to the bug report.» — совпадает по структуре (три предложения, тот же порядок действий). - «Bug report» — уже используемый в репозитории термин (`docs/CHANGELOG.md:3896` «bug report with diagnostics hint», `docs/STYLING-HOOKS.md:48` «is not a bug report»), не изобретён заново. - **Формат.** Новые EN-строки оформлены тем же способом (обратные кавычки), каким в этом же разделе уже оформлен `Space N`/`and N more` — внутренней несогласованности, на которую указывал M1, больше нет. - **AC6 стал проверяемым.** AC6 требует «i18n/UI unit» доказательство; теперь для EN-локали есть дословная строка, на которую можно писать assertion, а не директиву «эквивалент». Правка не расширяет и не сужает контракт §7 (whole-plan block, различение `null`/successful-empty, fingerprint) и не касается backend/atomicity (§9), performance-бюджета (§10) или AC1–AC5, AC7–AC14 — эти участки дельта не задевает. Новых находок в дельте нет. ## Унаследовано из r1 Документ: `docs/reviews/SPEC-REVIEW-199-r1.md`, SHA `0ac63b6`. Принято без повторной проверки в r2, так как дельта их не задевает: - Продуктовая рамка §1–§2 (персона, поверхность, момент, J6/`TOUCH-SUPPORT.md`). - Подтверждение проблемы §3 по коду `origin/dev` (`_openAlignDialog`, `_runAlignToGrid`, fallback `_wallUnionGeometry` → `paperRoomShapes`). - Контракт preflight §7 целиком: production-equivalent geometry check, различение `null` (structural failure) vs successful-empty (§7.3), fingerprint и повторная проверка (§7.4). - Продуктовые решения владельца Q1–Q3, перенесённые в контракт без искажения (whole-plan block, блокировка уже деградированного пространства, текст без implementation-терминов и без кнопки Apply) — сам факт переноса решений, а не конкретный текст (текст — предмет этого раунда, см. выше). - §8.2 (no-op/success), §9 (backend/atomicity/compatibility), §10 (performance-бюджет и large-house fixture), Non-scope §6. - AC1–AC14: нумерация, однозначность, способ доказательства — за исключением AC6, чья доказуемость для EN-локали как раз и была предметом M1 и проверена заново выше. - Блок §16 «Принятые технические предположения». - Формальная структура ТЗ (все обязательные разделы §7.1 присутствуют), запись `docs/specs/README.md`. - Rollback (§15). ## Гейты Этап — ревью ТЗ, продуктовый код не менялся (диапазон 0ac63b6..HEAD не затрагивает `src/**`, `custom_components/**`, `test/**`, `demo/**`). Гейты `typecheck`/`test`/`build`/`check-docs`/smoke/golden/backend неприменимы, как и в r1 — их прогон был бы работой без предмета. Это осознанное решение, а не пропуск. ## Чего не проверял - Всё, что перечислено в разделе «Унаследовано из r1» выше — не перепроверял предметно, полагаюсь на r1 при подтверждённом отсутствии дельты в этих участках. - Код реализации — его по-прежнему нет, ревью только ТЗ. - Реальную производительность и мутационные тесты — не появились новые данные с r1, эти пункты остаются открытыми до код-ревью, как и было зафиксировано в r1 «Итог». ## Итог Единственная находка предыдущего раунда (Medium M1) закрыта точной правкой текста, воспроизводимой построчно в diff. Новых находок дельта не создала. High-находок нет, Medium-находок нет. **Вердикт: зелёный · заход r2 · блокирующих циклов 1/4 · High: 0 · Medium: 0**