Files
houseplan-card/legacy/specs/011-vacuum-source-health.md
Claudeandclaude[bot] df46fd1c3e docs(hygiene): ТЗ выпущенных задач без живых ссылок — в legacy/specs (#682)
Волна 5 эпика #674, перенос ТЗ (класс C). Из 240 файлов `docs/specs/` в
`legacy/specs/` уехали 219: на них не ссылается ни один живой файл (код,
тесты, скрипты, workflow, документы вне архива и ревью). Остались 21 ТЗ —
на которые ссылаются код, ADR, ISOMETRIC, SUN, RADAR, LIGHT (`docs/specs/067`),
DECOR-EDITOR, support-relay, и те, на которые ссылаются они сами; README
каталога объясняет, где искать остальное. Открытых issue с файлом ТЗ среди
перенесённых нет. Относительные ссылки перенесённых файлов переписаны
(`../X` → `../../docs/X`, соседние оставшиеся ТЗ → `../../docs/specs/…`) —
все 26 резолвятся. Попутно: битая ссылка в
`089-isometric-view-stage1.md:8` на удалённый `089-isometric-view.md` —
теперь команда `git show` по истории. Строка в `legacy/README.md`.

Issue: #682
User-Visible: no
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018qZfe7YS4rqEMKoVeS3GKd
2026-09-27 22:10:46 +00:00

2.5 KiB
Raw Permalink Blame History

ТЗ #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.