mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
Validate / hacs (push) Failing after 12s
Validate / hassfest (push) Failing after 13s
Validate / frontend (push) Successful in 3m2s
Validate / golden (push) Failing after 51s
Validate / backend (push) Failing after 6m50s
Validate / smoke (push) Failing after 13m44s
Validate / performance (push) Failing after 24m13s
63 lines
3.4 KiB
Markdown
63 lines
3.4 KiB
Markdown
# ТЗ #33 — Единый registry схемы и lifecycle compatibility-полей
|
|
|
|
- Issue: https://github.com/Matysh/houseplan-card/issues/33
|
|
- Приоритет: P1
|
|
- Статус ТЗ: Stage A частично реализован; документ определяет завершение
|
|
|
|
## Цель
|
|
|
|
Сделать drift между TypeScript, UI, runtime и Voluptuous обнаруживаемым в CI,
|
|
а судьбу каждого public/legacy/internal поля — явной и проверяемой.
|
|
|
|
## Канонический registry
|
|
|
|
Развить `scripts/config-field-registry.mjs` до полного manifest. Запись поля:
|
|
|
|
```text
|
|
path, owner, value kind, enum/range/default, inheritance,
|
|
frontend type, backend schema, UI surface, runtime consumers,
|
|
introduced, write policy, read-compat-until, migration, unknown-child policy
|
|
```
|
|
|
|
Manifest описывает все сохраняемые `config` и `layout` поля, а не только legacy.
|
|
Для dynamic maps (`calibration`, layout ids) фиксируется shape значения и
|
|
policy ключей. Секреты/контент в manifest не попадают.
|
|
|
|
## Паритет и CI
|
|
|
|
1. Скрипт извлекает/нормализует enum/ranges из frontend declarations и
|
|
backend schema adapters.
|
|
2. Любой отсутствующий field decision или несовпадение enum/range ломает CI.
|
|
3. `extra=ALLOW_EXTRA` сохраняет future fields, но не освобождает известное поле
|
|
от регистрации.
|
|
4. Fixtures содержат oldest-supported, current и future-field config; load/save
|
|
без explicit optimization сохраняет неизвестные поля и визуальную семантику.
|
|
|
|
## Локальный audit
|
|
|
|
`scripts/config-audit.mjs` принимает экспортированный JSON локально, ничего не
|
|
отправляет наружу и выдаёт counts по legacy fields, planned migrations и
|
|
unknown paths без значений персональных данных. Exit codes различают clean,
|
|
migration available и invalid.
|
|
|
|
## Lifecycle
|
|
|
|
- `read-only legacy`: читается, но никогда не пишется новым UI;
|
|
- `migrate-on-explicit-optimize`: preview diff → atomic write → undo;
|
|
- `deprecated`: имеет дату/версию окончания чтения и changelog;
|
|
- `internal supported`: получает documented UI/default либо становится
|
|
фиксированным правилом и удаляется из storage;
|
|
- неизвестное future field сохраняется losslessly.
|
|
|
|
Первый decision set включает `tap_action`, display `ripple`, `show_all`,
|
|
`weather_entity`, vacuum `room_highlight/segment_map`, `group_lights` и
|
|
`exclude_integrations`; последние два координируются с #44.
|
|
|
|
## Приёмка
|
|
|
|
- 100% известных persisted paths зарегистрированы;
|
|
- schema drift имеет понятный CI diff;
|
|
- audit не выводит имена/id/координаты по умолчанию;
|
|
- Optimize показывает точные изменения до записи и имеет безопасный undo;
|
|
- обычное открытие/сохранение старого/future config не меняет визуал.
|