# SPEC-REVIEW-294-r2 - **Issue:** https://github.com/Matysh/houseplan-card/issues/294 - **Этап:** ревью ТЗ (PROCESS.md §2.4) - **Заход:** r2 · блокирующих циклов израсходовано 1/4 (зелёный вердикт цикла не тратит, #227) - **Ревьюер:** Claude (роль «ревьюер ТЗ», сессия отдельна от автора ТЗ) - **Предыдущий раунд:** [SPEC-REVIEW-294-r1](SPEC-REVIEW-294-r1.md), вердикт жёлтый, на SHA `8e86b0a5` (ветка `issue/294-wall-esc-detach`). SHA в вердикте r1 назван явно (в шапке документа r1), это не находка. - **Предмет ревью:** `docs/specs/294-wall-esc-detach.md` на SHA `6b857087` (текущий `HEAD` ветки) и комментарий автора «Правки ТЗ после SPEC-REVIEW r1». ## Разбор по дельте (PROCESS.md §2.9/§2.10, issue #214) Дельта объявлена: `git diff 8e86b0a5..HEAD` — два файла: `docs/reviews/SPEC-REVIEW-294-r1.md` (публикация документа предыдущего раунда, не предмет разбора) и `docs/specs/294-wall-esc-detach.md`, **+43/-7 строк**, только раздел 5 («Подсказки и документация») и AC7 в разделе 7. Правки в `docs/specs/README.md` и создание самого файла спецификации относятся к исходному коммиту `8e86b0a5`, уже разобранному в r1, и в дельту r2 не входят. Дельта **локальна**: правит формулировку одного раздела и одного AC того же файла, не меняет продуктовый контракт Esc (разделы 1–4), не задевает новую подсистему, не связана с ребейзом (branch содержит весь `origin/dev`, что подтверждает пустой diff `docs/specs/README.md` кроме одной добавленной строки реестра). Объём разбора сокращён до дельты; заново проверены только AC7 и раздел 5, а также согласованность новой формулировки с разделами 1–4, 6, 8, 9, которые эту дельту упоминают (раздел 6 «Не входит» и раздел 9 «Документация врёт после изменения»). ## Закрытие раунда r1 | Находка r1 | Чем закрыта | Где это видно | |---|---|---| | Medium: AC7 формулировкой («старое утверждение… отсутствует в затронутых Walls-разделах») не покрывает четыре конкретных места старого контракта вне «Walls»-раздела (`USER-GUIDE.ru.md:223`, `:241`, `USER-GUIDE.md:207`, `:216-217`), и EN «Create a room» не решён на паритет с RU | Раздел 5 переписан: перечисляет **шесть** именованных поверхностей (RU: строка «Рисование и точный drag», таблица «Клавиши отмены» с явным разделением Draw/Split, «Комнаты и стены»; EN: строка “Draw or precise drag”, “Cancel and undo”, “Create a room” — последняя явно получает паритет с RU). AC7 дублирует тот же список пронумерованными пунктами 1–6, каждый — проверяемое утверждение по конкретному месту, а не общая цитата | `docs/specs/294-wall-esc-detach.md:109-127` (раздел 5) и `:190-208` (AC7), коммит `6b857087` | Проверка не ограничилась заявлением автора: каждая из шести строк раздела 5 и AC7 сверена построчно с текущим содержимым `docs/USER-GUIDE.ru.md` и `docs/USER-GUIDE.md` на `HEAD` дерева (не на ветке спецификации, а в самом репозитории, поскольку изменение поведения ещё не реализовано и тексты руководств пока старые): - `docs/USER-GUIDE.ru.md:223` — строка «Рисование и точный drag»: `` `Shift` меняет магнит/угол; `Esc` отменяет операцию `` — совпадает с описанием в §5 п.1/AC7 п.1, требующим разделения; - `docs/USER-GUIDE.ru.md:241` — таблица «Клавиши отмены», строка «Незавершённый Draw/Split»: «Убирает последнюю точку или выходит из инструмента» — совпадает с §5 п.2/AC7 п.2; - `docs/USER-GUIDE.ru.md:412` — «Комнаты и стены»: «Esc/Ctrl+Z удаляет последнюю точку» — совпадает с §5 п.3/AC7 п.3; - `docs/USER-GUIDE.md:207` — строка “Draw or precise drag”: “`Esc` cancels the operation” — совпадает с §5 п.4/AC7 п.4; - `docs/USER-GUIDE.md:216-217` — “Cancel and undo”: “`Esc` cancels an unfinished path… without undoing an already committed action” — совпадает с §5 п.5/AC7 п.5; - `docs/USER-GUIDE.md:294-299` — “Create a room”: раздел сегодня **не содержит** упоминания Esc/Ctrl+Z вовсе (в отличие от RU-версии, `:412`) — совпадает с тем, что §5 п.6/AC7 п.6 явно требуют добавить паритет, а не оставляют вопрос открытым. Все шесть мест реальны, названы верно и покрывают в точности исходные четыре цитаты r1 плюс оба открытых вопроса того раунда (RU «Комнаты и стены» и EN паритет). Разбор по коду/докам, не по заявлению автора. Отдельно проверено, что деление таблицы «Клавиши отмены» на Walls/Split не является новой догадкой: `split` — существующий отдельный `MarkupTool` в `src/houseplan-card.ts` (`type MarkupTool = … | 'draw' | … | 'split' | …`, собственная кнопка активации, собственная обработка курсора/preview), то есть разнесение «Draw (Walls)» и «Split» в разных строках описывает два реально разных инструмента, а не искусственное разделение одного. ## Унаследовано из r1 Без повторной проверки принято из [SPEC-REVIEW-294-r1](SPEC-REVIEW-294-r1.md) на SHA `8e86b0a5`, поскольку дельта r2 их не затрагивает: - продуктовая рамка и персона (Home admin, Plan editor, десктоп) — раздел «Что проверено и корректно», п.1 документа r1; - отсутствие догадок, выданных за факт, в разделах 1–4 (контракт Esc) — сверено с `_onKey`, `_finishWallChain`, `_undoPoint`, `_undoActiveDraftPoint`, `_resumeLastDraft`, `_resumeDraftBySpace` на той же ветке в r1; - однозначность и проверяемость AC1–AC6, AC8 — не изменились байт в байт между `8e86b0a5` и `HEAD` (единственная правка дельты — AC7 и раздел 5, подтверждено `git diff` выше); - полнота раздела 6 «Не входит», разделов 8–13 (совместимость/touch/security/ performance, риски, откат, ожидаемые файлы, release, принятые предположения) — не затронуты дельтой; - корректность трейлеров коммита спецификации (`Issue: #294`, `User-Visible: no`) и трек (обычный, не `small`). ## Гейты Класс изменённых файлов в дельте — только C (`docs/specs/**`). Продуктовый код (класс A/B) на ветке отсутствует: `git diff origin/dev...HEAD --stat` даёt только `docs/reviews/**`, `docs/specs/294-wall-esc-detach.md`, `docs/specs/README.md`. `typecheck`/`test`/`build`/`check-docs` неприменимы к этапу ТЗ (то же решение, что в r1) — ничего не проверяют для файла спецификации и не запускались сознательно, а не по умолчанию. ## Находки Нет. High: 0, Medium: 0, Low: 0. ## Что проверено и корректно - Единственная находка r1 (Medium) закрыта по существу, а не переформулирована так, чтобы формально пройти проверку: новая формулировка AC7 привязана к шести конкретным, поимённо названным местам в обоих руководствах, включая оба места, которые r1 привёл цитатами, и оба открытых вопроса r1 (RU «Комнаты и стены», EN «Create a room» паритет). - Новая формулировка не вводит непомеченных догадок: разделение таблицы «Клавиши отмены» на Walls/Split опирается на существующий отдельный инструмент `split` в коде, а не является произвольным решением автора. - Раздел 6 «Не входит» синхронизирован с расширенным разделом 5: пункт «переработка всех общих текстов про Escape вне затронутого Walls-контекста» по-прежнему верно ограничивает работу — новый список из шести мест целиком относится к контракту wall chain, ничего избыточного не добавлено. - Продуктовый вопрос владельцу не появился: оба уточнения из r1 (нужно ли разносить Draw/Split, нужен ли EN-паритет) решены автором технически, без эскалации, что соответствует PROCESS.md §7.1 («всё, чего пользователь не наблюдает, агенты решают сами»); паритет текста руководств — не продуктовое поведение, а формулировка документации одного и того же уже согласованного контракта. ## Чего не проверял - Гейты `typecheck`/`test`/`build`/`check-docs`/смоки — не запускались: дельта правит только `docs/specs/**`, продуктового кода нет, issue не в `S5-ready`. То же решение объёма, что в r1. - Реализуемость AC7 на уровне будущего диффа кода/документации — предмет код-ревью после реализации, не ТЗ-ревью. - Разделы 1–4, 6, 8–13 не перечитывались построчно заново — они наследуются из r1 согласно разделу «Унаследовано из r1» выше, дельта их не касается. ## Вердикт Зелёный: находка r1 закрыта по существу и проверена по коду/докам, а не по заявлению автора; новых находок нет. Продуктовых вопросов владельцу нет.