2.5 KiB
ТЗ #11 — Health lifecycle сохранённого vacuum source
- Issue: https://github.com/Matysh/houseplan-card/issues/11
- Приоритет: P2
- Статус ТЗ: реализовано в Stage 1; целевой gate v1.61.0-beta.1 пройден, ожидается публикация
- Родительский контракт: HP-VAC-02 rev.7 §5.2
Цель
Переименование, удаление или отключение сохранённого source не должно молча останавливать server trail. Backend сообщает дедуплицированный incident, UI — статус и прямой путь перевыбора, не делая silent rebind.
Backend state machine
Ключ health state — (marker_id, source_entity_id), reason хранится как mutable
поле missing|disabled и не входит в identity.
- registry row disabled →
disabled; - registry row enabled или exact live state, включая
unavailableи entity без vacuum attributes → доказанное существование/recovery; - авторитетный registry без row и без exact state →
missing; - недоступный/ограниченный registry и отсутствие state →
unverified.
unverified нейтрален: не создаёт, не закрывает и не изменяет incident.
Первый failure после healthy/recovery пишет один warning. Смена reason внутри
того же incident не пишет новый warning. Recovery очищает incident с info log.
Удаление marker/rebind удаляет старый ключ.
Нормативные последовательности:
- available→missing→disabled→missing→available→missing = 2 warnings;
- available→disabled→unsupported-existing→disabled = 2 warnings;
- missing→unverified→missing = 1 warning.
UI
Resolver сохраняет pinned entity и показывает missing, disabled либо
unverified; stale attributes не рисуют puck. Banner содержит «Выбрать
источник», documentation остаётся доступна. Перевыбор немедленно обновляет
marker и backend subscription после config event.
Приёмка
Нет log spam на refresh/restart; transition tests проходят; source не меняется сам; re-pick восстанавливает trail; limited registry не создаёт ложный warning.