Files
houseplan-card/docs/reviews/CODE-REVIEW-532-r2.md
claude[bot] 41ae5e9986
Проверка (CI) / Классификация изменённых файлов (push) Successful in 52s
Проверка (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 1m29s
Проверка (CI) / HACS: валидация репозитория (push) Failing after 19s
Проверка (CI) / Hassfest: манифест интеграции (push) Failing after 15s
Проверка (CI) / Переиспользование: это дерево уже проверено (push) Successful in 43s
Проверка (CI) / Фронтенд: типы, юниты, мутанты, синхрон бандла (push) Failing after 11m44s
Проверка (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) / Бэкенд: pytest в Home Assistant (push) Failing after 7m45s
docs: review document for #532
Issue: #532
User-Visible: no
2026-09-11 17:12:06 +00:00

15 KiB

CODE-REVIEW-532-r2

Вердикт: зелёный · заход r2 · блокирующих циклов израсходовано 1 из 4 · High: 0 · Medium: 0

Материал: 1cfe7fa53c71b2ba595c92d1bdfc560f90242f40. Ветка приведена к dev конвейером: поверх головы задачи (a89bd1b8, тот же коммит, что автор назвал хендоффом r2) легло 7 коммитов dev (релиз v1.74.0 и посторонняя задача #533), ветка перемотана на a89bd1b8 → 1cfe7fa5. Это другой код по §7.2 — разбор ниже полный, а не только по дельте, хотя origin/dev..HEAD содержит всего 3 коммита самой задачи.

Скоуп

Issue #532 (не изменился с r1): тройной drop-shadow внешнего контура плана (.hp-paperg) жил в общем композиционном слое с планом, поэтому любая перерисовка плана (ховер, панорама) заново прогоняла три прохода размытия по габариту всего листа — в Firefox владельца ~9 к/с, 23 МБ текстур/кадр. Правка: will-change: filter на .stage.daycycle .hp-paperg, .hp-static-stage.daycycle .hp-paperg, уводящее отфильтрованную бумагу в свой слой. Побочный эффект контракта (К2, принят спек-ревью r2): промоушен делит SVG на два слоя, отчего диагональная штриховка стен антиалиасится иначе — 4 golden-кадра day-cycle-{dawn,day,dusk,night}-dark расходятся и пересматриваются отдельным коммитом на кандидате беты. Продуктовая рамка (View-режим как продукт для двух персон, docs/SCOPE.md) не тронута этим раундом — перечитал SCOPE.md, вывод не изменился.

Раунд r2 — это ровно исправление двух Medium-находок r1: оба чейнджлога и docs/SUN.md. Продуктовый код (src/styles/plan.styles.ts), смок (demo/smoke_daycycle_raster.mjs) и мутант (scripts/mutation-gate.mjs) байт-в-байт не изменились с r1 — доказано ниже, не заявлено.

Что изменилось между r1 и HEAD (доказательство байт-в-байт для остального)

git diff bb04f8605f9003c0ec6643359fa47af9319247bc ced9b416 -- \
  src/styles/plan.styles.ts demo/smoke_daycycle_raster.mjs \
  scripts/mutation-gate.mjs docs/images/screenshots.json

→ пустой вывод: коммит ced9b416 (содержимое головы задачи после ребейза) идентичен коммиту bb04f8605f90, который разобрало r1, по всем файлам кроме самих чейнджлогов/SUN.md. Единственный новый коммит раунда — 1cfe7fa53c71b2ba595c92d1bdfc560f90242f40 («Say what the day-cycle layer change does to the picture...»), и он трогает только docs/CHANGELOG.md, docs/CHANGELOG.ru.md, docs/SUN.md (14 строк, User-Visible: no).

Это не молчаливое доверие: равенство деревьев проверено мной командой выше, а не взято со слов автора.

Как проверялось

Validate на 1cfe7fa5 зелёный (https://github.com/Matysh/houseplan-card/actions/runs/34625301309) — tsc, npm test, npm run build+сверка бандла, check-docs.mjs не перегонял отдельно, кроме случаев ниже.

Прогнал сам (диф трогает рендер CSS через ced9b416, хоть и унаследованный от r1 — golden/смок/мутант не покрыты Validate):

Гейт Команда Результат
Сборка + синхронизация 3 копий бандла npm run build && npm run bundle:sync чисто, git status пуст после — рабочее дерево воспроизводит закоммиченный dist/custom_components/houseplan/frontend/demo/srv/assets побайтово
Смок-свидетель node demo/smoke_daycycle_raster.mjs OK, 8/8 (ratio: 0.78, другая машина, тот же порядок, что у автора 0.73–0.82)
Мутант node scripts/mutation-gate.mjs --id=daycycle-outline-not-promoted «тест покраснел, как обязан» — поймано 1 из 1, рабочее дерево осталось чистым после
Три копии бандла diff -q dist/houseplan-card.js custom_components/houseplan/frontend/houseplan-card.js + houseplan-assets.json идентичны
check-docs.mjs node scripts/check-docs.mjs passed (7 files, 12 external links)

Golden-матрицу (169 сценариев) и построчный анализ 4 кадров дневного цикла не перегонял — код, который её результат определяет (plan.styles.ts), байт-в-байт тот же, что r1 уже прогнало полностью (ровно 4 different, bbox и средний цвет посчитаны для всех четырёх кадров самостоятельно, см. docs/reviews/CODE-REVIEW-532-r1.md). Замена входа исключена диффом деревьев выше — прогон на неизменных байтах дал бы тот же результат, а сама матрица не из дешёвых.

Не прогонял: pytest tests_backend (бэкенд не задет), npm run invariants (диффа геометрии/модели/layout/marker.space/open_spans нет — раунд чисто документационный, а унаследованный код — чистый CSS), performance- профили Validate (не названы в AC), smoke-select заново (диф раунда — доки, не src/**; для унаследованного CSS-диффа r1 уже получило и задокументировало «НЕОПРЕДЕЛЁННОСТЬ» и обосновало решение не гонять смежные smoke_glow*/ smoke_discovery_filters кодом К3/К4 — не переоткрываю).

Закрытие раунда r1

Находка r1 Чем закрыта Где это видно
Medium-1: чейнджлоги утверждали «picture is unchanged, to the pixel» / «не изменилась ни на пиксель», что противоречит К2/AC3 (3.3–3.5 % пикселей расходятся) Коммит 1cfe7fa5 переписал обе записи: «The view is the same: the outline around the plan matches pixel for pixel, and the hatch inside the walls is anti-aliased a shade differently — splitting the layer moves it by a sub-pixel» (и симметрично по-русски) docs/CHANGELOG.md:9-12, docs/CHANGELOG.ru.md:15-17
Medium-2: docs/SUN.md приписывал коэффициент «×15» профилю Firefox, хотя измерен в headless Chromium через CDP Коммит 1cfe7fa5 разделил источники: «Measured in headless Chromium (CDP tracing, summed RasterTask) on a demo-stand pan, that cost about fifteen times…; the owner's Firefox profile that opened #532 showed the same cause as 23 MB of texture uploads per frame and about nine frames per second, without a comparable ratio of its own» docs/SUN.md:82-88

Проверил не по заявлению автора, а построчным чтением обоих файлов после правки (см. выше) — формулировки соответствуют находкам r1 дословно, включая рекомендованную ревьюером r1 замену «a Firefox window» → «our Chromium/CI measurement».

Унаследовано из r1

Без повторного прогона (дорогие гейты), на основании доказанного выше байт-в-байт равенства src/styles/plan.styles.ts, demo/smoke_daycycle_raster.mjs, scripts/mutation-gate.mjs между ced9b416 (голова этого раунда) и bb04f8605f9003c0ec6643359fa47af9319247bc (материал r1):

  • AC1/AC2/AC4 (подсказка стоит только под .daycycle, отношение растеризации ≤ 2.0, статичный фон не платит) — доказаны в r1 смоком + мутантом; я независимо перепрогнал оба на текущем SHA (таблица выше) вместо чистого наследования.
  • AC3 количественно (полная golden-матрица 169 сценариев: ровно 4 different; средний цвет и bbox расхождения посчитаны r1 лично для всех четырёх кадров day-cycle-*-dark, не только night-dark; семь «шумных» кадров подтверждены контролем на базе origin/dev тем же Chromium) — наследую без повторного прогона матрицы, см. документ docs/reviews/CODE-REVIEW-532-r1.md, SHA bb04f8605f9003c0ec6643359fa47af9319247bc.
  • Структурные факты кодом: demo/golden/matrix.mjs содержит ровно 4 сценария с bgMode: 'daynight'; svgScreenBlendSupported (src/glow-blend.ts) не читает bg_mode (К4 вне скоупа подтверждено кодом); .hp-paperg — только бумажные силуэты (src/houseplan-card.ts), не меняется на ховере/панораме. Файлы не изменились с r1 — наследую вывод.
  • Риск 5 ТЗ (smoke-select не находит связь для чисто-CSS диффа) — подтверждён независимо в r1, код не изменился — наследую.
  • Трейлеры и три копии бандла коммита ced9b416 (Issue: #532, User-Visible: yes, оба чейнджлога в одном коммите с поведением) — уже проверены в r1 и не менялись; коммит 1cfe7fa5 несёт свои корректные трейлеры (Issue: #532, User-Visible: no — меняется только формулировка, не поведение), проверено мной заново.

Что проверено и корректно (этот раунд)

  • Оба чейнджлога и docs/SUN.md больше не содержат ни одного из двух утверждений, отмеченных r1 как противоречащих контракту задачи; новые формулировки проверяемы читателем и не смешивают источники чисел.
  • 1cfe7fa5 несёт Issue: #532 и User-Visible: no — корректно: меняется только текст о поведении, не само поведение.
  • Рабочее дерево после npm run build && npm run bundle:sync совпадает с закоммиченными dist/**, custom_components/houseplan/frontend/**, demo/srv/assets/** побайтово (git status пуст) — сборка воспроизводима на этом SHA.
  • docs/images/screenshots.json не менялся в этом раунде (проверено диффом дерева) — отпечаток документации не поехал.
  • Продуктовый вопрос автора из хендоффа r1 («приемлема ли цена пересъёмки 4 эталонов») закрыт зелёным спек-ревью r2 и не переоткрывается: этот раунд не трогает К2/AC3 по существу, только их описание в публичных доках.

Чего не проверял

  • pytest tests_backend — custom_components/**/*.py не задет.
  • npm run invariants — геометрия/модель/layout/marker.space/ open_spans не задеты; унаследованный код — чистый CSS без геометрии.
  • Полная golden-матрица заново — код, который её результат определяет, не изменился (доказано диффом деревьев); повторный прогон на тех же байтах не добавляет информации, а гейт дорогой.
  • Performance-профили Validate — не названы в AC.
  • smoke-select заново — диф раунда лежит только в docs/**, инструмент по документации не разрешает связей; для унаследованного CSS-диффа ответ r1 («НЕОПРЕДЕЛЁННОСТЬ») не переоткрываю.
  • Приговор по настоящему Firefox (профиль владельца до/после этой конкретной правки текста) — вне возможностей код-ревью и не AC этой задачи.

Материал раунда: SHA 1cfe7fa53c71b2ba595c92d1bdfc560f90242f40, origin/dev..HEAD = 3 коммита (ced9b416 — голова задачи после ребейза, байт-в-байт равна материалу r1; 3322c20c — публикация документа r1; 1cfe7fa5 — исправление по r1, единственный содержательный коммит раунда). Полный разбор по указанию конвейера (ребейз через 7 чужих коммитов, §7.2), с опорой на доказанное byte-for-byte наследование дорогих гейтов из r1.

Предыдущий раунд: docs/reviews/CODE-REVIEW-532-r1.md, вердикт жёлтый, материал bb04f8605f9003c0ec6643359fa47af9319247bc.


Материал раунда

  • Ветка: issue/532-daycycle-raster, коммит 1cfe7fa53c71 — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
  • Дерево материала: 0da2d90f30f9e607782d065fe23fc1e770c7e676
    git log --all --format='%H %T' | grep 0da2d90f30f9
    
  • Тело issue: 12e66588332b94c78100156f01e4832881b8163fb6f8fdca83acfcb8e90f4545
  • Вердикт конвейера: green · High 0