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

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 зелёный на 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.


Материал раунда

  • Ветка: issue/508-summary-dialog-scroll, коммит be93291065a5 — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
  • Дерево материала: 7499e3434f083728210a04ff0d1237202bf30bbe
    git log --all --format='%H %T' | grep 7499e3434f08
    
  • Вердикт конвейера: green · High 0