Files
houseplan-card/docs/specs/033-config-schema-lifecycle.md
T
Matysh 112c260314
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
Release v1.61.0-beta.1
2026-08-09 21:51:33 +03:00

3.4 KiB

ТЗ #33 — Единый registry схемы и lifecycle compatibility-полей

Цель

Сделать drift между TypeScript, UI, runtime и Voluptuous обнаруживаемым в CI, а судьбу каждого public/legacy/internal поля — явной и проверяемой.

Канонический registry

Развить scripts/config-field-registry.mjs до полного manifest. Запись поля:

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 не меняет визуал.