mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
@@ -0,0 +1,168 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user