mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-28 19:01:34 +00:00
@@ -0,0 +1,90 @@
|
||||
# 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](https://github.com/Matysh/houseplan-card/actions/runs/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 в скоупе) закрыта тестовым коммитом, продуктовый код не менялся, доказательство переисполнено лично (прогон смока + негативный контроль с идентичным результатом заявленному автором). Новых находок нет.
|
||||
|
||||
---
|
||||
|
||||
<!-- material-anchors: сгенерировано конвейером (#414) -->
|
||||
|
||||
## Материал раунда
|
||||
|
||||
- Ветка: `issue/627-lazy-admin-locales`, коммит `47d07281b6ce` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
|
||||
- Дерево материала: `e19b817f43f3a9406513ddc7cc762deb2cc305eb`
|
||||
```
|
||||
git log --all --format='%H %T' | grep e19b817f43f3
|
||||
```
|
||||
- Тело issue: `11ffae080ad26691a4b8dbd32f7736895c0c25a3f0cabe1b09da0e21666e6562`
|
||||
- Вердикт конвейера: `green` · High 0
|
||||
@@ -1,6 +1,6 @@
|
||||
# Индекс ревью
|
||||
|
||||
Генерируется `node scripts/reviews-index.mjs` (#635) — не редактировать руками. Документов: 1030, issue: 365. Вердикт: 🟢 зелёный · 🟡 жёлтый · 🔴 красный · ⚪ не распознан (свободная форма старых документов). H/M — число High/Medium по строке вердикта или заголовкам находок. Файлы — пути, названные в находках; ищите по имени файла: `grep form-kit INDEX.md`.
|
||||
Генерируется `node scripts/reviews-index.mjs` (#635) — не редактировать руками. Документов: 1032, issue: 365. Вердикт: 🟢 зелёный · 🟡 жёлтый · 🔴 красный · ⚪ не распознан (свободная форма старых документов). H/M — число High/Medium по строке вердикта или заголовкам находок. Файлы — пути, названные в находках; ищите по имени файла: `grep form-kit INDEX.md`.
|
||||
|
||||
| Issue | Документ | Этап · раунд | Вердикт | H | M | Находки | Файлы |
|
||||
|---|---|---|---|---:|---:|---|---|
|
||||
@@ -31,6 +31,8 @@
|
||||
| #630 | [CODE-REVIEW-630-r1.md](CODE-REVIEW-630-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — |
|
||||
| #629 | [SPEC-REVIEW-629-r1.md](SPEC-REVIEW-629-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — |
|
||||
| #627 | [SPEC-REVIEW-627-r1.md](SPEC-REVIEW-627-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | избыточное (не противоречивое) условие в AC2; влияние на touch не названо явным пунктом | `docs/TOUCH-SUPPORT.md` |
|
||||
| #627 | [CODE-REVIEW-627-r1.md](CODE-REVIEW-627-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | demo/smoke_danger_confirmation.mjs не переведён на ожидание составного гейта; диалог оп… | `demo/smoke_danger_confirmation.mjs` `src/houseplan-card.ts` `de.ts` `smoke_danger_confirm_branches.mjs` |
|
||||
| #627 | [CODE-REVIEW-627-r2.md](CODE-REVIEW-627-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — |
|
||||
| #625 | [SPEC-REVIEW-625-r1.md](SPEC-REVIEW-625-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | новый инвариант markers[].id не описывает исход для уже испорченной хранимой конфигурации; продуктовые формулировки §7.1 неполны; не проговорены явные «нет» по i18n/touch | `validation.py` `__init__.py` |
|
||||
| #625 | [SPEC-REVIEW-625-r2.md](SPEC-REVIEW-625-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — |
|
||||
| #625 | [CODE-REVIEW-625-r1.md](CODE-REVIEW-625-r1.md) | code · r1 | 🟡 жёлтый | 0 | 0 | Три из четырёх точек вызова validate_active_marker_ids не имеют ни одного теста, exerci…; AC5 текстуально обещает «отдельные тесты сохраняют поведение при отсутствующем length» …; store.py:async_save_config_state — controller.async_flush() и последующий controller.re… | `custom_components/houseplan/websocket_api.py` `test_validation.py` |
|
||||
|
||||
Reference in New Issue
Block a user