17 KiB
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зелёный на SHAf02af9330b17a37eea6c8086f4335cbbc7265d36) — код-ревью её не переоткрывало ни в 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 на этом самом SHAbe932910(ссылка выше, 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.
Материал раунда
- Ветка:
issue/508-summary-dialog-scroll, коммитbe93291065a5— ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. - Дерево материала:
7499e3434f083728210a04ff0d1237202bf30bbegit log --all --format='%H %T' | grep 7499e3434f08 - Вердикт конвейера:
green· High 0