Issue: #584 User-Visible: no
18 KiB
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: отклоняет <!DOCTYPE|<!ENTITY|<?|<!--|<script|<style>, разрешает только теги svg/g/path, для <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/dishwasher60×60,plant2%,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_atissue =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— ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. - Дерево материала:
9bf8c6df56d7886a9dfe6d6930424846ee92aaa3git log --all --format='%H %T' | grep 9bf8c6df56d7 - Тело issue:
2b6d41955420844101142131ce4f789615f0ac788609ae654f4b416448b03b9b - Вердикт конвейера:
green· High 0