diff --git a/docs/reviews/SPEC-REVIEW-179-r2.md b/docs/reviews/SPEC-REVIEW-179-r2.md new file mode 100644 index 00000000..df1d7f27 --- /dev/null +++ b/docs/reviews/SPEC-REVIEW-179-r2.md @@ -0,0 +1,113 @@ +# Ревью ТЗ — issue #179, цикл r2 + +- **Issue:** https://github.com/Matysh/houseplan-card/issues/179 +- **ТЗ:** `docs/specs/179-device-icons-redesign.md` (коммит `2310e6d`, ветка + `issue/179-device-icons-redesign`) +- **Трек:** обычный +- **Вердикт:** зелёный · цикл r2/4 · High: 0 · Medium: 0 · Low: 0 + +## Скоуп ревью + +Проверялась правка ТЗ, внесённая автором в ответ на `SPEC-REVIEW-179-r1.md` +(вердикт жёлтый, 5 Medium + 2 Low, все в скоупе). Скоуп этого цикла — точечный: +подтвердить, что каждая из 7 находок r1 закрыта фактически, а не текстом, и что +правки не внесли новых противоречий или непроверяемых мест. Продуктовый код +по-прежнему не существует (issue не дошёл до `S5-ready`), поэтому раздел +«Гейты» PROCESS.md §8 к этому циклу неприменим — как и в r1. + +## Как проверялось + +1. Прочитаны `docs/SCOPE.md`, `AGENTS.md`, `PROCESS.md` (§2.4, §7.1, §7.2, §8, + §12) и целиком `docs/reviews/SPEC-REVIEW-179-r1.md`. +2. Прочитано тело issue #179 и все комментарии (`gh issue view 179 --json + body,comments`), включая ответ автора от `2026-08-19T19:06:37Z` с перечнем + исправлений. +3. Получен точный diff редакции: `git diff 517a710 2310e6d -- docs/specs/ + 179-device-icons-redesign.md` — правка сверялась по факту изменённых строк, + а не по пересказу автора в комментарии. +4. **Архив дизайнера передекачан и распакован** (`sha256sum` совпал: + `63670C73E25D1E59DDAF1BE236F3D7F2FAC827B9B5D6DD4B77125EA9BC012025`), чтобы + независимо перепроверить факты, на которых основана правка: + - `grep -o feColorMatrix… "Light/Icon Default.svg"` → значения + `0.145098/0.156863/0.176471` = `37/255, 40/255, 45/255` — подтверждает + цвет тени из M1; + - `diff "Dark/Icon Default.svg" "Dark/Icon Default No Blur.svg"` → + единственное отличие — слой `foreignObject` с + `backdrop-filter:blur(20px)` и атрибут `data-figma-bg-blur-radius`; core/ + stroke/filter-тень (`filter0_ddi_104_1541`) идентичны — подтверждает + заявление M4/риска о сохранении геометрии; + - `diff "Light/Icon Default.svg" "Light/Icon Default No Blur.svg"` → файлы + побайтно идентичны, что согласуется с правилом «Light не содержит blur» и + с пометкой `deprecated: true, aliasOf: "Light/Icon Default.svg"` для + Light-варианта в `manifest.json` (у Dark-варианта такой пометки нет — + перепроверено `grep -n -i "no blur" manifest.json` и чтением окружающего + JSON, узел `qaFallback`); + - `grep -in "presence\|green" SPECIFICATION.md ACTIVE_ANIMATION_SPEC.md + DEVELOPER_HANDOFF.md` — подтверждает, что явного reason→color маппинга в + архиве по-прежнему нет (это ожидаемо: M2 требовал не найти маппинг в + архиве, а явно принять и промаркировать решение в ТЗ). +5. Сверена цитата `docs/TOUCH-SUPPORT.md` — таблица контракта содержит ровно + `| Device editor | … | Best effort |` — правка M5 воспроизводит источник + точно, без искажения формулировки. +6. Проверена трассируемость: `docs/specs/README.md` не расходится с ТЗ, + коммит `2310e6d` несёт корректные трейлеры `Issue: #179` / + `User-Visible: no`, изменения ограничены одним файлом ТЗ (класс C, + документация, что не требует отдельного issue сверх текущего). +7. Гейты не прогонялись — на этапе ревью ТЗ продуктового кода нет, раздел + неприменим (как и в r1). + +## Проверка находок r1 — построчно + +| # | Требование r1 | Что внесено в `2310e6d` | Проверка | +|---|---|---|---| +| M1 | Заменить `rgb(0 0 0 / …)` на `rgb(37 40 45 / …)` в §7.1 | Обе Light-тени переписаны на `rgb(37 40 45 / 12%)` / `rgb(37 40 45 / 18%)` | Подтверждено `feColorMatrix` в реальном SVG — закрыто | +| M2 | Явно зафиксировать mapping `presence→цвет` или исключить Green | §10.1/§10.4 получили mapping `presence→green, running/working/open/unlocked→amber, neutral→blue`; §20 п.9 маркирует это как явное техническое предположение | Архив по-прежнему не даёт этого маппинга текстом (перепроверено), решение корректно оформлено как предположение автора, а не выдано за факт архива — закрыто | +| M3 | Добавить easing в §10.2/§10.3 | Обе секции получили `cubic-bezier(.22,.61,.36,1)` | Совпадает с `@keyframes` в `Animated/Light(Dark)/Short Activity Animated.svg` и `Alert Animated.svg` (сверено в r1, повторно не перекачивал анимационные SVG — не менялись) — закрыто | +| M4 | Явное решение blur/No-Blur для Dark + запись в §17/AC13 | §7.1 фиксирует production = `Dark/Icon Default No Blur.svg`, `backdrop-filter` запрещён; риск и митигация добавлены в §17; AC13 явно требует отсутствия per-marker backdrop-composite layer | `diff` двух SVG подтверждает: различие ровно в blur-слое, геометрия/тень сохранены — закрыто, причём риск обоснован фактом, а не на глаз | +| M5 | Добавить тег `Touch editor: …` | Добавлена строка `Touch editor: best effort / intentionally degraded` в §11 | Совпадает с канонической записью `TOUCH-SUPPORT.md` («Device editor … Best effort») — закрыто | +| L1 | Отразить Light-only combo-эталоны в golden-матрице | §16.4 получил абзац: комбинации проверяются в обеих темах, Dark — по layer-contract, так как Dark combo-assets в архиве нет | Соответствует составу архива (5 Light-комбо-файлов, 0 Dark) — закрыто с явной записью | +| L2 | Снять или обосновать оговорку про `static_icon` unavailable-hover | Оговорка `unavailable hover запрещён` удалена из §7.3 | Мёртвый кейс убран — закрыто | + +Все 5 Medium и 2 Low из r1 закрыты точечными правками текста, без +затрагивания архитектуры, AC-нумерации или скоупа задачи. Новых расхождений +между текстом правки и архивом/каноническими документами не обнаружено. + +## Проверено и признано корректным (сверх таблицы выше) + +- Diff ограничен ровно тем, что заявлено в комментарии автора; посторонних + правок вне перечня r1 нет (`git diff 517a710 2310e6d` просмотрен целиком). +- Внутренняя согласованность новых формулировок: `§7.2` (таблица цветов), + `§10.1` и `§10.4` используют один и тот же mapping `presence/running-working- + open-unlocked/neutral` без расхождений между разделами. +- `AC8` и `AC13` обновлены синхронно с текстом §10 и §7.1/§17 — доказательство + (`pure resolver tests + DOM/style smoke` для AC8, `code assertion + + performance_smoke.mjs` для AC13) остаётся конкретным и проверяемым после + добавления новых пунктов. +- Обязательные разделы §7.1 PROCESS.md по-прежнему все на месте (правка их не + затронула); статус документа обновлён («ревизия 2 после жёлтого ревью r1»). +- Трейлеры коммита `2310e6d` (`Issue: #179`, `User-Visible: no`) корректны; + правка не меняет продуктовое поведение, только сам ТЗ-документ (класс C). +- Открытых продуктовых вопросов владельцу по-прежнему нет; все 7 находок были + техническими/точечными и решены автором без эскалации. + +## Чего не проверял + +- Часть проверок из r1 не повторялась, так как соответствующий текст ТЗ не + менялся в этой правке (полная геометрия 32/96 px, границы LQI, приоритет + замков, i18n-паритет, разделы §1–§6, §8, §9, §12–§15, §18–§19) — доверие к + r1 обосновано тем, что `git diff` подтверждает: эти строки не тронуты. +- Continuous/Short/Alert тайминги (кроме easing) не перепроверялись повторно + по `@keyframes` — они не менялись в этой редакции, полная сверка уже была в + r1. +- Figma-фреймы (`99:1290`, `104:1539`) не открывались — ревью ограничено + содержимым архива, как и в r1. +- Производительность не измерялась — кода нет; оценка M4/AC13 остаётся + решением на уровне текста, а не измеренным фактом. +- Гейты `typecheck`/`test`/`build`/smoke/golden не запускались — этап ревью + ТЗ, продуктового кода не существует, раздел неприменим. + +## Итог + +Все находки r1 закрыты фактически, каждая перепроверена по первоисточнику +(архив, `TOUCH-SUPPORT.md`, сам diff), а не принята на слово из комментария +автора. Новых Medium/High находок нет. ТЗ готово к разработке.