From 96f89717bd4e2f5eab958be2ac5ed8293c71f047 Mon Sep 17 00:00:00 2001 From: Matysh Date: Sun, 4 Oct 2026 15:39:26 +0300 Subject: [PATCH] docs(review): approve zoom-only LED quality specification for #789 --- docs/reviews/INDEX.md | 3 +- docs/reviews/SPEC-REVIEW-789-r2.md | 84 ++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 docs/reviews/SPEC-REVIEW-789-r2.md diff --git a/docs/reviews/INDEX.md b/docs/reviews/INDEX.md index 03c6ec9f..12bc0adb 100644 --- a/docs/reviews/INDEX.md +++ b/docs/reviews/INDEX.md @@ -1,6 +1,6 @@ # Индекс ревью -Генерируется `node scripts/reviews-index.mjs` (#635) — не редактировать руками. Документов: 291, issue: 145. Вердикт: 🟢 зелёный · 🟡 жёлтый · 🔴 красный · ⚪ не распознан (свободная форма старых документов). H/M — число High/Medium по строке вердикта или заголовкам находок. Файлы — пути, названные в находках; ищите по имени файла: `grep form-kit INDEX.md`. +Генерируется `node scripts/reviews-index.mjs` (#635) — не редактировать руками. Документов: 292, issue: 145. Вердикт: 🟢 зелёный · 🟡 жёлтый · 🔴 красный · ⚪ не распознан (свободная форма старых документов). H/M — число High/Medium по строке вердикта или заголовкам находок. Файлы — пути, названные в находках; ищите по имени файла: `grep form-kit INDEX.md`. | Issue | Документ | Этап · раунд | Вердикт | H | M | Находки | Файлы | |---|---|---|---|---:|---:|---|---| @@ -8,6 +8,7 @@ | бета v1.79.0-beta.1 | [SHIP-REVIEW-v1.79.0-beta.1.md](SHIP-REVIEW-v1.79.0-beta.1.md) | пакетное ревью ship · — | ⚪ — | 0 | 0 | — | — | | #790 | [CODE-REVIEW-790-r1.md](CODE-REVIEW-790-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #789 | [SPEC-REVIEW-789-r1.md](SPEC-REVIEW-789-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | +| #789 | [SPEC-REVIEW-789-r2.md](SPEC-REVIEW-789-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #788 | [CODE-REVIEW-788-r1.md](CODE-REVIEW-788-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #781 | [CODE-REVIEW-781-r1.md](CODE-REVIEW-781-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | утверждение на уровне решения по-прежнему не различает границу | `test/process-pending-round.test.mjs` | | #780 | [SPEC-REVIEW-780-r1.md](SPEC-REVIEW-780-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 5 | · Medium — в редакторе устройств нет «существующего контекстного лотка» и модели выделения; · Medium — поведение бэкенда на висящую ссылку не определено и ломает сохранение «старо…; · Medium — запрет поднимать бюджеты исполним только ленивой загрузкой, а ТЗ её не требует; · Medium — смещение от грани не определено для стен нулевой толщины и смешанных лент; · Medium — AC17 не проверяем: нет порогов; · Low — D назван «диаметром устройства пространства», а такой величины нет | `validation.py` `scripts/bundle-budget.mjs` `types.ts` `houseplan-card.ts` | diff --git a/docs/reviews/SPEC-REVIEW-789-r2.md b/docs/reviews/SPEC-REVIEW-789-r2.md new file mode 100644 index 00000000..3257e4f5 --- /dev/null +++ b/docs/reviews/SPEC-REVIEW-789-r2.md @@ -0,0 +1,84 @@ +# SPEC-REVIEW-789-r2 — временная детализация LED при zoom + +Вердикт: зелёный · заход r2 · блокирующих циклов 0/4 · High: 0 · Medium: 0 · Low: 0 · маршрут: fix · Документ: docs/reviews/SPEC-REVIEW-789-r2.md + +Материал: HEAD = `d8949cfffc067918b32149297a72790e629cc0b8`. + +## Полномочия и независимость + +Формальное ревью ТЗ выполнено отдельным локальным агентом, **не автором ТЗ и не автором реализации**. Координатор передал сохраняющееся явное разрешение владельца заменить недоступную review-модель независимым локальным reviewer. Это исключение способа ревью, а не исключение из AC или разрешение merge без проверок. Ранее упавший автоматический S4 run не выдаётся за содержательный вердикт. + +Рецензент проверяет готовность обновлённого договора до реализации нового zoom-only поведения. Создан только этот документ; issue, метки, исходники, ветки и публикации рецензент не менял. Ранее читавшиеся внешние диагностические пробы были материалом независимой оценки, не написаны этим рецензентом и не являются acceptance. + +## Материал раунда + +- Issue: https://github.com/Matysh/houseplan-card/issues/789; тело перечитано полностью, включая дополнение AC3 о непрерывном observer. +- SHA-256 точной UTF-8 JSON-строки `body`, без добавления перевода строки: **`3a9ccdaef212498d083cc2294b4603cb3e797b3714268af31a3df6343d879c53`**, 23250 bytes; `updatedAt`: `2026-10-04T12:30:04Z`. Хеш повторно проверен перед оформлением документа. +- HEAD материала: **`d8949cfffc067918b32149297a72790e629cc0b8`**; tree: **`fc84c01274b16048178f3d1738dbc9e0382e7356`**. Это якорь существующего продукта до новой zoom-only реализации, не якорь будущего готового кода. +- При оформлении в рабочем дереве уже находились чужие незакоммиченные изменения benchmark и документации. Они не изменялись и не включены в кодовый вердикт; формальный предмет этого документа — указанное тело ТЗ. +- Унаследованный [r1](SPEC-REVIEW-789-r1.md): body `79b99d208f55211eb33595e4c3ba500e156a91ccd85f4029237350e3056aaa62`, material HEAD `24e48935c3b2d7887a41c544d062a6ea78ed13d6`; git blob документа `b2d1438af7f75b243d6be20c7421da65715995aa`. [Опубликованный формальный r1](https://github.com/Matysh/houseplan-card/issues/789#issuecomment-5976287581). +- При проверке issue открыт, метки: `S6-in-progress`, `track:ask`, `ci:full`, `P1`, `bug`. Ревью не меняет этап автоматически. + +## Дельта и унаследованные выводы + +Дельта договора рассмотрена вместе со всеми затронутыми соседними контрактами: camera/gesture lifecycle, LED raster, latest HA, shared Glow, main/static, reduced motion и performance-наблюдение. Это не ограниченная проверка исправленных строк в отрыве от поведения. + +Из r1 унаследованы без ослабления: AC1 owner-local batching; AC4 content-based geometry invalidation, ограниченные кэши, стабильные DOM и lazy/no-LED; ordinary Glow regressions; отсутствие новых настроек, сохранённых данных, миграции, i18n и HA services; соответствие J1/SCOPE. Предварительные M1/M2 до r1 были закрыты и не становятся новыми блокирующими циклами. + +Изменение видимого поведения теперь явно согласовано владельцем: **только во время изменения масштаба** допускается временная детализация 24 полос вместо 48. Прежнее требование точного изображения не отменено для idle/restored 48. Перенос clip, постоянное упрощение, скрытие света, bitmap/canvas или иной raster rewrite исключены. Таким образом, это открытая продуктовая дельта, а не скрытое ослабление pixel-критерия или обход прежнего неудачного эксперимента. + +## Проверка договора и доказательств + +| Область | Оценка и обязательное доказательство реализации | +| --- | --- | +| Zoom-only состояние | Указаны фактические изменения масштаба wheel/buttons/fit/home/room-fit/pinch, включение до записи camera frame и продление owner-local 160 ms каждым изменением. Для плавной камеры это реальные промежуточные изменения, не только исходная команда. Pure pan, clamped no-op, структурный resize и переход режима сами по себе coarse не включают. Пауза pinch возвращает 48 даже при оставшихся пальцах; reduced motion не исключён | +| Raster и видимость | Все 48 DOM bands сохраняются; рисуются чётные 24 с прежними путями/ширинами и серым по серединам 24 интервалов общего `GLOW_FALLOFF`. Геометрия, visibility/floor clip, цвет/alpha и tube не меняются. Active-24 oracle проверяет именно этот алгоритм и непрерывно видимый свет, а не произвольное приближение | +| Точная полная детализация | AC2 требует ноль отличающихся пикселей idle48/restored48 против состояния до этой дельты, то есть material d894, уже содержащего исправление цвета #790. Performance comparison_ref 24e не подменяет этот визуальный якорь. Матрица покрывает геометрии, направления, радиусы, масштабы, стены, цветной полупрозрачный композит и перекрытие. Диагностический active max-delta 10 прямо не является универсальным допуском | +| Актуальность и teardown | Latest on/off/RGB/brightness/unavailable и новые поля должны применяться во время coarse; восстановление меняет качество, не возвращает снимок старого HA. Space/mode/projection/structural adoption/hidden/disconnect сбрасывают состояние и callbacks; stale callback не действует на новый lifecycle/zoom. Static остаётся 48, владельцы независимы | +| Touch и соседние эффекты | Свет непрерывно рисуется при pinch, как требует TOUCH; tube, ordinary Glow, alpha и fade не скрываются и не замораживаются. AC5 включает реальный wheel/pinch, cancel/lost capture, паузу, предел, normal/reduced и переключения контекста. Touch editor: best effort / intentionally degraded по общей политике редакторов; данный общий quality-переход имеет одинаковый mouse/touch контракт и не обещает новой parity редакторских инструментов | +| Старый performance gate | AC3 сохраняет исходные fixtures, 7 samples / 1 warmup / 20 cycles, 100 camera steps, метрики, их окна и budget-файл. Общие 1500/150 ms и task p95 1350/135 ms не ослаблены. Нужен один exact-final-SHA Linux canonical run с фиксированной comparison_ref; valid RED не заменяется подбором повторов | +| Полный цикл zoom/restore | Дополнительный непрерывный long-task observer начинается до первого wheel; включает исходную серию, восстановление с timeout 1000 ms, два RAF, немедленный новый wheel, повторное восстановление, два RAF и хвост не менее 500 ms. Сохраняются сырые данные и границы фаз. Новый full-cycle maximum получает тот же 150 ms limit / task p95 ≤135 ms; отсутствие результата или зависший coarse — fail. Старая cameraSeries остаётся отдельно, поэтому стоимость восстановления не выносится за единственное оцениваемое окно | +| Регрессионная защита | Unit управляют временем и проверяют scale/pan/no-op, продление, owners и stale/dispose. Browser проверяет реальный ввод, latest HA, DOM/cache identity, static и восстановление. Старые #788 oracle, fade/rapid/ordinary/main/static и full performance сохраняются. Нужны red на старом/отключённом новом поведении и регистрация browser-only mutants; запуск мутантов в разработке не требуется по #709 | + +## Достижимость и границы вывода + +Внешние ограниченные пробы дают достаточное обоснование проверить один конкретный продуктовый кандидат retained48/coarse24. Они не доказывают canonical p95: measured full-cycle включал восстановление, но restart-to-restored interval у coarse оказался примерно на 9–28 ms длиннее. Отрицательное наблюдение сохранено в ТЗ, новый observer обязан учитывать его в итоговом коде. + +Канонический run `37176616088` на d894 остаётся **RED**: camera p95 169 ms выше общего 150 и task 135; warm p95 1265.8 ms проходит task 1350. Зелёный Full Validate `37176720462` и диагностические нулевые long tasks не закрывают этот acceptance-block. Следующий run нового окончательного SHA — проверка нового продукта, не повтор старого измерения ради зелёного исхода. + +Проверяемость критерия не равна обещанию успеха. Если final canonical остаётся valid RED, или exact idle/restored, active oracle, lifecycle либо непрерывная видимость не проходят, задача не готова к merge. Возврат к анализу не даёт права менять пороги, fixtures, число шагов, скрывать свет либо расширять архитектуру без нового решения владельца. + +## Что прочитано и чего не проверял + +Прочитаны актуальное тело и обсуждение issue, r1, `docs/SCOPE.md`, `AGENTS.md`, `docs/process/REVIEWER.md`, релевантные разделы `PROCESS.md`, LIGHT/TOUCH/CANVAS/ARCHITECTURE/USER-GUIDE и индекс ревью. Сверены исторические нормы в HEAD: desktop-first редакторы и непрерывно рисуемое освещение не подменены незакоммиченным описанием будущей реализации. Read-only task packet использован для контекста, не вместо чтения ТЗ. + +В этом spec-раунде не запускались browser, unit, smoke, golden, benchmark, mutants или CI; новый код/benchmark не получил review approval. Не проверены ни будущий exact-SHA performance, ни фактическая 24→48 реализация. Изменение пути отрисовки требует предусмотренного ТЗ визуального gate; текущая метка `ci:full` сама по себе не объявляется доказательством golden, а отсутствие сейчас `ci:golden` не маскируется. Настройка обязательных реализационных гейтов остаётся за координатором. + +## Итог + +High 0 / Medium 0 / Low 0; обязательных правок ТЗ не найдено. **Зелёный независимый spec verdict r2 на body `3a9ccdae…79c53`: договор готов к реализации.** Условий «исправить Medium позже» нет. Это не code approval, не performance GREEN и не разрешение merge по одному документу; до завершения нужны все AC, exact-SHA gates и отдельное независимое код-ревью. + +--- + +## Якоря для публикации + +- Material head: `d8949cfffc067918b32149297a72790e629cc0b8`. +- Material tree: `fc84c01274b16048178f3d1738dbc9e0382e7356`. +- Issue body: `3a9ccdaef212498d083cc2294b4603cb3e797b3714268af31a3df6343d879c53` (exact raw UTF-8 body, 23250 bytes). +- Previous review: `docs/reviews/SPEC-REVIEW-789-r1.md`; blob `b2d1438af7f75b243d6be20c7421da65715995aa`. +- Verdict: `green`; route: `fix`; High: 0; Medium: 0; Low: 0; blocking cycles: 0/4. +- Exception: owner-authorized independent local spec reviewer; implementation and performance acceptance are not inferred. + +--- + + + +## Материал раунда + +- Ветка: `issue/789-led-field-performance`, коммит `d8949cfffc06` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. +- Дерево материала: `fc84c01274b16048178f3d1738dbc9e0382e7356` + ``` + git log --all --format='%H %T' | grep fc84c01274b1 + ``` +- Тело issue: `db194bfdb7daf256e14a80561fbf5fb8dfd210bbc113d27ef93905c3bc046dbe` +- Вердикт конвейера: `green` · High 0 · маршрут `fix`