From 45aeadb38e953083eff070e87fc4b6870f451011 Mon Sep 17 00:00:00 2001 From: Matysh Date: Sun, 4 Oct 2026 06:52:27 +0300 Subject: [PATCH] docs(review): approved independent specification review for #789 Issue: #789 User-Visible: no --- docs/reviews/INDEX.md | 3 +- docs/reviews/SPEC-REVIEW-789-r1.md | 77 ++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 docs/reviews/SPEC-REVIEW-789-r1.md diff --git a/docs/reviews/INDEX.md b/docs/reviews/INDEX.md index 1685ffbd..03c6ec9f 100644 --- a/docs/reviews/INDEX.md +++ b/docs/reviews/INDEX.md @@ -1,12 +1,13 @@ # Индекс ревью -Генерируется `node scripts/reviews-index.mjs` (#635) — не редактировать руками. Документов: 290, issue: 144. Вердикт: 🟢 зелёный · 🟡 жёлтый · 🔴 красный · ⚪ не распознан (свободная форма старых документов). H/M — число High/Medium по строке вердикта или заголовкам находок. Файлы — пути, названные в находках; ищите по имени файла: `grep form-kit INDEX.md`. +Генерируется `node scripts/reviews-index.mjs` (#635) — не редактировать руками. Документов: 291, issue: 145. Вердикт: 🟢 зелёный · 🟡 жёлтый · 🔴 красный · ⚪ не распознан (свободная форма старых документов). H/M — число High/Medium по строке вердикта или заголовкам находок. Файлы — пути, названные в находках; ищите по имени файла: `grep form-kit INDEX.md`. | Issue | Документ | Этап · раунд | Вердикт | H | M | Находки | Файлы | |---|---|---|---|---:|---:|---|---| | бета 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 | — | — | | #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 | — | — | | #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-r1.md b/docs/reviews/SPEC-REVIEW-789-r1.md new file mode 100644 index 00000000..b2d1438a --- /dev/null +++ b/docs/reviews/SPEC-REVIEW-789-r1.md @@ -0,0 +1,77 @@ +# SPEC-REVIEW-789-r1 — performance-долг LED 50×50 + +Вердикт: зелёный · заход r1 · блокирующих циклов 0/4 · High: 0 · Medium: 0 · Low: 0 · маршрут: fix · Документ: docs/reviews/SPEC-REVIEW-789-r1.md + +## Полномочия и независимость + +Формальное ревью ТЗ выполнено отдельным локальным агентом, **не автором ТЗ и не автором реализации**. Владелец явно разрешил заменить недоступную модель независимым локальным reviewer; разрешение из ведущего чата передано координатором 2026-10-04 (+03:00). Это исключение только для способа ревью, не разрешение считать реализацию/performance завершёнными без AC. + +[Автоматический S4 run 37152909229](https://github.com/Matysh/houseplan-card/actions/runs/37152909229) завершился failure без `structured_output`; ошибка лично сверена в failed log. Содержательного модельного вердикта не было. Предварительные локальные оценки и исправления M1/M2 не публиковались как формальные блокирующие циклы; настоящее ревью — первый формальный r1. Предварительный файл `C:/Temp/hp789-spec-review.md` не давал права менять этап до нового разрешения владельца. + +Рецензент не менял issue/метки/репозиторий и не публиковал документ. Создан только разрешённый внешний файл; `docs/reviews/...` — назначение для координатора. + +## Материал раунда + +- Issue: https://github.com/Matysh/houseplan-card/issues/789. +- Актуальное тело перечитано полностью; SHA-256 точной UTF-8 JSON-строки body без дополнительного перевода строки: **`79b99d208f55211eb33595e4c3ba500e156a91ccd85f4029237350e3056aaa62`**, 18680 bytes. +- Хеш побайтно совпадает с предварительно проверенным ТЗ. Текст не устарел; содержательной дельты от предварительной зелёной оценки нет. +- Текущие метки: `S4-spec-review`, `track:ask`, `ci:full`, `P1`, `bug`; issue открыт. +- Базовый repo/process material: `24e48935c3b2d7887a41c544d062a6ea78ed13d6`, tree `9370770a85da3559786503b44e6ce491ddf47b78`; remote dev при проверке всё ещё на этом SHA. +- Задача #790 прямо исключена из scope; её зелёный кодовый вердикт и короткий perf smoke не являются доказательством AC3 этой задачи. + +## Объём и унаследованные выводы + +Проверяется **только готовность ТЗ**: сценарий, scope, проверяемость, непротиворечивость AC, безопасность альтернатив и регрессионный план. Черновик реализации, новые тесты, диагностические улучшения и последующий performance-результат не являются материалом этого вердикта. + +Из независимой предварительной оценки, заново сверенной с неизменным телом, унаследованы: соответствие SCOPE (плавная работа большого плана без новых настроек); допустимость owner-local batching; необходимость ordinary Glow regressions при изменении shared lifecycle; content-based invalidation, ограниченные кэши, lazy-loading; отсутствие миграции/UI/i18n/service изменений и scope creep. + +Точные цифры исходного красного измерения записаны в ТЗ как диагностика базы. Настоящее ревью не перепроверяло их benchmark-прогоном и не объявляет погашенным performance-долг. + +## Полнота и проверяемость AC + +| AC | Оценка ТЗ и обязательное будущее доказательство | +| --- | --- | +| AC1 — нет линейного fan-out | Структурный результат измерим: 50 источников → ровно 1 pending entering-frame, не более 1 update, все steady. Управляемый scheduler и названная отрицательная мутация обнаруживают прежний fan-out. Явно требуются 2 owner, ordinary/LED, normal/reduced-motion, off-before-frame, rapid off/on, prune, space switch, disconnect и stale callback | +| AC2 — сохранение изображения/переходов | Существующие независимые unit/raster witnesses остаются без ослабления. При raster-изменении требуется executable before/after с нулём отличающихся пикселей, включая полосу стены и конечный цветной композит; не только algebra/белая маска. Есть browser fade/rapid-toggle/main/static/ordinary и визуальный просмотр реальных проблемных мест без публикации private export | +| AC3 — долг действительно погашен | Явные общие бюджеты 1500/150 ms и отдельная task-acceptance 10% margin: p95 50×50 ≤1350/135 ms. Неизменные 10×5/50×50/no-LED, 7 samples/1 warmup/20 cycles. Один выбранный exact-SHA Linux run с comparison_ref базы, все образцы сохраняются; валидный провал не заменяется повтором | +| AC4 — не потеряны соседние свойства | Camera/HA/color: ноль geometry recomputes/роста кэша, стабильные DOM identities; geometry/openings инвалидируют. Disconnect очищает callback/scene; no-LED не грузит LED-field chunk. Shared lifecycle требует ordinary Glow и полного существующего performance без маскировки чужого долга | + +## Закрытие предварительных уточнений + +| Замечание предварительной оценки | Чем закрыто в актуальном body | +| --- | --- | +| M1: «измеримый запас» без точного pass/fail и протокола | AC3 задаёт 1350/135 ms при неизменных 1500/150, один full Linux run на точном выбранном SHA, фиксированную comparison_ref, сохранение всех raw samples. Повтор разрешён лишь при доказанном инфраструктурном сбое до валидного замера; валидный красный результат остаётся в отчёте | +| M2: прежний distance oracle не покрывал полосу стены/цветное compositing | AC2 требует zero-pixel before/after по 7 geometry × 3 radii × 2 directions × scales 1/2/4, все пиксели стены; дополнительно closed rectangle/door, цвет #75c52a alpha 0.43 и перекрытие двух полупрозрачных цветов на сером. Итоговый композит сравнивается независимо от distance/falloff oracle | + +Обе неоднозначности закрыты. Новых обязательных правок не обнаружено. + +## Достижимость без обещания результата + +Перенос visibility clip — **гипотеза, не обязательная реализация**. Zero-pixel witness является фильтром допустимости: неэквивалентный кандидат нужно отклонить, а не увеличивать AA-допуск. Сообщённый внешний эксперимент с 252 отличающимися сравнениями по этому ТЗ не проходит; он в данном формальном ревью не повторялся и не используется как доказательство будущего кода. + +Такое отклонение не делает ТЗ невыполнимым по определению: scheduling/DOM-equivalent batching и безопасный render-pass reuse остаются допустимыми направлениями. Но ни они, ни сам текст ТЗ **не доказывают**, что camera p95 достигнет 135 ms. Если запас не достигнут, AC3 требует продолжить анализ/реализацию, а не закрыть issue. + +Если raster structure в итоговом диффе не меняется, это нужно явно записать; неисполненный эксперимент нельзя объявлять зелёным. Существующие unit/raster/lifecycle/smoke и полный performance при этом всё равно обязательны. Сохранение точного raster у #789 не подменяется ограниченным golden-допуском #790: это разные AC. + +Owner-local batching не должен соединять карточки, реанимировать удалённые источники или обновлять disconnected owner; эти lifecycle риски названы и покрыты исполняемыми требованиями. Reuse внутри одного render pass не заменяет scene fingerprint идентичностью config. Scope не допускает уменьшения fixture, числа событий, точности, света на mobile или повышения budget. + +## Что проверено и чего не проверял + +- Проверено: актуальные body/hash/labels, remote base, отсутствие дельты ТЗ; сценарий и обязательные разделы, достижимая формулировка критериев без обещания performance, завершение M1/M2, обязательный план отрицательных и соседних witnesses, отсутствие новых продуктовых вопросов. +- Проверено: автоматический S4 run не дал structured verdict; owner exception явно отделён от отказа модели. +- **Не проверено:** реализация/черновик, корректность нового scheduler, завершение camera optimization, новые unit/smoke/golden, итоговый Linux performance или фактический запас 1350/135. Никаких benchmark/heavy test прогонов в этом ревью не было. +- Нет GitHub/label/source/branch mutations. Частичная диагностика реализации не выдана за готовый результат. + +## Итог + +High 0 / Medium 0 / Low 0. **ТЗ готово к разработке: зелёный независимый spec verdict на body `79b99d…aaa62`.** Координатор может опубликовать его и выполнить разрешённый владельцем переход к готовности/разработке. Это **не code approval и не разрешение merge #789 по одному spec verdict**: для завершения нужны реализация всех AC, обязательные exact-SHA gates и отдельное независимое код-ревью. + +--- + +## Якоря для публикации + +- Material head: `24e48935c3b2d7887a41c544d062a6ea78ed13d6`. +- Material tree: `9370770a85da3559786503b44e6ce491ddf47b78`. +- Issue body: `79b99d208f55211eb33595e4c3ba500e156a91ccd85f4029237350e3056aaa62`. +- Verdict: `green`; route: `fix`; High: 0; Medium: 0; Low: 0. +- Exception: owner-authorized independent local spec reviewer replacing failed model stage; no implementation/performance acceptance inferred.