diff --git a/docs/reviews/CODE-REVIEW-802-r1.md b/docs/reviews/CODE-REVIEW-802-r1.md new file mode 100644 index 00000000..ad5742f5 --- /dev/null +++ b/docs/reviews/CODE-REVIEW-802-r1.md @@ -0,0 +1,71 @@ +# Локальное код-ревью #802 — r1 + +Вердикт: зелёный · High: 0 · Medium: 0 · маршрут: merge. + +## Материал и полномочия + +- Дата: 2026-10-05; ветка `issue/802-zigbee-hover-labels`. +- База: `7feda5b6c82b34f3b42f87a1f0c1fac5bf590265`. +- Продукт: `db887cd7f0612267e74d06700ae5fe8deb14a561`. +- Итоговый материал тестов: `077e9c1b1be693757009f748bfccb1c77bb39aee`. +- ТЗ: тело [#802](https://github.com/Matysh/houseplan-card/issues/802), раздел + `## ТЗ`, default Q1 принят. [Исключение владельца](https://github.com/Matysh/houseplan-card/issues/802#issuecomment-6000425421) + разрешает саморевью, ручное слияние и следующую бету вместо недоступной + ревью-модели. Это не вердикт штатного автоматического ревьюера. + +Автор прочитал весь diff; дополнительно отдельный локальный агент проверил +продуктовый материал и повторно проверил исправление своей находки. Итог +обоих прочтений — без High/Medium. Изначально длинная подпись адресата могла +перекрыть сетевой status-бейдж; это исправлено тем же измеряемым размещением, +с переносом текста и присоединением стрелки к фактическому краю подписи. + +## Приёмка + +| Контракт | Проверка | +| --- | --- | +| AC1: адресат | ZHA/Z2M, имя из текущего маппинга, fallback, длинные строки и специальные символы; Lit выводит текст, входящий счётчик не изменён. | +| AC2: читаемость | Реальный pointer, remote/unplaced/status-only, partial/stale/error, края, Flat и настоящий 2.5D, обе темы; измеряются пересечения DOM-прямоугольников. | +| AC3: тесная карточка | 13 unit-тестов чистого расчёта, включая независимый перебор 200 малых раскладок; browser hide/restore без нового hover. | +| AC4: обновления | Lazy adoption уже наведённого устройства, runtime, resize и camera, отсутствие новых запросов от pointer; измерения после render объединены через rAF. | +| AC5: input/lifecycle | Keyboard restore, mouse/touch/pen, несколько карточек и unmount; соседние input/render smokes. Наблюдатели отключаются при clear/disconnect. | +| AC6: визуал | Просмотрены кадры длинной подписи, status-only 2.5D, узкой карточки и transformed/scrolled ancestor. Эталоны не переписываются вслепую. | + +## Исполненные проверки + +- WSL Ubuntu, Node 22.23.2: `npm run gate:small` — PASS, 0 упавших гейтов. + Нативный Windows не использован как доказательство полного unit-набора: + платформенные shell-тесты проверены в WSL. +- `node demo/smoke_zigbee_tooltip_layout.mjs` — 77/77 PASS на Windows с pinned + Node; базовые 70 проверок также PASS в WSL. Дополнительные семь проверяют + реальный `position:fixed` при `translate + scale` предка, scroll без нового + hover и повторное наведение после большой прокрутки. +- WSL: `smoke_zigbee_topology_hover`, `smoke_household_journeys`, + `smoke_render_invalidation`, `smoke_touch_tips` — PASS. +- WSL: полный `npm run golden:verify` — PASS; ни один эталон не изменён. +- Отрицательный контроль старого cursor-position даёт 1596 CSS px² перекрытия; + новый layout устраняет его. Это не DOM-count и не поиск строки в исходнике. +- Изолированный raster-oracle обводки временно скрывает обычную подсказку + только внутри тестовой сцены, иначе её тёмный фон закрывает измеряемую стрелку + при scale 0.5. Все пороги и проверки масштабирования сохранены; совместное + отображение подсказок защищено отдельным новым smoke. +- `git diff --check`, process gate с живыми issue-метками, + `node scripts/mutation-gate.mjs --check` — PASS. Два мутанта размещения + зарегистрированы; их исполнение оставлено ночному гейту по процессу. + +Smoke-select перечисляет много потребителей общего live-hover; локально выбран +Zigbee, household actions, invalidation и touch, поскольку новая ветка активна +только для pointer-tooltip с совпадающим владельцем реально показанных +Zigbee-бейджей. Остальные режимы ранним return сохраняют старое поведение. +Полная CI-матрица остаётся обязательной на точном SHA беты. + +## Ограничения и заключение + +В физически слишком маленькой области невозможно гарантировать размещение +сколь угодно длинного диагностического текста. Текст не обрезается до потери +имени, обычный tooltip уступает место; новая настройка не добавлена. +Изменения не затрагивают маршруты, LQI, transport, сохранённые данные или +действия устройств. Рост bundleBytes на 8229 байт обоснован в issue; прочие +монолитные метрики и initial-load budget не расширены. + +Разрешено ручное слияние после зелёных проверок ветки. Этот документ сам по +себе не подтверждает готовность точного release-кандидата или публикацию. diff --git a/docs/reviews/INDEX.md b/docs/reviews/INDEX.md index b41afc0b..fb19d89a 100644 --- a/docs/reviews/INDEX.md +++ b/docs/reviews/INDEX.md @@ -1,12 +1,14 @@ # Индекс ревью -Генерируется `node scripts/reviews-index.mjs` (#635) — не редактировать руками. Документов: 305, issue: 152. Вердикт: 🟢 зелёный · 🟡 жёлтый · 🔴 красный · ⚪ не распознан (свободная форма старых документов). H/M — число High/Medium по строке вердикта или заголовкам находок. Файлы — пути, названные в находках; ищите по имени файла: `grep form-kit INDEX.md`. +Генерируется `node scripts/reviews-index.mjs` (#635) — не редактировать руками. Документов: 307, issue: 153. Вердикт: 🟢 зелёный · 🟡 жёлтый · 🔴 красный · ⚪ не распознан (свободная форма старых документов). H/M — число High/Medium по строке вердикта или заголовкам находок. Файлы — пути, названные в находках; ищите по имени файла: `grep form-kit INDEX.md`. | Issue | Документ | Этап · раунд | Вердикт | H | M | Находки | Файлы | |---|---|---|---|---:|---:|---|---| | бета v1.80.0-beta.1 | [SHIP-REVIEW-v1.80.0-beta.1.md](SHIP-REVIEW-v1.80.0-beta.1.md) | пакетное ревью ship · — | ⚪ — | 0 | 0 | — | — | | бета v1.79.0-beta.2 | [SHIP-REVIEW-v1.79.0-beta.2.md](SHIP-REVIEW-v1.79.0-beta.2.md) | пакетное ревью ship · — | ⚪ — | 0 | 0 | — | — | | бета v1.79.0-beta.1 | [SHIP-REVIEW-v1.79.0-beta.1.md](SHIP-REVIEW-v1.79.0-beta.1.md) | пакетное ревью ship · — | ⚪ — | 0 | 0 | — | — | +| #802 | [SPEC-REVIEW-802-r1.md](SPEC-REVIEW-802-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | +| #802 | [CODE-REVIEW-802-r1.md](CODE-REVIEW-802-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #800 | [SPEC-REVIEW-800-r1.md](SPEC-REVIEW-800-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #800 | [CODE-REVIEW-800-r1.md](CODE-REVIEW-800-r1.md) | code · r1 | 🟡 жёлтый | 0 | 3 | живой браузер остаётся на умершем job после reload интеграции; AC1 не имеет свидетеля, чувствительного к прежнему 600-секундному deadline; материал не проходит обязательный gate:small; English guide всё ещё обещает прекращение ожидания через 10 минут | `custom_components/houseplan/zigbee_topology.py` `scripts/mutation-registry.mjs` `test/data-hp-contract.test.mjs` `test/reviews-index.test.mjs` `PREFLIGHT-SPEC-800.md` `test/smoke-select.test.mjs` `docs/USER-GUIDE.md` | | #800 | [CODE-REVIEW-800-r2.md](CODE-REVIEW-800-r2.md) | code · r2 | 🟡 жёлтый | 0 | 1 | временный not_ready во время reload навсегда блокирует явный retry | `src/zigbee-topology-runtime.ts` |