Files
houseplan-card/docs/reviews/CODE-REVIEW-627-r2.md
T
2026-09-24 14:51:30 +03:00

14 KiB
Raw Blame History

CODE-REVIEW-627-r2

Материал: 47d07281b6ced457ff3b1b25786bbe81e764a269 (рабочая копия уже на нём; git fetch/checkout не выполнялись). Дерево e19b817f43f3a9406513ddc7cc762deb2cc305eb — совпадает байт-в-байт с деревом, названным в блоке «Материал раунда» хендоффа r2 (комментарий 2026-09-24, git cat-file -p HEAD подтверждён локально); коммит-хэш отличается от 2cdecb5a, названного автором, потому что владелец переподписал вершину после красного preflight (устаревший mutation-gate.yml в main), не меняя дерева — это ожидаемо и находкой не является (PROCESS.md §2.10: «SHA не резолвится — обычное дело, находка — SHA, мёртвый уже в момент публикации отчёта»; здесь SHA как раз резолвится и подтверждает то же дерево).

Заход r2, блокирующих циклов израсходовано 1 из 4 (полный трек, лимит 4).

Скоуп

ТЗ #627 не менялось между r1 и r2. Делта раунда — ровно два файла (git diff fe5f7210 47d07281 --stat):

demo/smoke_danger_confirmation.mjs | 39 +++++++++++++--
docs/reviews/CODE-REVIEW-627-r1.md | 98 ++++++++++++++++++++++++++++++++++++++
2 files changed, 134 insertions(+), 3 deletions(-)

docs/reviews/CODE-REVIEW-627-r1.md — публикующий шаг конвейера, не работа автора; смотреть в нём нечего. Весь материал раунда — один коммит 47d07281 («test(smoke): danger confirmation waits for the composite language gate (#627 r1 M1)»), правящий единственную находку r1 (M1). Продуктовый код (src/**) в этой дельте не тронут — подтверждено самим диффом и node scripts/smoke-select.mjs --base fe5f7210 --head 47d07281: «Исполняемого frontend-диффа нет … тронуто файлов: 2».

Дельта локальна: правка одного смок-теста, без ребейза на ушедший вперёд dev, без смены контракта. Объём разбора сокращён до дельты и AC, которые она задевает (AC5 — единственный, чья доказательная база лежит в _confirmDanger/составном гейте хоста и который этот смок демонстрирует); AC1–AC4, AC6, AC7 в этом раунде не тронуты дельтой и унаследованы из r1 без повторного разбора (раздел ниже).

Как проверялось

Дешёвые гейты подтверждены зелёным Validate на этом самом SHA (run 35967212878, conclusion: success, headSha = 47d07281b6ced457ff3b1b25786bbe81e764a269 — проверено напрямую через gh run view --json). Разбивка по джобам (тоже проверена напрямую): «Фронтенд: типы, юниты, мутанты, синхрон бандла» и все 6 шардов «Мутанты по диффу» — success; smoke/golden/performance_smoke/backend/hacs/hassfest/geometry_parity — skipped (пуш без Release:, не PR — не heavy). Значит typecheck/юниты/build/мутанты-по-диффу переподтверждать не нужно; браузерный смок, изменённый этой дельтой, обязан проверить лично.

Прогнано лично на 47d07281:

Гейт Команда Результат
Build + bundle-sync npm run build && node scripts/bundle-sync.mjs ok; дерево чистое (git status --short пусто) — бандл байт-в-байт совпал с закоммиченным, три копии синхронны
Изменённый смок node demo/smoke_danger_confirmation.mjs OK, все 25 полей true, включая новые {de,fr}GateSettledBeforeAsking, {de,fr}DialogShown, {de,fr}CancelResolvesFalse, delayedNamespaceChunksServed
Негативный контроль (тест умеет падать) копия смока с прежней (r1) логикой ожидания localeFits (без условия !card.hasAttribute('aria-busy'), без await settle() перед циклом), но с той же 300-мс задержкой чанков settings-de-*/settings-fr-* — запущена как временный untracked-файл в demo/, удалена сразу после прогона; рабочая копия репозитория не изменена FAILED (7): deGateSettledBeforeAsking, deDialogShown, germanNarrowFits, frGateSettledBeforeAsking, frDialogShown, frenchNarrowFits, delayedNamespaceChunksServed — дословно те же 7 полей, что назвал автор в хендоффе r2. Подтверждает и находку M1 r1 (старая логика теряет диалог), и то, что новый смок ловит регресс, а не просто переписан «позеленее»
Validate на SHA gh run view 35967212878 --json status,conclusion,headSha,jobs success на точном SHA материала; smoke/golden — skipped, как и ожидалось для обычного пуша

node scripts/smoke-select.mjs --base fe5f7210 --head 47d07281 (база — материал r1, голова — материал r2): «Исполняемого frontend-диффа нет … Browser-smoke этим диффом не выбираются — это не «пропустить проверки», а «выбирать нечего»». Инструмент смотрит только на src/**, а изменён demo/**; поэтому единственно осмысленный смок для прогона — тот, что дельта меняет напрямую (smoke_danger_confirmation.mjs), и он прогнан.

Чего не проверял в этом раунде (сверх унаследованного из r1)

  • Полный smoke-select --base origin/dev --head HEAD заново — база сдвинулась бы на текущий origin/dev, а не на материал r1; для дельты этого раунда достаточно --base fe5f7210, что и сделано.
  • golden/performance_smoke/backend(pytest)/hacs/hassfest/geometry_parity — не гейт этого раунда: дельта не трогает src/**, custom_components/**/*.py, эталоны или геометрию.
  • Остальные ~13 смоков из плана автотестов ТЗ и полный реестр мутантов — не тронуты дельтой, повторно не гонял; их результат на этом дереве уже был лично подтверждён в r1 (таблица там) и дерево с тех пор не изменилось в части src/**/demo/*.mjs (кроме самого smoke_danger_confirmation.mjs).
  • Живой HA-стенд — не открывал (Python не менялся).

Находки

Нет. M1 (единственная находка r1) закрыта; новых находок в дельте r2 не обнаружено.

Закрытие раунда r1

Находка Чем закрыта Где это видно
M1 (Medium, в скоупе): demo/smoke_danger_confirmation.mjs не ждал составной гейт хоста → диалог опасного действия мог тихо теряться (_cancelDangerConfirm на warm) при переключении языка, пока словарь settings загруженной поверхности ещё не осел Коммит 47d07281 (тот же дереве, что и заявленный автором 2cdecb5a): localeFits в смоке теперь ждёт и перевод btn.cancel, и снятие aria-busy с хоста (составной гейт осел) прежде чем звать _confirmDanger; задержка ответа чанков settings-de-*/settings-fr-* на 300 мс через page.route делает гонку детерминированной, а не зависящей от скорости CI demo/smoke_danger_confirmation.mjs:119-146 (текущее дерево); лично воспроизведено — прогон смока на 47d07281 даёт OK, а тот же файл с логикой ожидания r1 под той же задержкой даёт FAILED (7) с теми же 7 полями, что назвал автор

Продуктовый код (_syncDangerConfirmLocaleGate, авто-отмена на warm из #417) не менялся — дефект был только в тесте, догонявшем расширенный составной гейт задним числом; это соответствует характеристике автора («мутант не заводился, роль мутанта играет негативный контроль») и подтверждено мной независимо.

Унаследовано из r1

Без повторной проверки в r2 принято из docs/reviews/CODE-REVIEW-627-r1.md (материал 40959feb1d44e51d653f8c6e9cdd5caa7f9ad9e8 / дерево 5210484960ba796270c76eaf2125b8ff037af8a5, вердикт жёлтый · заход r1 · High 0 · Medium 1):

  • AC1–AC4, AC6, AC7 полностью доказаны, включая честность всех 7 названных мутантов («поймано 1 из 1» — лично прогнаны автором r1-ревьюером) и числа бюджета (bundle-budget.mjs), воспроизведённые лично в r1.
  • Смоки прямых совпадений/связей smoke-select (11 из 14 названных в плане) и AC-именованные регрессы (6) — зелёные, лично прогнаны в r1.
  • check-docs.mjs --screenshots=warn — ok (7 файлов, 12 внешних ссылок), фингерпринт-WARN — предбета-долг #479, не находка этого issue.
  • check-inputs.mjs --coverage — 0, как заявлено.
  • Юнит-тесты изменённых файлов (i18n-lazy-namespaces, i18n-runtime, zigbee-topology, bundle-assets) — 74 pass, 0 fail.
  • AC5 доказан в r1 логически (unit + смок), но смок-доказательство содержало известный теперь дефект (M1) именно в сценарии, близком к AC5 (переключение языка поверх открытой поверхности); в r2 это доказательство переисполнено лично (см. «Как проверялось» выше) и подтверждено заново, а не просто унаследовано.
  • Ни одно из унаследованных чисел/фактов не пересчитывалось заново в r2, так как дельта раунда их не касается: дерево вне demo/smoke_danger_confirmation.mjs и docs/reviews/CODE-REVIEW-627-r1.md идентично материалу r1 (git diff fe5f7210 47d07281 --stat показывает ровно эти два файла).

Один источник числа

Дельта r2 не вводит и не дублирует ни одной пользовательской величины (никаких изменений src/**, конфига или UI-текста); User-Visible: no на коммите 47d07281 корректен, оба changelog не тронуты (git diff fe5f7210 47d07281 --stat -- docs/CHANGELOG.md docs/CHANGELOG.ru.md — пусто), и это правильно.

Трейлеры

git show 47d07281 -s — Issue: #627, User-Visible: no. Верно для тестового изменения без продуктового кода.

Вердикт

Зелёный. Единственная находка r1 (M1, Medium в скоупе) закрыта тестовым коммитом, продуктовый код не менялся, доказательство переисполнено лично (прогон смока + негативный контроль с идентичным результатом заявленному автором). Новых находок нет.


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

  • Ветка: issue/627-lazy-admin-locales, коммит 47d07281b6ce — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
  • Дерево материала: e19b817f43f3a9406513ddc7cc762deb2cc305eb
    git log --all --format='%H %T' | grep e19b817f43f3
    
  • Тело issue: 11ffae080ad26691a4b8dbd32f7736895c0c25a3f0cabe1b09da0e21666e6562
  • Вердикт конвейера: green · High 0