Files
houseplan-card/docs/reviews/CODE-REVIEW-505-r2.md
T
2026-09-09 07:01:42 +00:00

169 lines
13 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.
# CODE-REVIEW-505-r2
Этап: code-review · заход r2 · блокирующих циклов израсходовано 0 из 4
Материал: `7b9af60541c017205e490f21b6787fe8159b1a2d` (рабочая копия уже на нём)
Прошлый раунд: CODE-REVIEW-505-r1, материал `d32dfc9be107dce72a2fa465413633caf717d1f5`, вердикт зелёный (High 0, Medium 0, Low 1), слит в `dev` как `f03a9e5d`.
## Скоуп раунда
r1 был полностью зелёным с единственной находкой Low L1: неиспользуемый ключ
локализации `summary.block_visible` остался во всех четырёх словарях
(`src/summary-panel-i18n.ts`) после замены чекбокса видимости блока на
eye/eye-off кнопку с новыми ключами `hide_block`/`show_block`. Автор вернул
задачу в `S6`, исправил находку одним узким коммитом и снова отправил на
`S7-code-review`. Это не рестарт расширенного скоупа (#505 в целом — три
поверхности по дизайнерскому прототипу), а точечный follow-up к принятому и
уже слитому в `dev` материалу.
Дельта раунда — ровно `f03a9e5d..7b9af605` (совпадает с `origin/dev..HEAD`,
один коммит):
```
docs/design/505-summary-panel/ACCEPTANCE.md | 16 ++++++++++++++
src/summary-panel-i18n.ts | 4 ----
+ пересборка custom_components/houseplan/frontend/** и dist/** (класс D)
```
Дельта локальна: одна строка убрана из четырёх словарей одного файла плюс
плановая пересборка бандла и запись в ACCEPTANCE.md. Рендер, CSS, события,
модель, shared-схема, geometry — не задеты. Разбор сужен до делты; AC1–AC11 и
весь остальной код r1 не проверялись заново (см. «Унаследовано из r1»).
## Закрытие раунда r1
| Находка r1 | Чем закрыта | Где это видно |
|---|---|---|
| Low L1: неиспользуемый ключ `summary.block_visible` во всех 4 словарях (`src/summary-panel-i18n.ts:55,124,193,262` в материале r1) | Ключ и его перевод ("Visible"/"Показывать"/"Sichtbar"/"Visible") удалены из всех четырёх словарей (`en`/`ru`/`de`/`fr`) одним коммитом | `git diff f03a9e5d..7b9af605 -- src/summary-panel-i18n.ts` — 4 удалённые строки, по одной на локаль; лично проверено `rg -n "block_visible" src demo test scripts custom_components` → 0 совпадений (только исторические упоминания в `docs/design/505-summary-panel/ACCEPTANCE.md` и `docs/reviews/CODE-REVIEW-505-r1.md`) |
Находка закрыта полностью и корректно: удаление симметрично по всем четырём
локалям (не оставляет расхождение набора ключей между словарями), сама
запись `dictionaries` — плейн-объект без строгого TS-интерфейса, требующего
идентичного набора ключей (`keyof typeof dictionaries` используется только
для выбора локали, не для проверки состава), поэтому симметричное удаление
не могло вызвать несоответствие типов. `tsc --noEmit` лично прогнан на
материале раунда — чисто.
## Унаследовано из r1
Без повторной проверки в этом раунде приняты (документ CODE-REVIEW-505-r1,
SHA `d32dfc9be107dce72a2fa465413633caf717d1f5`, слито в `dev` как `f03a9e5d`):
- AC1–AC11 целиком: split-control в шапке/kiosk, панель по макету
(`.summary-scroll`/`.summary-block`/карточки/разделители), диалог настроек
920px на подлинном pinned HA-компоненте, `SummaryPanelPresentation`
lifecycle (генерации, reversals, reduced motion, hard boundaries), удаление
`summary.sizes_title`/size-controls только из этого диалога, mobile-чекбокс
связан с local master-toggle, документация (оба CHANGELOG, USER-GUIDE,
ARCHITECTURE, STATUS) и трейлеры семи коммитов исходного скоупа.
- Все шесть mutation-gate witness'ов (`summary-hide-unmounts-before-animation`,
`summary-dialog-loses-wide-shell`, `summary-mobile-ignores-local-off`,
`summary-animation-stale-completion-unguarded`,
`summary-animation-reset-keeps-presentation`,
`summary-animation-ignores-reduced-motion`) — лично подтверждены в r1,
дельта r2 не касается кода, который они охраняют.
- Визуальная приёмка пяти контекстов (desktop light/dark, bottom, kiosk,
mobile) и настоящего HA-диалога (920px, mobile-fullscreen 390px) — лично
подтверждена в r1 по идентичному render/CSS/событийному коду; r2 не меняет
ни одного визуального артефакта (сам автор прямо не заявляет новую
пересъёмку, и это корректно: изменение — только мёртвая строка в
JS-словаре, не участвующая в рендере).
- Независимая проверка риска AC5 (`--ha-dialog-width-md: 920px` в подлинном
pinned HA-компоненте) — не переисследовалась, дельта её не касается.
Основание для наследования: дельта отсутствует в перечисленных областях
(`git diff f03a9e5d..7b9af605` не содержит правок вне `src/summary-panel-i18n.ts`
и `docs/design/505-summary-panel/ACCEPTANCE.md`, плюс класс D пересборка).
## Как проверялось (r2)
Зелёного Validate на материале раунда (`7b9af605`) на момент ревью не
найдено — гейты прогнаны лично на рабочей копии, уже стоящей на этом SHA:
- `npx tsc --noEmit` — чисто, без вывода.
- `npm test` — `2400 pass / 0 fail / 1 skipped` из 2401 (тот же skip, что и на
материале r1; не новый).
- `npm run build` → `git status --porcelain` после — пусто: собранный `dist/`
байт-в-байт совпал с закоммиченным, регенерация детерминирована.
- `npm run bundle:sync` — пересобрал и сверил все три копии дерева
(`dist`, `custom_components/houseplan/frontend`, `demo/srv/assets`);
`git status --porcelain` после — пусто.
- `node scripts/process-gate.mjs --range f03a9e5d..7b9af605` — «гейт пройден,
предупреждений 0» (проверка статуса issue пропущена намеренно, флаг
`--issues` не передавался — не относится к трейлерам/дельте).
- Трейлеры коммита `7b9af605` — `Issue: #505`, `User-Visible: no`, лично
прочитаны `git show 7b9af605`. `User-Visible: no` корректен: ключ
`summary.block_visible` уже был мёртвым (не рендерился) на момент r1 —
замена на eye/eye-off кнопки произошла в исходном скоупе, до этого
follow-up; удаление строки не меняет ни одного видимого текста. Оба
CHANGELOG закономерно не тронуты в этом коммите.
- `node demo/smoke_summary_panel_polish.mjs` на свежесобранном бандле — PASS
(лично прогнан, не только со слов автора).
- `node scripts/check-docs.mjs --screenshots=warn` — предупреждение о
устаревшем отпечатке скриншотов (ожидаемо: отпечаток покрывает весь `src/**`
и был устаревшим уже на материале r1 из-за исходного скоупа задачи; это
предрелизный, а не ревью-гейт, см. AGENTS.md). Строгий режим
(`node scripts/check-docs.mjs` без флага) даёт `ERROR` по той же причине —
ожидаемо на этой стадии, не новая находка этого раунда.
- `node scripts/smoke-select.mjs --base f03a9e5d --head 7b9af605` →
«НЕОПРЕДЕЛЁННОСТЬ» (0 символов проекта на изменённых строках — правки
только в строковых литералах словаря, не в исполняемых символах).
Инструмент не называет ни прямого совпадения, ни зарегистрированной связи.
Решение: не прогонять широкую матрицу смоков — единственный
затронутый смок по теме (`smoke_summary_panel_polish`) уже прогнан лично и
зелёный; удаление доказуемо-мёртвого i18n-ключа (grep пуст по всему дереву)
не имеет других поверхностей, которые способен затронуть широкий прогон.
Инварианты геометрии (`npm run invariants`), `golden:verify`, backend pytest,
полный набор 235 смоков и performance-профили не прогонялись: дельта не
трогает `layout`/`marker.space`/`open_spans`/толщину стен, рендер, стили,
backend или производительность — ни один пункт из списка обязательности этих
гейтов не задет диффом.
## Находки
Нет.
## Что не проверял
- Полный набор `demo/smoke_*.mjs` (235 штук) — выборка `smoke-select.mjs`
вернула «НЕОПРЕДЕЛЁННОСТЬ» без прямых/зарегистрированных связей, а сама
дельта (удаление мёртвого литерала) не имеет других правдоподобных
поверхностей отказа. Полный прогон остаётся предрелизной обязанностью.
- `npm run golden:verify`, `python -m pytest tests_backend -q`,
`npm run invariants`, performance-профили — дельта не меняет рендер,
геометрию, backend или производительность.
- Повторная визуальная пересъёмка панели/диалога/прототипа — дельта не
меняет ни один рендерящийся текст или стиль; наследуется из r1 (см. выше).
- `mutation-gate`/`check-inputs --coverage` — не перезапускались; ни одного
нового behavioural-контракта дельта не вводит, шесть witness'ов r1 её не
касаются.
## Вывод
Единственная находка предыдущего раунда (Low L1) закрыта точно так, как
описана: симметричное удаление мёртвого ключа из всех четырёх словарей,
без побочных изменений рендера/событий/модели. Дельта раунда узкая и
полностью укладывается в заявленный follow-up; расширенный скоуп задачи
(три поверхности по дизайнерскому прототипу) не пересматривался повторно —
он был принят r1 зелёным по коду, слитому в `dev`, и эта дельта его не
трогает. Новых находок нет.
Вердикт: зелёный · заход r2 · блокирующих циклов 0/4 · High: 0 · Medium: 0
---
<!-- material-anchors: сгенерировано конвейером (#414) -->
## Материал раунда
- Ветка: `issue/505-summary-panel-polish`, коммит `7b9af60541c0` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
- Дерево материала: `746fe338eb2465a2a26a96625b73c597a1247451`
```
git log --all --format='%H %T' | grep 746fe338eb24
```
- ТЗ `docs/specs/505-summary-panel-design-parity.md`, блоб `fed71b61cb26deae64fef8dc1a364d3401242d48`
```
git log --all --find-object=fed71b61cb26deae64fef8dc1a364d3401242d48 -- docs/specs/505-summary-panel-design-parity.md
```
- Вердикт конвейера: `green` · High 0