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