mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
docs: review document for #584
Проверка (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
Проверка (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
Issue: #584 User-Visible: no
This commit is contained in:
@@ -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`: отклоняет `<!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
|
||||
Reference in New Issue
Block a user