From 9722153e012bea9d72c2635c12b25eed815c50be Mon Sep 17 00:00:00 2001 From: Matysh Date: Mon, 5 Oct 2026 16:34:50 +0300 Subject: [PATCH] docs(review): record independent local review for #799 Issue: #799 User-Visible: no --- docs/reviews/CODE-REVIEW-799-r1.md | 75 ++++++++++++++++++++++++++++++ docs/reviews/INDEX.md | 3 +- 2 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 docs/reviews/CODE-REVIEW-799-r1.md diff --git a/docs/reviews/CODE-REVIEW-799-r1.md b/docs/reviews/CODE-REVIEW-799-r1.md new file mode 100644 index 00000000..5bda933b --- /dev/null +++ b/docs/reviews/CODE-REVIEW-799-r1.md @@ -0,0 +1,75 @@ +# Код-ревью #799 — ожидание длительного сбора Zigbee2MQTT + +Вердикт: зелёный · заход r1 · блокирующих циклов 0/2 · High: 0 · Medium: 0 · Low: 0. + +## Материал и разрешение + +- Issue: https://github.com/Matysh/houseplan-card/issues/799, `track:show`. +- База: `e69b3f2009c531fbd138efbc2eeb51a364c4fae6`. +- Продуктовый SHA: `0f77b921f66f0fb3104a3e473247a811581b9d64`. +- 12 файлов, 185 добавленных и 12 удалённых строк. Терминальные трейлеры + `Issue: #799`, `User-Visible: yes` и оба changelog присутствуют. + +Владелец разрешил исправление и немедленную экспресс-бету с минимальными +локальными проверками. Внешняя модель недоступна: автор выполнил самопроверку, +отдельный локальный агент `/root/zigbee_timeout_backend`, не писавший патч, +прочитал весь дифф и подтвердил SHA перед финальным вердиктом. Это не вердикт +модели конвейера. [Разрешение и план](https://github.com/Matysh/houseplan-card/issues/799#issuecomment-5995516221). + +## Результат независимого чтения + +Скоуп — J7: явно запущенное получение топологии Zigbee. Нет новых настроек, +автоматических сканирований, миграций и изменений ZHA. + +`src/zigbee-topology-runtime.ts` вычисляет общий deadline 600 секунд один раз +до подписок. Каждая подписка и MQTT publish ограничены меньшим из 10 секунд +и остатка общего бюджета; retained bridge-info сохраняет 4 секунды. +Отдельный cap publish не ограничивает десятью секундами ожидание карты. +Promise вложенного timeout включён в Promise.all, необработанного отклонения нет. + +Сохранены routes:true, transaction, дедупликация connection/topic, guards +преждевременных/retained/чужих/поздних ответов, late-unsubscribe cleanup, +старый snapshot и timestamp со stale при ошибке, повторный явный запрос. +Число транспортного cap имеет один источник Z2M_TRANSPORT_TIMEOUT_MS. +Четыре локали и обе пользовательские документации согласованы с 600 секундами. + +## Проверки + +Node 22.23.2, Windows. Ревьюер не дублировал исполнение: проверил сценарии и +assertions чтением, результаты переданы автором и тестовым агентом. + +| Гейт | Результат | +| --- | --- | +| 4 Zigbee unit-suite | 57/57 PASS | +| Runtime-suite отдельно | 19/19 PASS | +| Регрессия AC1 на старом runtime, транспилированном из Git в памяти | RED: на виртуальных 150 секундах error вместо loading | +| typecheck, build | PASS | +| bundle-policy --verify на продуктовом SHA | PASS: свежая сборка цела, 42 ассета | +| demo/smoke_zigbee_topology_hover.mjs | PASS, все флаги true | +| smoke-select | Единственная зарегистрированная связь — указанный smoke; выполнен | +| git diff --check | PASS, также исполнено независимым ревьюером | + +Первый smoke отказал из-за stale demo; доказательством является последующий +PASS после bundle-sync. Generated bundles очищены перед продуктовым коммитом. + +## AC: чем краснеет + +| AC | Доказательство | Отрицательный случай | +| --- | --- | --- | +| AC1 | production timeout accepts … after 180 seconds | Старый runtime прекращает ожидание на 150 секунде, тест ждёт loading и затем ready на 180-й | +| AC2: общий предел | ten-minute budget includes subscription setup… | Границы 599999/600000 мс; 18 секунд setup входят в общий бюджет, поздний callback не меняет revision | +| AC2: транспорт | Два subscription-теста и publish stops after ten seconds… | 9999/10000 мс; поздний unsubscribe очищается; ранняя карта не обходит зависший publish | +| AC2: info | retained bridge confirmation… | 3999/4000 мс; нет publish; поздний retained callback не оживляет операцию | +| AC2: сохранённые guards | Старые #798 runtime-тесты и новые cache/retry assertions | Чужая transaction, retained, поздний ответ, stale timestamp, совпадающий promise concurrent-вызовов | +| AC3 | 4 suites, build/typecheck, smoke, независимое чтение | Права/ZHA/конфиг не меняются, длительность обновлена во всех локалях | + +## Риски и ограничения + +Async/MQTT и кеш покрыты AC1/AC2. Геометрия, ввод и отрисовка маршрутов не +затронуты. Реальное радиооборудование пользователя не проверялось: 10 минут — +ограниченный бюджет, не обещание завершения любой сети. Прекращение ожидания +House Plan не отменяет скан внутри Z2M. + +Полный локальный npm test, backend/HA и полные smoke/golden/performance не +выполнялись по express-разрешению. Штатный full Validate точного SHA кандидата +остаётся отдельным условием публикации. Этот отчёт не подтверждает его заранее. diff --git a/docs/reviews/INDEX.md b/docs/reviews/INDEX.md index 3ff8a253..0348a7ea 100644 --- a/docs/reviews/INDEX.md +++ b/docs/reviews/INDEX.md @@ -1,12 +1,13 @@ # Индекс ревью -Генерируется `node scripts/reviews-index.mjs` (#635) — не редактировать руками. Документов: 300, issue: 150. Вердикт: 🟢 зелёный · 🟡 жёлтый · 🔴 красный · ⚪ не распознан (свободная форма старых документов). H/M — число High/Medium по строке вердикта или заголовкам находок. Файлы — пути, названные в находках; ищите по имени файла: `grep form-kit INDEX.md`. +Генерируется `node scripts/reviews-index.mjs` (#635) — не редактировать руками. Документов: 301, issue: 151. Вердикт: 🟢 зелёный · 🟡 жёлтый · 🔴 красный · ⚪ не распознан (свободная форма старых документов). 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 | — | — | +| #799 | [CODE-REVIEW-799-r1.md](CODE-REVIEW-799-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #798 | [SPEC-REVIEW-798-r1.md](SPEC-REVIEW-798-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #798 | [CODE-REVIEW-798-r1.md](CODE-REVIEW-798-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #795 | [CODE-REVIEW-795-r1.md](CODE-REVIEW-795-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — |