# SPEC-REVIEW-239-r2 - **Issue:** https://github.com/Matysh/houseplan-card/issues/239 - **ТЗ:** `docs/specs/239-grid-scale-invariance.md` - **Ветка / SHA:** `issue/239-grid-scale-invariance` @ `e8b3c86` - **Этап:** spec (PROCESS.md §2.4) · трек: обычный - **Заход:** r2 · блокирующих циклов израсходовано 1/4 (r1 — жёлтый, потратил цикл; этот заход зелёный и цикла не образует, PROCESS.md §4, #227) - **Ревьюер:** Claude, роль «ревьюер ТЗ» ## Скоуп Оценивалась дельта r2 — ровно один docs-коммит `e8b3c86` (26 строк diff в `docs/specs/239-grid-scale-invariance.md`), закрывающий две находки r1 (M1, L1). Дельта локальна: правка добрасывает доказательную таблицу и i18n-текст в уже принятый по продуктовой рамке документ, не меняет ни диагноз §3, ни классификацию §6, ни контракт поверхностей §8, ни AC1–AC16 по существу. Полный повторный разбор всего документа не требуется — применяется PROCESS.md §2.9/§2.10. Код не менялся: `git diff origin/dev...HEAD --stat` — три файла, все `docs/**` (спека, README реестра, обзорный документ r1). ## Как проверялось 1. Найден вердикт r1 в комментариях issue: жёлтый, заход r1, SHA `4c065f5`, документ `docs/reviews/SPEC-REVIEW-239-r1.md` (SHA в вердикте не был назван явно текстом — восстановлен по хэндоффу автора «Коммит `4c065f5`» и по `git log`, где `4c065f5` — последний спек-коммит перед комментарием с вердиктом). 2. Дельта объявлена и получена: `git diff 4c065f5..e8b3c86 -- docs/specs/239-grid-scale-invariance.md` — два блока: §10 (i18n-ключи) и новый §13.1 (матрица доказательств AC1–AC16). 3. По каждой находке r1 проверено построчно, чем именно она закрыта (см. раздел «Закрытие раунда r1» ниже) — не по заявлению автора в хэндоффе, а по самому тексту документа. 4. Перечитаны затронутые дельтой разделы в актуальном контексте всего документа: §9.2 (текст подписей), §10, §13 (AC13/AC14/AC16 целиком), §14 (план автотестов), §16 (риски), §19 (список «assumed, change freely»), чтобы убедиться в отсутствии противоречий между новым текстом и остальным ТЗ. 5. Сверены формулировки новой матрицы с существующим кодом там, где это проверяемо на этапе spec: - `src/i18n/en.json:373-374`, `src/i18n/ru.json:373-374` — ключи `space.scale_label` / `space.scale_unit` и их текущий текст («cm per cell» / «см на клетку») существуют буквально так, как утверждает новый §10 — совпадение, не догадка; - `space.scale_unit_imperial` — новый ключ, кода ещё нет, что ожидаемо на этапе spec. 6. Гейты, применимые к docs-only дельте класса C: `node scripts/check-docs.mjs` → `Documentation checks passed (7 files, 10 external links)`; `git diff 4c065f5..e8b3c86 --check` → чисто (нет whitespace-ошибок). `npx tsc --noEmit` / `npm test` / `npm run build` не запускались: `git diff origin/dev...HEAD --stat` подтверждает, что весь диапазон изменений — три файла в `docs/**`, класса A/B файлов нет, предмета для этих гейтов не существует. ## Закрытие раунда r1 | Находка r1 | Чем закрыта | Где это видно | |---|---|---| | **M1** (Medium) — §13 не указывает способ доказательства для AC13, AC14, AC16, не восстанавливается из §14/§16 | Добавлен новый раздел §13.1 «Матрица доказательств» с одной строкой на каждый AC1–AC16, включая явные записи для AC13 (code review exact scale-1 attributes + `golden:verify` как предрелизный, не как отдельно принимаемый baseline + docs provenance), AC14 (targeted touch/opening smoke: перечислены tap/pan/pinch/second-pointer/pointercancel/suppressed click раздельно, плюс edge hit-points из AC3) и AC16 (`check-docs` + code review обоих changelog/guide + screenshot provenance) | `docs/specs/239-grid-scale-invariance.md:377-396`, три строки таблицы для AC13/AC14/AC16 | | **L1** (Low) — §10 не называет конкретный текст/ключ imperial-подписи внутри самого i18n-раздела, а отсылает к §9.2 | §10 теперь сам перечисляет оба ключа и оба текста (`space.scale_unit` metric, новый `space.scale_unit_imperial`, `space.scale_label` для label), не отсылая читателя к другому разделу — соответствует конвенции остальных спеков (#157, #167, #094), на которую ссылался L1 | `docs/specs/239-grid-scale-invariance.md:282-284` | Обе правки точечные и не задевают ничего за пределами названных находок — дельта в 26 строк ровно совпадает с объёмом, который требовали M1 и L1. ## Унаследовано из r1 Всё содержательное решение ТЗ, кроме двух правок выше, принято без повторной проверки по итогам r1 (`docs/reviews/SPEC-REVIEW-239-r1.md` @ `4c065f5`): - продуктовая рамка §1–2, соответствие J4/J6 из `docs/SCOPE.md`, отсутствие продуктовых вопросов владельцу — не пересматривалось; - диагноз §3 (построчная сверка с кодом: `opening-symbol.ts`, `ISO_WALL_HEIGHT`/`ISO_FLOOR_EDGE_HEIGHT`, `cellCm: 5` в manual create и floors-import, `HATCH_BASE_STEP_UNITS`, `iconUnit`/`iconCqw`) — дельта их не касается, повторная построчная сверка не проводилась; - классификация размеров §6 и контракт поверхностей §8 — внутренняя непротиворечивость подтверждена в r1 алгебраически (`iconCqw`/`iconUnit`), дельта их текст не меняет; - AC1–AC12, AC15 сами по себе (формулировки) — признаны однозначными и алгебраически проверяемыми в r1, дельта их не редактировала, только добавила способ доказательства в §13.1; - откат §18 и release-артефакты §17 — признаны полными в r1, не менялись; - риски §16 — признаны содержательными в r1, не менялись. ## Находки Нет находок ни в дельте, ни в местах, которые дельта задевает (§9.2, §10, §13, §13.1, §14, §16, §19 перечитаны целиком на непротиворечивость с новым текстом — противоречий не найдено). ## Что проверено и корректно - Обе находки r1 закрыты по существу, а не переформулированы: M1 — таблица покрывает все 16 AC, а не только три названных, и формулировки строк буквально соответствуют тексту соответствующего AC (например, строка AC14 отдельно называет «tap остаётся действием» и отдельно — «pan/pinch/... не выполняют action», что закрывает обе половины критерия, на неполноту которых указывал r1); L1 — ключи и тексты названы в самом §10, дублирование с §9.2 не противоречиво (тексты идентичны). - Новая матрица §13.1 согласована с остальным документом: ссылки на конкретные файлы (`test/grid-scale.test.mjs`, `demo/smoke_grid_scale_invariance.mjs`, `demo/smoke_space_scale_defaults.mjs`) совпадают с именами, уже введёнными в §14.1/§14.2; ссылка на mutation `grid-scale-physical-double-scaled` в строке AC5 совпадает со строкой таблицы §15; разделение «code review» vs «предрелизный гейт» для AC13/AC15 согласовано с §12 и §14.3. - Новый i18n-текст §10 совпадает с уже существующим кодом для действующего ключа (`space.scale_unit`/`space.scale_label`, проверено по `src/i18n/en.json`/`ru.json`) — не введено расхождение с реальностью для той части, которая уже реализована. - Докс-гейт зелёный: `node scripts/check-docs.mjs` → `Documentation checks passed (7 files, 10 external links)`; `git diff --check` на дельте — чисто. ## Чего не проверял - Полный повторный разбор диагноза §3, классификации §6, контракта поверхностей §8 и AC1–AC12/AC15 по существу — дельта их не касается, унаследовано из r1 (см. выше), правило §2.9/§2.10. - `npx tsc --noEmit`, `npm test`, `npm run build` — не запускались: диапазон диффа не содержит файлов класса A/B, гейты не имеют предмета проверки. - Реализация helper'ов, тестов и smoke-файлов, названных в §13.1/§14 — кода нет, оценивалась только логическая полнота ссылок на этапе spec. - Golden/browser smoke/performance — не запускались и не должны: этап spec, реализации нет, эти гейты относятся к предрелизному прогону (PROCESS.md §8).