Files
houseplan-card/docs/reviews/CODE-REVIEW-508-r3.md
T
2026-09-09 20:55:09 +00:00

207 lines
17 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-508-r3
Issue: #508 — «Сводная панель: в диалоге настроек не работает прокрутка — колесом мыши и touch на мобильных»
Материал: `be93291065a54f8152d0f1945bde973c10613d36` (рабочая копия уже на нём).
Заход: r3 · блокирующих циклов израсходовано 0 из 2 (лёгкий трек — лимит код-ревью общий, не «2»
для спека; счётчик циклов см. ниже).
## Почему вообще r3, если r1 и r2 уже были зелёными без находок
`git log --oneline origin/dev..HEAD`:
```
be932910 docs: review document for #508
6ac513ca docs: review document for #508
e38beed7 fix: the summary panel settings dialog scrolls in Home Assistant
```
Ровно три коммита поверх `origin/dev`, ребейза с момента r2 не было (в отличие от r1→r2, где ветку
перебазировали на ушедший вперёд `dev`). Один функциональный коммит — `e38beed7` (уже проверенный
в r1 и переподтверждённый байт-в-байт в r2). Два следующих — `6ac513ca` и `be932910` — не что иное
как публикация конвейером собственных документов предыдущих раундов ревью:
`6ac513ca` добавляет `docs/reviews/CODE-REVIEW-508-r1.md` (123 строки), `be932910` добавляет
`docs/reviews/CODE-REVIEW-508-r2.md` (193 строки). Ни один из них не трогает ни строки продукта.
Материалом r2 был явно назван `6ac513caa09a8e583869879412aa3a0c67d04488`
(`docs/reviews/CODE-REVIEW-508-r2.md:4`). Дельта r2→r3:
```
git diff 6ac513ca..be932910 --stat
docs/reviews/CODE-REVIEW-508-r2.md | 193 +++++++++++++++++++++++++++++++++++++
1 file changed, 193 insertions(+)
```
Это ровно случай, описанный в `AGENTS.md` («Do not merge into `dev` by hand»,
абзац про #499): «When the only difference from the reviewed material is the pipeline's own
review-document commit, the next run re-applies the green verdict without calling the model».
Формально этот раунд не должен был доходить до модели вообще — но, как и после r1 (см. комментарии
issue: «Автоматическое ревью не отработало… Статусная метка не менялась»), автоматическая
перестановка метки/повторное применение вердикта снова не сработало, и модельное ревью запущено
повторно. Это техническое повторение уровня механики конвейера, а не возврат на правки: автор с
момента r1 не менял ни кода, ни ТЗ.
Раздела «находка → возврат → правка» в этом раунде по существу нет — ниже задокументирована
проверка того, что дельта действительно пуста по продукту, а не принята на слово.
## Скоуп
Не изменился с r1/r2: один функциональный коммит `e38beed7` — класс A (`src/hp-dialog.ts`,
`src/summary-panel-editor.ts`) + класс B (`demo/smoke_summary_dialog_scroll.mjs`,
`test/hp-dialog-contract.test.mjs`, два мутанта в `scripts/mutation-gate.mjs`) + класс C
(`docs/ARCHITECTURE.md`, оба CHANGELOG) + класс D (пересобранный бандл во всех копиях,
`docs/images/screenshots.json` — только фингерпринт). `hp-dialog` получает opt-in булев атрибут
`flex-content` (`?flexcontent` на `ha-dialog`, обе HA-ветки рендера); нативная `<dialog>`-ветка не
тронута. Диалог настроек сводной панели — единственный из десяти вызывающих `<hp-dialog>`, который
его объявляет.
J1 (`docs/SCOPE.md`) — обзорная сводная панель входит в «show the whole home at a glance»; чистый
баг-фикс регресса после #505, скоуп не расширен, продуктовый договор не меняется.
## Как проверялось
Первый шаг — не поверить заявлению «дельта r2→r3 это только паблиш-коммит», а доказать его (см. выше
`git diff 6ac513ca..be932910 --stat`), и дополнительно исключить более широкий рассинхрон:
```
git diff e38beed7..HEAD -- . ':!docs/reviews' --stat → пусто
```
То есть от коммита фикса `e38beed7` до текущего HEAD `be932910` **ни один файл вне `docs/reviews/`**
не изменился ни на байт — ни `src/**`, ни тесты, ни бандл, ни changelog, ни `docs/images/screenshots.json`.
Продуктовый код текущего материала побайтово идентичен коду, который уже дважды получил зелёный
вердикт с личными прогонами гейтов, мутантов и смоков (r1 — на `768e1281`, r2 — независимо
переподтверждено исполнением на `6ac513ca` после ребейза). Все выводы AC1–AC6 из r1/r2 остаются в
силе автоматически.
### Дешёвые гейты
Validate на `be932910` — success, подтверждено напрямую:
```
gh run view 34403312576 --repo Matysh/houseplan-card --json headSha,conclusion,status
→ {"conclusion":"success","headSha":"be93291065a54f8152d0f1945bde973c10613d36","status":"completed"}
```
`headSha` совпадает с материалом раунда. `tsc`, `npm test`, `npm run build` со сверкой бандла —
покрыты этим прогоном, повторно не гонял: код с r2 не изменился (доказано диффом выше), а сам прогон
состоялся уже на итоговом SHA этого раунда, не на промежуточном.
### Что не потребовалось прогонять лично
Поскольку дельта r2→r3 не касается ни одного файла продукта, теста, смока или бандла — только двух
markdown-файлов ревью-документов, — новых причин перегонять `check-docs` (диф не трогает `src/**`),
смоки, мутанты, golden, `invariants` или `pytest` в этом раунде нет: они уже прогнаны лично в r1
(на идентичном коде) и переподтверждены исполнением в r2 (на идентичном коде после ребейза). Смотри
раздел «Унаследовано из r2» — там же таблица AC, которую заново выводить не по чему: дельта её не
задевает.
Единственная проверка, которую стоило сделать заново именно для r3, — не «те же ли гейты снова
зелёные», а «действительно ли материал r3 это тот же код» — она выполнена выше диффом и является
самостоятельным доказательством, а не переносом чужого вывода.
## Закрытие раунда r2
Код-ревью r2 не имело находок (High 0, Medium 0, Low 0) — блокирующих находок для закрытия нет.
| Находка r2 | Статус | Где видно |
|---|---|---|
| (нет находок) | — | `docs/reviews/CODE-REVIEW-508-r2.md`, раздел «Находки»: «Нет. High: 0, Medium: 0, Low: 0» |
## Унаследовано из r2
Без повторного самостоятельного вывода, но с проверкой байт-в-байт идентичности продуктового кода
(раздел «Как проверялось» выше — `git diff e38beed7..HEAD -- . ':!docs/reviews'` пуст), наследую из
`docs/reviews/CODE-REVIEW-508-r2.md` (материал `6ac513caa09a8e583869879412aa3a0c67d04488`):
- диагноз (scroll chaining обрывается на height-unbound `.summary-editor` под `ha-dialog`,
`overflow: auto` + `overscroll-behavior: contain`), независимо подтверждённый автором на живом
стенде HA 2026.9.1 — не только в стабе смока;
- полную таблицу «AC → доказательство → чем краснеет» (AC1–AC6) — код и тесты, на которых она
построена, не изменились ни строкой;
- личные прогоны `test/hp-dialog-contract.test.mjs` (3/3), `check-docs` (7 files, 12 links),
`bundle-sync` (три копии согласованы), `demo/smoke_summary_dialog_scroll.mjs` (AC1/AC2 — 14/14),
`demo/smoke_summary_panel_polish.mjs` (AC3), `demo/smoke_dialog_modal_recovery.mjs`,
`demo/smoke_esc_dialogs.mjs`, `demo/smoke_dialog_footer_width.mjs`, оба защитных мутанта
(`summary-dialog-drops-flex-content`, `hp-dialog-ignores-flex-content` — «поймано 1 из 1» каждый) —
выполнены на `6ac513ca`, применимы без изменений к `be932910`, поскольку продуктовый и тестовый код
между ними идентичен;
- решения «не проверял»: `golden:verify` (opt-in атрибут, golden-сцен диалога панели нет),
`pytest tests_backend` (диф не про Python), полная матрица смоков/перф-профили (`smoke-select` —
«НЕОПРЕДЕЛЁННОСТЬ», выбор сужен вручную до прямого совпадения + зарегистрированных связей),
`npm run invariants` (диф не про геометрию/`layout`/`marker.space`);
- трассировку к спек-ревью (`SPEC-REVIEW-508-r1.md` жёлтый → `SPEC-REVIEW-508-r2.md` зелёный на SHA
`f02af9330b17a37eea6c8086f4335cbbc7265d36`) — код-ревью её не переоткрывало ни в r1, ни в r2, не
переоткрывает и сейчас: текст issue с тех пор не менялся.
## AC → доказательство (унаследовано без повторного вывода, см. выше)
| AC | Статус |
|---|---|
| AC1 (HA-ветка: колесо крутит `.summary-editor`, шапка/футер неподвижны) | доказан, `smoke_summary_dialog_scroll` сценарий (a) — код не менялся с r2 |
| AC2 (touch 390×844 крутит редактор; диалог ≤ вьюпорта; футер доступен) | доказан, сценарий (b) — код не менялся с r2 |
| AC3 (нативная ветка не меняется) | доказан, `smoke_summary_panel_polish` — файл смока по-прежнему не в диффе |
| AC4 (прочие 9 `hp-dialog` без `flex-content`) | доказан, `test/hp-dialog-contract.test.mjs` — код теста не менялся |
| AC5 (оба мутанта пойманы) | доказан — мутанты и продукт не менялись |
| AC6 (`User-Visible: yes`, оба changelog, i18n/модель/перф не задеты) | доказан чтением — коммит `e38beed7` тот же самый |
## Одно число — один источник
Диф не вводит и не дублирует ни одну видимую пользователю величину. Ничего не изменилось с r2, где
это уже проверено; дельта r3 (два markdown-файла ревью) не содержит вообще никаких величин,
видимых пользователю.
## Что проверено и корректно
- Дельта r2→r3 состоит ровно из одного файла, `docs/reviews/CODE-REVIEW-508-r2.md` — публикация
ревью-документа предыдущего раунда конвейером, не правка автора.
- Продуктовый код, тесты, бандл, changelog, документация (кроме `docs/reviews/`) между `e38beed7` и
текущим HEAD побайтово идентичны — доказано `git diff --stat` с пустым результатом.
- Validate зелёный на точном SHA материала (`be932910`), headSha совпадает — проверено напрямую
через `gh run view`.
- Ребейза с r2 не было (`origin/dev..HEAD` — ровно три коммита той же ветки), поэтому это
действительно раунд «по дельте» (§2.10), а не «разбор полный» по правилу ребейза.
## Находки
Нет. High: 0, Medium: 0, Low: 0.
## Чего не проверял и почему
- Полный `npm test`, `tsc`, `npm run build` вживую — покрыты Validate на этом самом SHA `be932910`
(ссылка выше, headSha сверен), а не на промежуточном; продуктовый код с r2 не изменился.
- Смоки, мутанты, `check-docs`, `bundle-sync` — не перегонял лично в этом раунде: дельта их не
задевает (ни один из изменившихся файлов не входит в их область), а на идентичном коде они уже
лично прогнаны и зафиксированы в r1/r2 с результатами.
- `golden:verify`, `pytest tests_backend`, полная матрица смоков, перф-профили, `npm run invariants` —
решение то же, что в r1/r2, и по той же причине (opt-in атрибут без влияния на golden-сцены; диф не
про Python; не в AC/`smoke-select`; диф не про геометрию) — не переигрывал повторно, так как
предпосылки решения (состав диффа) не изменились.
## Вердикт
Зелёный. Разбор — по дельте (§2.10), ребейза не было. Дельта r2→r3 — исключительно публикация
конвейером ревью-документа r2, продуктовый код и тесты байт-в-байт идентичны материалу r2, что
доказано диффом, а не принято на слово. Validate зелёный на точном SHA материала. Находок нет.
Раунд не образует цикл (§4) — вердикт зелёный.
Отдельное наблюдение вне находок задачи: этот раунд полностью соответствует условию AGENTS.md
(#499) «единственное отличие от материала — паблиш-коммит ревью-документа конвейера» — по этому
правилу перестановка метки должна была произойти автоматически, без модельного вызова. Она снова
не произошла (как и после r1), и это тот же класс сбоя механики, что уже отмечен в комментариях
issue после r1 и r2. Находкой в рамках code-review #508 это не является (инфраструктура конвейера
вне скоупа задачи), но стоит того, чтобы владелец знал: сбой перестановки метки после зелёного
вердикта повторился третий раз подряд на одном и том же issue.
---
<!-- material-anchors: сгенерировано конвейером (#414) -->
## Материал раунда
- Ветка: `issue/508-summary-dialog-scroll`, коммит `be93291065a5` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
- Дерево материала: `7499e3434f083728210a04ff0d1237202bf30bbe`
```
git log --all --format='%H %T' | grep 7499e3434f08
```
- Вердикт конвейера: `green` · High 0