mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
committed by
Sergey Matyunin
parent
13a0bfdf87
commit
0bce4b1123
@@ -0,0 +1,207 @@
|
||||
# SPEC-REVIEW-493-r1
|
||||
|
||||
Issue: [#493](https://github.com/Matysh/houseplan-card/issues/493) — «Сводная панель: ограничить picker и исправить локальные настройки,
|
||||
мобильную форму и lifecycle».
|
||||
ТЗ: [`docs/specs/493-summary-panel-hardening.md`](https://github.com/Matysh/houseplan-card/blob/issue/493-summary-panel-hardening/docs/specs/493-summary-panel-hardening.md)
|
||||
(коммит `14beeb84`, докс-only: `docs/specs/493-summary-panel-hardening.md` +
|
||||
`docs/specs/README.md`).
|
||||
Этап: ТЗ на ревью (S4-spec-review). Заход r1. Блокирующих циклов израсходовано 0/4.
|
||||
Трек: полный (аналитик назвал 4 нарушенных критерия `small` — сложность/риск >3,
|
||||
больше одной поверхности, есть межwriter-совместимость, есть влияние на
|
||||
производительность и touch).
|
||||
|
||||
## Скоуп ревью
|
||||
|
||||
Материал — ровно коммит `14beeb84` на ветке `issue/493-summary-panel-hardening`
|
||||
(рабочая копия уже на нём, `git diff --check` показывает только этот коммит,
|
||||
никакого продуктового кода в диапазоне `71aeb860..14beeb84` нет). Задача
|
||||
продолжает утверждённое исключение #437 из `docs/SCOPE.md` (read-only summary
|
||||
overlay, J1/J6) и закрывает пять подтверждённых аудитом acceptance-пробелов
|
||||
(F3–F6, B4), не дублируя #490 (lost-ACK recovery/live invalidation).
|
||||
|
||||
## Как проверялось
|
||||
|
||||
1. Прочитаны `docs/SCOPE.md`, `AGENTS.md`, `PROCESS.md` (§1–§10, §2.10 для
|
||||
формата раунда — не понадобился, это r1 без предшествующего вердикта).
|
||||
2. Прочитано тело issue #493 и все три комментария (аналитика S2, «ТЗ готово»,
|
||||
и отчёт о сбое автопрогона ревью).
|
||||
3. Прочитан ТЗ-документ целиком (482 строки).
|
||||
4. Сверены обязательные разделы §7.1 PROCESS.md построчно с оглавлением
|
||||
документа — все 13 присутствуют (см. таблицу ниже).
|
||||
5. **Фактическая проверка проблемы (§3 ТЗ) по текущему коду**, а не на слово
|
||||
автора — аудит цитирует конкретные строки на устаревшем SHA `ea6061e9`,
|
||||
и с тех пор в код никто не коммитил (ветка ТЗ — чисто docs), так что
|
||||
актуальный код на HEAD это тот же код:
|
||||
- F3 подтверждён: `src/summary-panel-editor.ts:45-52,219-222` — `allEntities`
|
||||
строится сортировкой всего `hass.states` внутри рендер-функции и
|
||||
`entities.map()` кладёт полный список `<option>` в **каждую** value-строку.
|
||||
- F4 подтверждён: `src/houseplan-card.ts:3182-3183` в `setConfig()`
|
||||
перезаписывает `_kioskScale` из `LS_KIOSK` безусловно; `loadLocal()` в
|
||||
`src/summary-panel-runtime-loaded.ts:276-288` перезатирает то же поле
|
||||
местным `parseSummaryLocal`, но порядок вызовов (`setConfig` →
|
||||
`connectedCallback` → `loadLocal`) — источник наблюдаемого сброса.
|
||||
- F5 подтверждён: `_leaveCardRoute()` (`src/houseplan-card.ts:7472-7533`)
|
||||
обнуляет explicit editor/dialog поля (`_supportDialog`, `_markerDialog`,
|
||||
…), но нигде не трогает `this._summary` (summary runtime/dialog),
|
||||
который создаётся отдельно (`src/houseplan-card.ts:2285,2613`).
|
||||
- F6 подтверждён: `.summary-local-sizes` в `src/summary-panel-style.ts:188-190`
|
||||
— жёсткая трёхколоночная grid `max-content minmax(140px,1fr) 48px`, без
|
||||
media/container query.
|
||||
- B4 подтверждён: `config/set` вызывает `preserve_summary_panel_namespace` и
|
||||
`validate_summary_panel_references` (`custom_components/houseplan/websocket_api.py:1588,1593`),
|
||||
`ws_plan_optimize` (там же, `:1890-1970`) их не вызывает вообще.
|
||||
6. Сверены заявленные в ТЗ канонические контракты с действующими документами
|
||||
подсистемы:
|
||||
- `docs/CONFIG-COMPATIBILITY.md` («Summary panel namespace (#437)») —
|
||||
omission-preserve и change-aware reference validation, которые ТЗ §10
|
||||
расширяет на Optimize, совпадают с уже описанным контрактом `config/set`,
|
||||
это последовательное расширение, а не новое изобретение.
|
||||
- `docs/TOUCH-SUPPORT.md` — «summary panel… and its simple settings form»
|
||||
прямо названы поддерживаемой touch-first View-поверхностью с требованием
|
||||
44×44 px и «reachable content on a narrow viewport»; это точно то, что ТЗ
|
||||
§9/AC6 требует для **обеих** форм (admin и local-only), значит требование
|
||||
не является новым UX-контрактом, а закрывает уже объявленный, но
|
||||
нарушенный на практике (F6) контракт.
|
||||
- `docs/specs/437-summary-panel.md:580` уже требовал «200% browser zoom» —
|
||||
значит требование 200%-увеличенного текста в AC6 не изобретено этим ТЗ, а
|
||||
унаследовано из уже принятого контракта #437 (и совпадает с паттерном,
|
||||
который используется в #57/#86/#180 для аналогичных форм).
|
||||
- `docs/USER-GUIDE.ru.md` §«Сводная панель» — термины ТЗ («Настройки сводной
|
||||
панели», локальный показ, два ползунка размера) совпадают с уже описанной
|
||||
пользователю формулировкой; новых пользовательских терминов не введено.
|
||||
7. Проверено, что `local identity` (ключ включает `hass.user.id`) — уже
|
||||
действующее поведение (`summary-panel-runtime-loaded.ts:252-254`), а не
|
||||
новое продуктовое решение, которое требовало бы вопроса владельцу.
|
||||
8. Проверены лимиты 10 блоков / 20 значений в текущем коде
|
||||
(`summary-panel-editor.ts:230,242`) — совпадают с «не в скоупе» ТЗ §4.
|
||||
9. Проверена регистрация ТЗ в `docs/specs/README.md` (двусторонняя ссылка
|
||||
issue ↔ ТЗ на месте) и трейлеры коммита (`Issue: #493`, `User-Visible: no`
|
||||
— корректно для чисто документационного коммита).
|
||||
10. `git diff --check` на диапазоне коммита: единственное замечание — лишняя
|
||||
пустая строка в конце файла (см. Low ниже).
|
||||
|
||||
## Гейты
|
||||
|
||||
Материал этого раунда — документ (класс C, докс-only коммит). Продуктовый код,
|
||||
тесты и бандл не менялись, поэтому дорогие/дешёвые гейты (`typecheck`, `npm
|
||||
test`, `npm run build`, смоки, golden, `check-docs`, инварианты модели) к этому
|
||||
диффу неприменимы и не гонялись — гонять их значило бы проверять код, который
|
||||
эта задача ещё не написала. Зелёный Validate на `14beeb84`, на который ссылается
|
||||
задание, покрывает ровно то же самое docs-only состояние дерева. Единственная
|
||||
механическая проверка, применимая к самому файлу ТЗ, — `git diff --check`
|
||||
(см. выше, результат — Low).
|
||||
|
||||
## Проверка обязательных разделов ТЗ (PROCESS.md §7.1)
|
||||
|
||||
| Раздел §7.1 | Есть в документе | Где |
|
||||
|---|---|---|
|
||||
| Сценарий | да | §1 |
|
||||
| Что человек увидит до/после | да | §2 |
|
||||
| Проблема | да | §3, с проверяемыми числами и ссылками на код |
|
||||
| Скоуп и не-скоуп | да | §4 |
|
||||
| Контракт поведения | да | §5–§8, §10–§11 |
|
||||
| UX | да | §6, §9 |
|
||||
| Модель данных и миграция | да | §12 |
|
||||
| i18n | да | §13 |
|
||||
| AC1…ACn с доказательством | да | §15, все 10 называют метод и негативного свидетеля |
|
||||
| План автотестов | да | §16 |
|
||||
| Риски | да | §17 |
|
||||
| Откат | да | §18 |
|
||||
| Release-артефакты | да | §19 |
|
||||
|
||||
Дополнительно: продуктовые вопросы владельцу не заданы, и это оправдано —
|
||||
видимое поведение уже зафиксировано #437/аудитом, а раздел §20 «Принятые
|
||||
технические предположения» корректно выносит все нерешённые технические детали
|
||||
(лимит 100 строк, место backend helper, механизм инвалидации индекса,
|
||||
имена файлов) в явный блок «предположительно, поменять свободно», как требует
|
||||
§7.1. Ни одного случая, когда догадка о поведении подана как факт без пометки,
|
||||
не найдено — там, где ТЗ утверждает конкретное поведение (F3–F6, B4, лимиты,
|
||||
touch-контракт, 200%-zoom), утверждение подтверждено либо действующим кодом,
|
||||
либо действующим каноническим документом.
|
||||
|
||||
## Находки
|
||||
|
||||
### Low — лишняя пустая строка в конце файла ТЗ
|
||||
|
||||
`docs/specs/493-summary-panel-hardening.md` заканчивается двумя `\n\n`
|
||||
(`git diff --check` подтверждает: «new blank line at EOF»). Чисто
|
||||
косметическое, не влияет на содержание, ссылки или AC. **Снимается** решением
|
||||
ревьюера без правки — цена отдельного цикла ради одного символа выше цены
|
||||
находки.
|
||||
|
||||
Других находок — High, Medium в скоупе или Medium вне скоупа — не выявлено.
|
||||
|
||||
## Что проверено и корректно
|
||||
|
||||
- Все 13 обязательных разделов §7.1 присутствуют и содержательны.
|
||||
- Каждый из пяти «подтверждённых сценариев» проблемы (F3–F6, B4) верифицирован
|
||||
чтением текущего кода на HEAD, а не принят на слово автора.
|
||||
- Все 10 AC пронумерованы, для каждого указан способ доказательства
|
||||
(unit/backend/smoke/golden/performance) и названа мутация/негативный
|
||||
свидетель, который должен покраснеть — соответствует требованию
|
||||
«доказуемость» на этапе ТЗ.
|
||||
- Touch- и zoom-требования (AC6, 44×44 px, 200% text, 320/390 px) — не новый
|
||||
UX-контракт, а закрытие уже объявленного в `docs/TOUCH-SUPPORT.md` и
|
||||
`docs/specs/437-summary-panel.md` контракта, нарушенного на практике (F6).
|
||||
- Backend-контракт (§10, писательская матрица §11) — прямое расширение уже
|
||||
задокументированного в `docs/CONFIG-COMPATIBILITY.md` поведения `config/set`
|
||||
на `plan/optimize`, без новых persisted-полей и без version bump (§12), что
|
||||
соответствует `docs/SCOPE.md` (не расширяет панель до dashboard framework).
|
||||
- Раздел «Принятые технические предположения» (§20) корректно отделяет
|
||||
нерешённые инженерные детали от продуктового контракта; все пункты не
|
||||
затрагивают видимое поведение и могут быть оспорены ревьюером кода без
|
||||
возврата к владельцу.
|
||||
- Откат (§18) назван реалистично и явно запрещает частичный откат
|
||||
(backend guard без generation token и наоборот).
|
||||
- Issue ↔ ТЗ связь двусторонняя (`docs/specs/README.md` обновлён в том же
|
||||
коммите), трейлеры коммита корректны (`Issue: #493`, `User-Visible: no`).
|
||||
|
||||
## Чего не проверял
|
||||
|
||||
- Не проверялась реализация (её ещё нет — коммит docs-only); всё, что относится
|
||||
к фактическому поведению кода после реализации, — предмет код-ревью.
|
||||
- Не прогонялись `typecheck`/`test`/`build`/смоки/golden/`check-docs` — диапазон
|
||||
ревью не содержит изменений `src/**` или `custom_components/**`, эти гейты
|
||||
неприменимы к этапу спецификации.
|
||||
- Не проверялись предположения §20 на техническую реализуемость (например,
|
||||
выбор конкретного DOM-примитива для picker) — это осознанно оставлено
|
||||
инженеру и ревьюеру кода.
|
||||
- Не запрашивалось у владельца ничего сверх того, что уже решено в
|
||||
комментарии аналитика — открытых продуктовых вопросов в ТЗ нет и не найдено.
|
||||
|
||||
## Вердикт
|
||||
|
||||
**Зелёный.** ТЗ полно, каждый заявленный факт проблемы подтверждён чтением
|
||||
действующего кода, каждый AC проверяем и называет негативного свидетеля,
|
||||
обязательные разделы на месте, технические предположения явно отделены от
|
||||
продуктового контракта, скоуп не выходит за рамки утверждённого исключения
|
||||
#437. Единственная находка — Low, снята без правки.
|
||||
|
||||
---
|
||||
|
||||
## Материал раунда
|
||||
|
||||
- SHA материала: `14beeb8470a7189ddef5a8bd99a15630e2232d4e`
|
||||
(ветка `issue/493-summary-panel-hardening`, рабочая копия HEAD detached на
|
||||
этом коммите).
|
||||
- Дерево ТЗ: `docs/specs/493-summary-panel-hardening.md` — 481 строка, добавлен
|
||||
этим коммитом целиком (см. `git show --stat 14beeb84`).
|
||||
- Предшествующего вердикта нет — это r1; раздел «Унаследовано из r0» не
|
||||
применяется.
|
||||
|
||||
---
|
||||
|
||||
<!-- material-anchors: сгенерировано конвейером (#414) -->
|
||||
|
||||
## Материал раунда
|
||||
|
||||
- Ветка: `issue/493-summary-panel-hardening`, коммит `14beeb8470a7` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
|
||||
- Дерево материала: `ff7e45438b049665f1e751ef4943d9ee25044779`
|
||||
```
|
||||
git log --all --format='%H %T' | grep ff7e45438b04
|
||||
```
|
||||
- ТЗ `docs/specs/493-summary-panel-hardening.md`, блоб `19ebcb9df3035661a422cc0d02af71897b73f7c5`
|
||||
```
|
||||
git log --all --find-object=19ebcb9df3035661a422cc0d02af71897b73f7c5 -- docs/specs/493-summary-panel-hardening.md
|
||||
```
|
||||
- Вердикт конвейера: `green` · High 0
|
||||
Reference in New Issue
Block a user