Files
houseplan-card/docs/reviews/SPEC-REVIEW-584-r2.md
T
claude[bot] e0b16c76d7
Проверка (CI) / Классификация изменённых файлов (push) Successful in 27s
Проверка (CI) / Мутанты по диффу (1/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (2/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (3/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (4/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (5/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (6/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Предполёт: документация, провенанс, процесс (push) Failing after 46s
Проверка (CI) / Переиспользование: это дерево уже проверено (push) Successful in 1m17s
Проверка (CI) / HACS: валидация репозитория (push) Failing after 20s
Проверка (CI) / Hassfest: манифест интеграции (push) Failing after 17s
Проверка (CI) / Геометрия: TS/Python parity исполнена (push) Successful in 3m24s
Проверка (CI) / Бэкенд: pytest в Home Assistant (push) Failing after 8m20s
Проверка (CI) / Фронтенд: типы, юниты, мутанты, синхрон бандла (push) Failing after 11m18s
Проверка (CI) / Смоки в браузере (шард 1 из 3) (push) Skipped
Проверка (CI) / Смоки в браузере (шард 2 из 3) (push) Skipped
Проверка (CI) / Смоки в браузере (шард 3 из 3) (push) Skipped
Проверка (CI) / Смоки: все шарды зелёные (push) Skipped
Проверка (CI) / Golden-кадры против принятых эталонов (push) Skipped
Проверка (CI) / Перф-смок: бюджет времени кадра (push) Skipped
Проверка (CI) / Доказательство выполненных проверок (push) Failing after 16s
docs: review document for #584
Issue: #584
User-Visible: no
2026-09-16 19:50:17 +00:00

181 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`/`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/`).
---
<!-- material-anchors: сгенерировано конвейером (#414) -->
## Материал раунда
- Ветка: `dev`, коммит `1c0ed73133b3` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
- Дерево материала: `9bf8c6df56d7886a9dfe6d6930424846ee92aaa3`
```
git log --all --format='%H %T' | grep 9bf8c6df56d7
```
- Тело issue: `2b6d41955420844101142131ce4f789615f0ac788609ae654f4b416448b03b9b`
- Вердикт конвейера: `green` · High 0