Files
houseplan-card/legacy/specs/027-vacuum-external-source-picker.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

3.3 KiB
Raw Permalink Blame History

ТЗ #27 — Явный выбор внешнего vacuum source

  • Issue: https://github.com/Matysh/houseplan-card/issues/27
  • Приоритет: P1
  • Статус ТЗ: реализовано по HP-VAC-02 rev.7; целевой gate v1.61.0-beta.1 пройден, ожидается публикация
  • Родительский контракт: HP-VAC-02 §4.4–4.5

Цель

Позволить связать YAML/registry-less камеру XCME, которая не имеет DeviceInfo связи с vacuum device, без угадывания и последующего silent rebind.

Resolver

  1. Единственный pure resolver возвращает {entityId, status, pinned, candidates} и используется renderer, dialog, fit, diagnostics и trail UI.
  2. Сохранённый marker.vacuum.source sticky при ok, unsupported, unavailable, disabled, unverified и missing; автоматическая замена запрещена.
  3. Automatic mode рассматривает только position-capable сущности того же HA device; глобальные камеры никогда не выбираются автоматически.
  4. Порядок кандидатов детерминирован: capability score, camera выше прочего, затем entity_id; выбранный source всегда видим первым.
  5. missing допустим только при авторитетном доказательстве. Незаполненный status pure resolver трактует как unverified.

Picker

  • Основной список: automatic, same-device candidates и сохранённый source.
  • «Все камеры» закрыт по умолчанию и сканирует camera.* только при открытии.
  • Глобальный список — snapshot на одно открытие; HA ticks не перепарсивают его.
  • Повторное открытие делает новый snapshot; новый dialog не наследует старый.
  • Каждый кандидат показывает имя, entity id, integration и capabilities.
  • Missing/disabled/unverified banner содержит собственную кнопку выбора.
  • Выбор first-use source немедленно перестраивает devices; ожидание следующего HA tick запрещено.

Эдж-кейсы

  • source удалён/переименован; registry ограничен правами; state unavailable;
  • camera без position, но с rooms/path; несколько одинаково подходящих камер;
  • первый edit ещё не материализовал marker; dialog закрыт во время scan;
  • два экземпляра карточки не делят UI snapshot.

Приёмка

  • внешняя XCME камера выбирается и сохраняется с первого клика;
  • reload не меняет выбранный source;
  • missing source остаётся видимым и исправимым;
  • глобальный scan ленивый и не влияет на автоматический resolver;
  • источник одинаков во всех vacuum consumers.