diff --git a/docs/reviews/SPEC-REVIEW-584-r2.md b/docs/reviews/SPEC-REVIEW-584-r2.md new file mode 100644 index 00000000..b844029e --- /dev/null +++ b/docs/reviews/SPEC-REVIEW-584-r2.md @@ -0,0 +1,180 @@ +# SPEC-REVIEW-584-r2 + +**Issue:** #584 · **Этап:** ТЗ на ревью (S4-spec-review) · **Заход:** r2 · +**Трек:** полный (аналитика от 2026-09-15: сложность 6/10, риск 7/10 — критерий +лёгкого трека «сложность и риск ≤3» не пройден). + +**Вердикт: зелёный** + +--- + +## Скоуп проверки (по дельте, PROCESS.md §2.10) + +r1 (`docs/reviews/SPEC-REVIEW-584-r1.md`, вердикт жёлтый, единственная блокирующая +находка — Medium «влияние на touch не названо явно») получен на редакции тела +issue от комментария Matysh `2026-09-16T19:33:08Z`, репозиторий `dev @ +7c5fd32a08f07177d55905d65990180a354dd0ec`. + +Материал этого раунда — правка тела issue, описанная комментарием +`IC_kwDOTOcLQM8AAAABU_SjEQ` («Правка ТЗ по r1», Matysh, `2026-09-16T19:43:56Z`). +GitHub не хранит блоб-хеш редакций тела issue, поэтому дельта установлена +через `updated_at` issue (`2026-09-16T19:43:58Z`, `gh api +repos/Matysh/houseplan-card/issues/584`) — момент правки совпадает с моментом +комментария об этой правке день-в-день до секунды, и `timeline` этого issue не +показывает других событий `edited` ни до, ни после. Автор объявил дельту явно: +добавлены ровно два новых раздела, «Touch, View и киоск» и «Безопасность», +между «Затронутые файлы и модули» и «i18n» — так они и стоят в текущем теле. +Контракт (пп.1–8), все AC1–AC8, «Пользовательский сценарий», «Что человек +увидит», «Совместимость и миграция», «Производительность», «Риски», «Принятые +предположения» посимвольно совпадают с тем, что цитирует и пересказывает +документ r1 — перепроверке не подвергались, см. «Унаследовано из r1» ниже. + +**Отдельно к процессу, не находка по ТЗ:** сам вердикт r1 (комментарий +`IC_kwDOTOcLQM8AAAABU_RNJw`) не называет SHA/дерево материала в теле +однострочного вердикта — SHA есть только в полном документе, в блоке +«Материал раунда». §2.3 требует `sha256` нормализованного тела ТЗ в блоке +якорей документа ревью; в `SPEC-REVIEW-584-r1.md` вместо хеша — метка времени +комментария. Хеш не мешает найти материал (issue один, правок тела было ровно +одна, `updated_at` подтверждает), поэтому это не блокирует r2, но фиксирую как +пробел оформления r1, а не задачи: следующему автору документа стоит класть +`sha256` тела в анкор, как предписано §2.3. + +Читаны заново для этого раунда: `docs/SCOPE.md` (уже читан по факту, сверка +скоупа не изменилась), `PROCESS.md` §2.4/§2.5/§2.10/§7.1/§7.2, текущее тело +issue #584 целиком, все 8 комментариев, `docs/reviews/SPEC-REVIEW-584-r1.md` +из коммита `1c0ed731`. + +## Что проверено в дельте + +Дельта — два новых раздела. Оба содержат новые фактические утверждения, +которых не было в r1, поэтому они сверены с кодом (репозиторий на SHA +`1c0ed731`, рабочая копия), а не приняты на слово: + +| Утверждение делты | Проверка | Результат | +|---|---|---| +| «жесты, hit-area мебели и положение хэндлов `resize`/`rotate` считаются от физического бокса фигуры, а не от art-координат» | `src/houseplan-card.ts:8921` — `furnitureRenderTransform(sh, W, H, art.viewW, art.viewH)` берёт `sh` (сохранённый физический box: `x/y/w/h` из конфига) как первый операнд; hit-path (`dfurniturehit`) использует тот же `tr` | подтверждено — хэндлы и хит-путь строятся от `sh`, а не от art-координат | +| «halo выделения по-прежнему строится по пути символа (#383) и вместе с ним станет ровно таким же, как видимая геометрия» | `src/houseplan-card.ts:8921-8938`: `dfurniturehit` (halo/hit) рендерится с тем же `d="${art.d}"` и тем же `transform=${tr}`, что и видимый `dfurn`-path, отличие только в `stroke-width` | подтверждено дословно; `furnitureRenderTransform` промаркирован в `src/furniture.ts:605` как «One canonical transform for visible art, selection halo and future consumers» | +| «Плановые SVG… генератор проверяет их формат сам — активный XML, внешние ссылки и посторонние теги отвергаются (существующий контракт `svgArt`…)» | `scripts/generate-furniture-assets.mjs:60-96`, функция `svgArt`: отклоняет ``, разрешает только теги `svg/g/path`, для `` — только атрибуты `d/fill/stroke/stroke-width/stroke-linecap/stroke-linejoin` | подтверждено — контракт уже существует и уже отклоняет ровно перечисленное; расширение пп.2/5 (границы, единственный path, `M`) в текущем `svgArt` действительно ещё не реализовано — соответствует контракту п.1/2/5 и AC5, которые эта задача добавляет | +| «Отдельно фиксируется AC7» | текст AC7 в теле issue: «правка ограничена паком, генератором, `src/furniture.ts` и тестами; редактор, hit-area, привязка к стенам, схема конфига и i18n не меняются» | согласовано — новый раздел Touch не противоречит AC7, а прямо на него ссылается | +| «Сетевых вызовов, прав, пользовательского ввода и разбора внешних данных задача не трогает» | сверено с диапазоном затронутых файлов из контракта (assets pack, генератор, `src/furniture.ts`, generated art/catalog, тесты) — ни один не относится к сети/правам/пользовательскому вводу | согласовано | + +Ни одна новая формулировка не оказалась догадкой, выданной за факт: обе секции +описывают код, который уже существует именно так, как написано. + +## Закрытие раунда r1 + +| Находка r1 | Чем закрыта | Где это видно | +|---|---|---| +| Medium (блокирующая): ТЗ не называет влияние на touch — DoR §2.5 требует явный пункт («View и киоск — блокирующие»), в тексте не было слов «touch»/«киоск» | Добавлен раздел «Touch, View и киоск» с явным «Влияния нет, и это утверждение, а не следствие», обоснованием через физический бокс (не art-координаты) и ссылкой на AC7 | Тело issue #584, `## ТЗ` → раздел «Touch, View и киоск» (между «Затронутые файлы и модули» и «Безопасность») | +| Low (снята с записью в r1, не требовала правки): разделы «UX» и «скоуп/не-скоуп» без отдельных заголовков | Не правилось — автор в комментарии `IC_kwDOTOcLQM8AAAABU_SjEQ` явно объяснил отказ (содержание уже в AC7, заголовки добавили бы длину без нового утверждения); ревьюер r1 уже снял находку с записью, повторно не требуется | Комментарий «Правка ТЗ по r1» | +| Low (снята с записью в r1): security не назван даже «нет» | Закрыта с запасом: добавлен явный раздел «Безопасность» с «Влияния нет» и обоснованием (свойства `svgArt` уже отклоняют активный XML/внешние ссылки/посторонние теги) | Тело issue #584, `## ТЗ` → раздел «Безопасность» | +| Low (снята с записью в r1): формула допуска AC3 не зафиксирована числом | Осталась как есть — намеренное решение, автор подтвердил (технический вопрос, не продуктовый, §7.1) | Комментарий «Правка ТЗ по r1» | + +## Унаследовано из r1 + +Принято без повторной проверки в этом раунде — как уже проверенное и +неизменное содержимое, задокументированное в `docs/reviews/SPEC-REVIEW-584-r1.md` +(коммит `1c0ed731`, материал: тело issue на редакции `2026-09-16T19:33:08Z`, +`dev @ 7c5fd32a`): + +- Соответствие `docs/SCOPE.md` (искажённый физический масштаб мебели делает + план визуально недостоверным — это J1/J4 в буквальном смысле «то, что видно + на плане»). +- Контракт пп.1–8 — однозначность и проверяемость против кода (44 плановых + SVG, `furnitureRenderTransform`, `parseSvgPath`, `kitchen_floor`/`dishwasher` + 60×60, `plant` 2%, `paths.join(' ')` в генераторе). +- AC1–AC8 — формулировки и способ доказательства (unit / unit-generator / + golden / review / гейты) для каждого. +- Продуктовые вопросы Q1 (видимый габарит = осевая линия контура, обводка не + входит) и Q2 (без миграции, центрирование в прежнем физическом боксе) — + закрыты владельцем предметно, открытых продуктовых вопросов не осталось. +- Блок «Принятые предположения» (аналитическая проверка границ без браузера; + legacy-примитивы остаются кодом, не переводятся в SVG-пак) оформлен по + §7.1. +- Откат («возврат коммита») и совместимость (без миграции, `x/y/w/h`, угол, + зеркалирование сохраняются) — корректны для правки без миграции конфига. +- Риски (маскировка регрессии golden-пересъёмкой; склейка путей как + единственное место, где легко молча испортить геометрию; рост ленивого + чанка art) — предметны и покрывают специфику задачи. +- §7.1 обязательные разделы присутствуют по содержанию (кроме двух устранённых + в этом раунде пробелов — touch и security). + +## Находки + +Блокирующих (High) нет. Находок Medium, требующих правки в этом раунде, нет — +единственная Medium-находка r1 закрыта (см. таблицу выше). Новых находок по +содержанию дельты не появилось. + +## Что проверено и корректно + +- Оба новых раздела фактически точны и сверены с кодом построчно (см. + таблицу «Что проверено в дельте») — ни одна фраза не оказалась + недоказанным допущением. +- Новые разделы не создают противоречия с AC7 и с контрактом пп.1–8: они + ссылаются на существующие ограничения, а не вводят новые обещания + поведения. +- DoR §2.5 теперь закрыт по всем пунктам: ТЗ + зелёное ревью, нумерованные + AC1–AC8 со способом доказательства, затронутые файлы, i18n («нет» явно), + миграция/совместимость решены, touch по `TOUCH-SUPPORT.md` назван явно, + производительность названа, release-артефакты (changelog RU+EN, golden, + перф, security) перечислены или явно «нет», откат описан, открытых + продуктовых вопросов нет, риски перечислены. +- Правка по замечанию (§2.10, «правка способна сломать AC, который + предыдущий раунд признал выполненным») не задела ни один AC: новые разделы + не переопределяют геометрию, transform или scope контракта, только + формулируют явно то, что уже следовало из AC7. + +## Чего не проверял + +- Не перепроверял заново AC1–AC8 по коду/паку — кода и ассетов по задаче в + репозитории ещё нет (реализация не начата, issue всё ещё на этапе ТЗ); + это предмет код-ревью, не этого раунда. +- Не проверял повторно факты, не задетые дельтой (44 SVG, `parseSvgPath`, + генератор, `plant`, `kitchen_floor`/`dishwasher`) — они наследуются из r1 + без изменений, дельта их не касается (см. «Унаследовано из r1»). +- Не запускал гейты (`npm test`, `furniture:check`, `golden:verify` и т.п.) — + на этапе ревью ТЗ нет ни строки кода/ассета для прогона; это часть §8 на + этапе код-ревью. +- Не проверял, положил ли предыдущий ревьюер `sha256` тела ТЗ в анкор + документа r1 (§2.3) — не положил; отмечено выше как пробел оформления, + не как блокирующая находка этого раунда. + +## Итог + +Единственная блокирующая находка r1 закрыта точным попаданием — явным +разделом «Touch, View и киоск» с обоснованием через уже зафиксированный в +контракте механизм (физический бокс, а не art-координаты) и прямой ссылкой на +AC7. Дельта также добавила раздел «Безопасность», закрывающий Low-находку r1 с +запасом. Обе новые формулировки проверены по коду и точны. DoR §2.5 выполнен +по всем пунктам. High нет, Medium нет — вердикт зелёный, задача уходит в +`S5-ready`. + +--- + +## Материал раунда + +- **Issue:** https://github.com/Matysh/houseplan-card/issues/584 +- **Материал ТЗ r2:** тело issue #584, раздел `## ТЗ`, редакция после правки + комментарием `IC_kwDOTOcLQM8AAAABU_SjEQ` (Matysh, `2026-09-16T19:43:56Z`), + `updated_at` issue = `2026-09-16T19:43:58Z` (`gh api + repos/Matysh/houseplan-card/issues/584`). +- **Материал ТЗ r1 (для дельты):** тело issue на редакции комментария + `IC_kwDOTOcLQM8AAAABU_J7Fg` (Matysh, `2026-09-16T19:33:08Z`), как + зафиксировано в `docs/reviews/SPEC-REVIEW-584-r1.md`. +- **Репозиторий на момент ревью:** `1c0ed73133b3718c19f1c8c0bd1b05f0f208d4b2` + (рабочая копия; кода по задаче ещё нет, использован только для сверки + фактических утверждений ТЗ с текущим состоянием `src/`, `scripts/`). + +--- + + + +## Материал раунда + +- Ветка: `dev`, коммит `1c0ed73133b3` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. +- Дерево материала: `9bf8c6df56d7886a9dfe6d6930424846ee92aaa3` + ``` + git log --all --format='%H %T' | grep 9bf8c6df56d7 + ``` +- Тело issue: `2b6d41955420844101142131ce4f789615f0ac788609ae654f4b416448b03b9b` +- Вердикт конвейера: `green` · High 0