14 KiB
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— ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. - Дерево материала:
e19b817f43f3a9406513ddc7cc762deb2cc305ebgit log --all --format='%H %T' | grep e19b817f43f3 - Тело issue:
11ffae080ad26691a4b8dbd32f7736895c0c25a3f0cabe1b09da0e21666e6562 - Вердикт конвейера:
green· High 0