# Код-ревью #593 — «Заменить все иконки библиотеки и расширить каталог до 60 плановых символов» Заход: **r2** · блокирующих циклов израсходовано **1/4** (после этого вердикта — не увеличивается: зелёный) Материал: `fc4d55c7cdb36d35889f85b55f3a8e42087575ac` (рабочая копия — HEAD, detached), 4 новых коммита после материала r1 (`7df2740f1ccc`). ## 1. Скоуп ревью Это второй заход. По PROCESS.md §2.9/§4 объём разбора — по дельте, а не заново: r1 (`docs/reviews/CODE-REVIEW-593-r1.md`) уже провёл полное ревью 245 файлов на `7df2740f` и признал 11 AC доказанными, найдя две находки Medium в скоупе (High — 0). Раунд закрыт жёлтым, вердикт вернул задачу автору без нового issue. Дельта r1→r2: ``` git diff --stat 7df2740f..fc4d55c7 ``` 4 коммита, 49 файлов, из них по существу — 2 текстовых файла (`docs/ARCHITECTURE.md`, `src/furniture-art-runtime.ts`, только заголовочный комментарий), 4 принятых golden- эталона, пересборка `dist/**`/`custom_components/.../frontend/**` (класс D, следствие правки комментария) и `docs/images/screenshots.json` (отпечаток скриншотов). Ни одна строка исполняемой логики не менялась — весь диф `src/furniture-art-runtime.ts` это JSDoc-комментарий (проверено `git diff` построчно, см. §3). Дельта локальна: не ребейз, не новая подсистема, не смена контракта поведения — полный разбор не требуется, разбираю только то, до чего дельта дотягивается. ## 2. Как проверялось Дешёвые гейты уже зелёные на этом самом SHA: Validate run [35442063854](https://github.com/Matysh/houseplan-card/actions/runs/35442063854), проверил `head_sha` через `gh api` — совпадает с `fc4d55c7cdb36d35889f85b55f3a8e42087575ac`, `conclusion: success`. Поэтому `npx tsc --noEmit`, `npm test` заново не гонял. Дополнительно (дёшево, и потому что «Golden-кадры» и «Смоки» в этом конкретном прогоне Validate вышли `skipped` — сработал шаг «Переиспользование: это дерево уже проверено», результат унаследован от прогона на предыдущем коммите дельты, а не получен заново на `fc4d55c7`; я перепроверил сам, а не доверился ярлыку): | команда | результат | |---|---| | `npm run build && npm run bundle:sync` | бандл собран заново; `diff -rq dist custom_components/houseplan/frontend` и `diff -rq dist demo/srv/assets` — совпадение (расхождение только по статичным SVG/`icons.js` демо-харнесса, не части бандла) | | `npm run furniture:check` | `Furniture pack OK: 60 plan symbols, 33 menu icons (generated files current)` | | `node scripts/check-docs.mjs --external --screenshots=strict` | `Documentation checks passed (7 files, 12 external links)` | | `node scripts/smoke-select.mjs --base 7df2740f --head fc4d55c7` | «Изменено файлов src/\*\*: 1 · символов на изменённых строках: 0» → НЕОПРЕДЕЛЁННОСТЬ; решение см. §5 | | `npm run golden:verify` (полная матрица, пересобранный бандль этой вершины) | 173/173 сцен `passed`, **0** `different`, **0** `missing-baseline` | Ручной проверкой кода (без исполнения): `git diff 7df2740f..fc4d55c7` построчно по всем нетривиальным файлам (`docs/ARCHITECTURE.md`, `src/furniture-art-runtime.ts`, `docs/images/screenshots.json`, тело issue §8/§9), провенанс коммитов (`Issue:`, `User-Visible:`, `Baseline-Reviewed:`/`Release:` на коммите с baselines), состав `scripts/mutation-registry.mjs` для `furniture-art-runtime.ts` (патчи адресуются `find/replace` по содержимому, а не по номеру строки — комментарий их не задевает). ## 3. Закрытие раунда r1 | находка r1 | чем закрыта | где это видно | |---|---|---| | **Medium 1** — `docs/ARCHITECTURE.md:249` называл «44 SVG drawings» и союз с примитивами, хотя ТЗ §9 явно требовало правки при таком условии | Коммит `ebc577d2`: абзац переписан — «the 60 SVG drawings», плюс новое предложение «Since #593 the library is designer artwork only — the twelve primitive symbols drawn from code are gone, so every piece waits for the chunk instead of twelve of them rendering regardless» | `git diff 7df2740f..fc4d55c7 -- docs/ARCHITECTURE.md`: было `the 44 SVG drawings live in…`, стало `the 60 SVG drawings live in… Since #593 the library is designer artwork only…`. То же условие закрыто и в коде: `src/furniture-art-runtime.ts` заголовок (коммит `0565c7ad`) — «The 60 designer symbols carry ~17 KB gzip… every piece now waits for this chunk instead of twelve of them rendering regardless. The `fallback` paragraph below is therefore the behaviour of the whole library, not of 48 pieces out of 60» — то же место, которое я называл источником путаницы в r1, теперь прямо снимает старое обещание. `grep -n "44" docs/ARCHITECTURE.md src/furniture-art-runtime.ts` — 0 совпадений | | **Medium 2** — golden-сцена `tray-narrow-palette-en` расходится (diffRatio 0,0022 на каноническом Chromium), но не объявлена в списке §8 ТЗ; команда `golden:accept` отказала бы приёмке необъявленной `different`-сцены | Тело issue обновлено (ред. 5, §8): таблица явно добавляет строку «`tray-narrow-palette-en` — different — **добавлена по ревью r1 M2**», рядом с уже объявленными `furniture-categories-light`, `furniture-placement-preview-light` и новой `furniture-new-symbols-light`. Эталоны фактически приняты коммитом `65e0c85d` со ссылкой на полный линуксовый прогон [35441152733](https://github.com/Matysh/houseplan-card/actions/runs/35441152733) (трейлеры `Baseline-Reviewed:`/`Release:` присутствуют) | Читал тело issue напрямую (`gh issue view 593 --json body`) — таблица §8 содержит все 4 сцены. Сам прогнал `npm run golden:verify` на пересобранном бандле `fc4d55c7` — **173/173 `passed`, 0 `different`, 0 `missing-baseline`**: `tray-narrow-palette-en` и `furniture-new-symbols-light` (была `missing-baseline` в r1) теперь совпадают с принятым эталоном. Находка закрыта не только текстом, но и исполнением | Оба Medium из r1 закрыты предметно, не декларативно: у M1 я прочитал текст обоих файлов (docs и код) после правки, у M2 — перегнал сам `golden:verify` и получил ноль расхождений, а не поверил хендоффу автора. ## 4. Унаследовано из r1 (без повторной проверки) Дельта не касается перечисленного ниже — принимаю выводы `CODE-REVIEW-593-r1.md` на SHA `7df2740f1ccc3bf14caeca1ae824eed853dda50f` без повторного исполнения: - **AC1–AC6, AC9, AC10** — пакет 0.4.0 (33/60, ID-совместимость, mapping категорий, сохранённые размеры, inert-generator, UX палитры, бюджеты-гейты, провенанс/лицензия). Ни один из файлов, участвующих в доказательстве (`pack.json`, `scripts/generate-furniture-assets.mjs`, `src/furniture.ts`, `scripts/bundle-budget.mjs`, `assets/furniture/houseplan-0.4.0/README.md`) не входит в дельту r1→r2 (`git diff --stat 7df2740f..fc4d55c7` их не перечисляет). - **AC8** (lazy split, отказ чанка для всех 60) — логика `furniture-art-runtime.ts` не менялась, только комментарий; смок `smoke_furniture_lazy_art.mjs` перепроверять незачем, поведение то же самое, что r1 уже подтвердил исполнением. - **AC11** (доказательства/команды) — методология хендоффа не изменилась. - Ловушка союза `LEGACY_FURNITURE ∪ GENERATED_FURNITURE_CATALOG` (§5 ТЗ) — код, закрывающий её, не в дельте. - i18n (7 ключей × 4 локали) — не в дельте. - Разбор мутаций (5 новых + 1 исправленный) — `scripts/mutation-registry.mjs` не в дельте. - Вывод «diff не касается geometry/invariants/Python backend» — состав дельты (см. `git diff --stat`) подтверждает то же самое и в r2: ни одного файла `custom_components/houseplan/**/*.py`, ни изменений в моделях комнат/толщины. ## 5. Находки Не найдено. High — 0, Medium — 0. Обе находки r1 закрыты предметно (см. §3). Новых дефектов в дельте не нашёл: обе правки — точечные текстовые изменения ровно там, где условие ТЗ §9 их требовало, без побочных эффектов на код или контракт. ## 6. Чего не проверял и почему - **`npx tsc --noEmit`, `npm test` «с нуля»** — не гонял отдельно: Validate зелёный именно на материале `fc4d55c7` (подтверждено `gh api`, см. §2). `npm run build` я всё же выполнил дважды — не ради этого гейта, а чтобы получить свежий бандл для `golden:verify`/сверки трёх копий; неявно typecheck подтверждён тоже (сборка чистая). - **`node demo/smoke_furniture*.mjs`, `smoke_decor.mjs` повторно** — не гонял: диф дельты не содержит ни строки исполняемой логики (`smoke-select.mjs` сам это показывает — 0 символов на изменённых строках), а r1 уже прогнал все релевантные смоки на той же логике на `7df2740f`. Инструмент вернул «НЕОПРЕДЕЛЁННОСТЬ», а не «прямое совпадение» или «связь» — я трактую это как отсутствие связи, потому что единственная изменённая строка кода — комментарий, не код. - **`python -m pytest tests_backend`** — diff дельты не касается `custom_components/houseplan/**/*.py` (`git diff --stat` подтверждает). - **`npm run invariants -- --config …`** — diff дельты не касается геометрии/ссылок; унаследовано из r1, дельта это не меняет. - **`node scripts/mutation-gate.mjs` полный прогон** — не гонял: диффовый mutation-gate — часть Validate, зелёного на этой вершине; сами мутанты, адресующие `furniture-art-runtime.ts`, патчат по `find/replace` строки кода, а не по номеру строки — комментарий их не сдвигает и не ломает (проверил чтением `scripts/mutation-registry.mjs:8755-8820`). - **`node scripts/process-gate.mjs --issues`** — не в компетенции код-ревью содержания. ## 7. Вердикт Обе Medium-находки r1 закрыты предметно: `docs/ARCHITECTURE.md` и заголовок `src/furniture-art-runtime.ts` больше не называют число 44 и не намекают на союз с примитивами, а перечень golden-сцен §8 ТЗ дополнен `tray-narrow-palette-en`, эталон для неё и для `furniture-new-symbols-light` принят с полного линуксового прогона и подтверждён трейлерами `Release:`/`Baseline-Reviewed:`. Сам перегнал `golden:verify` на пересобранном бандле этой вершины — 173/173 сцен `passed`, необъявленных расхождений нет. Дельта не тронула ни одной строки исполняемого кода (комментарий + документация + принятые эталоны), поэтому весь массив AC1–AC11, подтверждённый r1, наследуется без риска регрессии. Новых находок нет. **Вердикт: зелёный · заход r2 · блокирующих циклов 1/4 · High: 0 · Medium: 0** --- --- ## Материал раунда - Ветка: `issue/593-furniture-pack-0.4.0`, коммит `fc4d55c7cdb3` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. - Дерево материала: `3406b4590ff3a115016d03a9f6f5e5ce44d2945d` ``` git log --all --format='%H %T' | grep 3406b4590ff3 ``` - Тело issue: `f0feb60aec3d2ab0c475ea3b6ca6cb54cff91300c80121b963b7deb3528d1bdb` - Вердикт конвейера: `green` · High 0