diff --git a/docs/reviews/SPEC-REVIEW-298-r2.md b/docs/reviews/SPEC-REVIEW-298-r2.md new file mode 100644 index 00000000..8844986b --- /dev/null +++ b/docs/reviews/SPEC-REVIEW-298-r2.md @@ -0,0 +1,126 @@ +# SPEC-REVIEW-298-r2 + +- **Issue:** https://github.com/Matysh/houseplan-card/issues/298 +- **ТЗ:** `docs/specs/298-resize-wall-thickness-carrier.md` @ commit `55db16df6e51027a81aaf56de6cd08bbf19c3b77` +- **Этап:** ТЗ на ревью (PROCESS.md §2.4) +- **Заход:** r2 · блокирующих циклов израсходовано 1 из 4 (потрачено r1, жёлтый) +- **Ревьюер:** Claude (сессия ревью ТЗ), автор ≠ ревьюер + +## Скоуп ревью + +Не первый заход. По PROCESS.md §2.9 / issue #214 разбор идёт по дельте: + +- предыдущий вердикт — комментарий `claude`, 2026-08-24T19:01:20Z, в issue #298: + жёлтый, r1, блокирующих циклов 0/4, High 0 / Medium 1 (в скоупе), документ + `docs/reviews/SPEC-REVIEW-298-r1.md`, ТЗ проверялось на SHA + `45066631aee4997ac1f033dbe75918b5b2d439d4` (SHA не был назван в самом + вердикте — восстановлен из ссылки автора на коммит ТЗ в комментарии за 18:54:17Z, + который текстуально совпадает с состоянием, разобранным в r1-документе); +- правка автора — коммит `55db16df6e51027a81aaf56de6cd08bbf19c3b77` + (`docs(spec): add resize user contract`, единственный файл + `docs/specs/298-resize-wall-thickness-carrier.md`, +25/-1); +- дельта строго локальна: добавлен раздел «Персона, поверхность, момент и + видимый результат», добавлена подсекция «UX и i18n», добавлены две строки + «Доказательство:» под AC5 и AC7. Ни один AC, ни контракт поведения (§§3–5), + ни scope (§6) не менялись. Рёбейза на ушедший вперёд `dev` не было (родитель + коммита — `8221ad9b`, публикация r1-документа, что и ожидается между + раундами). Подсистема не сменилась, новых открытых вопросов правка не внесла. + Объём дельты (одна секция + два предложения) несопоставим с объёмом задачи → + разбор сокращён до дельты, остальное наследуется из r1. + +## Как проверялось + +1. `git diff 45066631..55db16df -- docs/specs/298-resize-wall-thickness-carrier.md` + — получен полный текст дельты, показан ниже в разделе «Закрытие раунда r1». +2. Дельта прочитана в контексте всего текущего файла (`Read` целиком, 377 + строк), чтобы исключить рассинхронизацию новых фраз с остальным ТЗ. +3. Новый раздел 1 сверен с: + - `docs/SCOPE.md` — персона «Home admin (primary) … Desktop browser», job + J6 «Keep the plan true as the home evolves … drag/resize» — совпадает + с «администратор дома / desktop Plan editor / инструмент Resize»; + - комментарием-аналитикой автора (18:52:14Z), где та же персона и та же + поверхность были названы изначально, но не попадали в сам документ — + ровно то несоответствие, которое r1 отметил как находку. +4. Термин «ручка» и написание «Resize» сверены с `docs/USER-GUIDE.ru.md` + (строки 441, 480–481: «Resize», «ручка объясняет…», «Ручка остаётся + видимой, но приглушена») — терминология не изобретена, взята из канона. +5. Новая подсекция «UX и i18n» сверена с §6 «Не входит» («изменение + eligibility, safe range, pointer UX … не входит») и §12 п.3 («Existing + `resize.commit_failed` достаточно … пока eligibility не меняется») — + утверждение «новых контролов/текстов нет» не противоречит остальному + документу. +6. Новые строки «Доказательство:» под AC5/AC7 сверены с разделом 11 + («Ожидаемые файлы и release artifacts»): методы («table-driven unit pure + carrier preflight», «production-bundle Resize pointer smoke») там же + названы как ожидаемые файлы/evidence — не расходятся. +7. Коммит `55db16df` проверен `git show --stat`: правда только один файл, + +25/-1, что совпадает с диффом, разобранным построчно (не поверено на + слово автора). +8. Трейлеры коммита: `Issue: #298`, `User-Visible: no` — для docs-only + spec-коммита корректно (видимого поведения нет, меняется только текст ТЗ). + +**Не проверялось повторно** (наследуется из r1, ниже отдельным разделом): +корневая причина по коду, существование фикстур/констант/связанных issue, +формулировки §§3–5, §6, §7 (AC1–AC9 по содержанию), §8–§12 — дельта их не +касается, к этим утверждениям автор не притрагивался. + +## Закрытие раунда r1 + +| Находка r1 | Чем закрыта | Где это видно | +|---|---|---| +| **Medium (в скоупе):** ТЗ не содержит обязательных продуктовых разделов §7.1 — «персона/поверхность/момент» и «что человек увидит до/после» без терминов реализации; §1 и §2 были на языке реализации (`rekeyWallsAfterMove`, topology vertex, config write) | Добавлен раздел 1 «Персона, поверхность, момент и видимый результат»: явно назван «администратор дома», «desktop Plan editor, инструмент Resize», «обычный ресайз стены готового плана»; добавлены два предложения «До:»/«После:» без единого термина реализации (стена рисуется другой толщиной / теряет ручку → ресайз либо проходит как раньше, либо fail-closed с прежней ошибкой) | `docs/specs/298-resize-wall-thickness-carrier.md`, новые строки 16–26 (коммит `55db16df`) | +| **Low (снят с записью, не блокировал):** AC5 и AC7 не называют явно способ доказательства | Под AC5 и AC7 добавлены явные строки «Доказательство: …» | строки 244–245 (AC5) и 272–273 (AC7) | +| **Low (снят с записью, не блокировал):** разделы «UX» и «i18n» не выделены явными заголовками | Добавлена подсекция `### UX и i18n` внутри §5 с прямым утверждением «новых контролов, состояний и текстов нет» | строки 162–166 | + +Все три пункта r1 закрыты правкой; новых расхождений между добавленным текстом +и остальным документом не найдено (см. «Как проверялось», пп. 3–6). + +## Унаследовано из r1 + +Без повторной проверки в этом раунде принято по документу +`docs/reviews/SPEC-REVIEW-298-r1.md` (ТЗ на SHA `45066631aee4997ac1f033dbe75918b5b2d439d4`), +поскольку дельта r1→r2 их не касается: + +- корневая причина подтверждена чтением `rekeyWallsAfterMove()` + (`src/wall-thickness.ts:533`, пропорциональная проекция `mapPoint`, + строки 574–582) — совпадает с числами из issue; +- обе fixture-репродукции (`real-plan-second-floor.json`, + `real-plan-first-floor.json`) существуют и соответствуют описанным в AC1/AC2 + жестам; +- `LATTICE_NOISE_STEPS` существует (`src/coordinate-canonicalization.ts:11`, + `1e-4`), используется в инвариантах и мутационном гейте; +- все связанные issue (#253, #277, #289, #291, #293, #297, #299) существуют в + заявленном состоянии (закрыты/открыт), ссылки не искажены; +- ссылки на канон (`WALL-THICKNESS.md`, `RESIZE.md`, `TOUCH-SUPPORT.md`) + точны, не изобретены; +- AC1–AC9 по содержанию проверяемы, скоуп «не входит» корректно исключает + #299 (`mixed_role_record`); +- §12 «Принятые технические предположения» — явные, не выданы за факт. + +## Находки + +Нет. Единственная находка r1 (Medium, в скоупе) закрыта дельтой; новых находок +дельта не создала. + +## Что проверено и корректно + +- Дельта r1→r2 (раздел 1, подсекция UX/i18n, две строки «Доказательство:») + внутренне согласована с остальным документом и с каноном (`SCOPE.md`, + `USER-GUIDE.ru.md`). +- Персона/поверхность/момент и фраза «до/после» присутствуют, без терминов + реализации — оба обязательных продуктовых раздела §7.1 закрыты. +- Коммит содержит ровно заявленное изменение, трейлеры корректны. + +## Чего не проверял + +- Повторно не перечитывал и не оспаривал §§2–12 по содержанию — дельта их не + меняла, см. «Унаследовано из r1». +- Гейты `typecheck`/`test`/`build`/`check-docs` не запускал — стадия ТЗ, кода к + задаче ещё нет; это ожидается на этапе code-review. +- Не проверял снова состояние связанных issue (#253/#277/#289/#291/#293/#297/#299) + — наследуется из r1, ссылки дельта не меняла. + +## Вердикт + +Зелёный. Единственная Medium-находка r1 закрыта точечной и корректной правкой, +новых находок нет.