Files
houseplan-card/docs/TESTING-DEMO.md
T
Claudeandclaude[bot] 7dc7597260 docs(process): ролевые конспекты, замер входа, Snapshot генерируется, TESTING.md разделён
Вход агента до первого файла кода стоил ≈ 26 700 слов (аудит 22.09).

- docs/process/AUTHOR.md и REVIEWER.md — выжимки PROCESS.md: каждый пункт
  ссылается на раздел канона, ключевые формулировки дословные;
  test/process-digests.test.mjs сверяет якоря, ссылки и правила.
- scripts/entry-cost.mjs — маршрут чтения по роли и бюджет (автор ≤ 12 000
  слов, AC1); AGENTS.md «Read this first» называет те же маршруты.
- docs/STATUS.md: блок Snapshot генерирует scripts/status-snapshot.mjs
  (версии — release-contract, счётчики — inventory, теги — git); feature
  surface и ранние milestones перенесены дословно в docs/STATUS-FEATURES.md.
- docs/TESTING.md — действующая инструкция (684 строки, AC3); ручные
  чек-листы и приложения по issue перенесены дословно в docs/testing-notes/
  с индексом и тестом на полноту.
- Промпт ревьюера в process.yml читает конспект вместо пересказа правил;
  машинные требования (строка вердикта, REVIEW_DOC, запрет fetch, таблица
  «чем краснеет», разделы повторного раунда) сохранены и закреплены тестом.
- PROCESS.md: правила не менялись; добавлены ссылка на конспекты в шапке и
  уточнение в §10.4, что ревьюер конвейера читает конспект.
- 7 мутантов в реестре.

Issue: #634
User-Visible: no
2026-09-24 02:33:08 +00:00

470 lines
70 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Чек-лист ручного тестирования на публичном демо-стенде
> **Стенд:** https://demo.houseplan.tech — вход **demo / demo** (админ).
> Dev-версия: https://dev.houseplan.tech (basic auth `hp` / `houseplan-dev-2026`, дальше тот же demo/demo).
>
> **Стенд сбрасывается каждый час** к эталонному состоянию — это фича: ломайте
> смело, удаляйте комнаты, заливайте планы, через час всё вернётся (обратный
> отсчёт до сброса печатается в консоли DevTools). Из этого же следует:
> долгоживущие проверки («файл исчез через сутки», «пережило рестарт») на стенде
> не живут. Рестарт HA изнутри заблокирован demo_guard.
>
> Источник истины — [TESTING.md](TESTING.md) и его приложения
> [`testing-notes/`](testing-notes/README.md) (ручной чек-лист по поверхностям
> перенесён туда, #634): формулировки пунктов и их `[auto:…]`-маркеры смотреть там. Здесь каждый пункт сокращён до сути и дополнен
> строкой «Стенд: …» — где и как ткнуть именно на демо-стенде.
>
> **Демо-дом v2** (анонимированная планировка реального загородного дома):
> дашборд «House plan» (`/house-plan/0`, виды: План / Киоск / Схема), три
> пространства: «Ground Floor» (Kitchen & Living, Hallway, Guest Bedroom,
> Guest WC, Boiler Room, Sauna, Under-Stairs Closet, Outdoor Storage — нарисован
> от руки, толстые стены со штриховкой), «First Floor» (Kids Room A, Kids Room B,
> Upstairs Hall, Kids Bathroom, Master Bathroom, Bedroom, Study — с
> картинкой-подложкой) и «Yard» (комната Yard + декор-контур гаража). Всего
> 97 маркеров: ~51 на Ground Floor, 23 на First Floor, 2 во дворе. Ключевые
> демо-устройства: робот-пылесос `vacuum.demo_robot` (база в Under-Stairs
> Closet), датчики протечки (включаются помощником `input_boolean.demo_leak`),
> датчики дыма (сами срабатывают каждые 10 минут), котёл и бак воды в Boiler
> Room (маркеры-значения + живые текст-метки), замки Front Door и Terrace,
> шторы в Study, ворота гаража во «Yard», TV + колонки, вытяжка на кухне,
> кондиционер в Bedroom, составная розетка Smart Plug, вечно-unavailable
> Pantry Light, погода `weather.demo_weather_south` (солнце в окнах + день/ночь).
> Всё на английском; язык пользователя demo = Auto — интерфейс следует языку
> браузера.
## Деактивированные устройства HA
Публичный demo-пользователь — админ, поэтому на стенде проверяется полный
registry-сценарий. Для limited/read-only нужен локальный harness или отдельный
непривилегированный пользователь.
- Готовый пример в доме: **Smart Plug 2** деактивирована в реестре — она
зарезервирована под будущую фичу disabled-devices; сейчас рендерится по
текущему поведению.
- Сохранённый marker: деактивировать устройство или его единственную сущность
в настройках HA — оно исчезает из View и всех данных плана без изменения
конфига.
- Редактор устройств → «Скрытые и деактивированные»: виден серый служебный
ghost с причиной. «Показать» объясняет, что сначала нужна активация в HA;
«Открыть в HA», редактирование метаданных и удаление доступны.
- Активировать тот же объект: marker возвращается на старое место со старыми
настройками. Если до деактивации он был скрыт пользователем, сам не появляется.
- Для пылесоса вместе с marker исчезают puck и клиентские/полученные следы;
существующая серверная история не удаляется и возвращается после активации.
- Локальный standalone demo: `__setRegistryDisabled('device','d_mower','user')`
/ `__setRegistryDisabled('device','d_mower',null)` переключают статус;
`__setRegistryAccess('limited')` включает отказ registry WS для проверки
консервативной деградации.
## Вводные пункты (v1.43.x–v1.44.x)
- Smoke-harness сам по себе — Стенд: не проверяется (это CI), только локально.
- Шестерёнка «⚙ Room» на каждой карточке комнаты в редакторе плана — Стенд: открыть «Редактор плана» на «Ground Floor», убедиться что у всех 8 комнат есть кнопка ⚙ фиксированного размера, открывает настройки комнаты.
- Метрики 0.75 от имени комнаты — Стенд: включить метрики в настройках пространства (⚙ у «Ground Floor») и посмотреть подпись под именем комнаты.
- Тултип не появляется после touch — Стенд: открыть с планшета/телефона, потыкать комнаты и иконки — hover-тултипов быть не должно.
- Роль источника света у выключателя — Стенд: у настенного выключателя или у розетки «Smart Plug» в диалоге устройства выбрать «Всегда» — при включении устройство светится в Glow; «Никогда» убирает собственное пятно, «Авто» возвращает классификацию устройства.
- Карточка устройства: управляемые сущности сверху, ≥30 px, замки не переключаются — Стенд: тапнуть TV или колонку; для замка — открыть карточку двери (бейдж замка на входной двери Front Door).
- Инвариант замков на всех путях — Стенд: Front Door: Unlock просит подтверждение, Lock — нет; иконка замка никогда не тогглится тапом.
- Транзакционная миграция вложений — Стенд: прикрепить PDF к устройству, перепривязать маркер на другую сущность — файл открывается после перепривязки.
- Планы и PDF в реальном браузере — Стенд: залить план в настройках пространства (любой PNG/SVG), DevTools → Network: `/api/houseplan/content/...` = 200 с `authSig`, тот же URL без authSig = 401.
- Единая политика прав (may_write) — Стенд: не проверяется напрямую (нужен не-админ; на стенде один пользователь demo-админ) — покрыто tests_backend.
- NaN/Infinity и лимиты openings — Стенд: не проверяется руками (нужен ручной WS-вызов) — tests_backend.
- Захват указателя при drag, декор не утаскивается за границы — Стенд: «Редактор фона», нарисовать фигуру и попытаться утащить её далеко за план.
- Скрытые термометры питают карточку комнаты — Стенд: скрыть любой датчик температуры (кнопка «Скрыть» в левом нижнем углу диалога, затем «Сохранить») — температура в карточке его комнаты остаётся.
- Тултип комнаты без «открыть area» — Стенд: навести на комнату с десктопа: имя + температура/сигнал, никакого «открыть».
## Матрица окружений ★
- Chrome/Edge desktop — Стенд: да, просто открыть.
- Firefox desktop — Стенд: да, со своей машины.
- Safari (macOS) — Стенд: да, при наличии Mac.
- HA Companion Android (холодный старт!) — Стенд: да: добавить `https://demo.houseplan.tech` как сервер в приложении (demo/demo), убить приложение, открыть заново на дашборде House plan.
- HA Companion iOS — Стенд: аналогично Android.
- Планшет-киоск — Стенд: частично: открыть вид «Киоск» браузером планшета во весь экран; реальный настенный планшет — только на железе.
- Телефон портрет ≤400 px — Стенд: да, или DevTools device mode.
- Тёмная/светлая тема — Стенд: профиль demo → тема; проверить бейджи/диалоги/контраст.
- RU/EN локали — Стенд: язык пользователя demo = Auto (следует за браузером): сменить язык браузера или выставить язык явно в профиле; опцию `language:` карточки можно проверить, отредактировав вид дашборда.
## Установка / обновление / удаление
- Свежая установка через HACS — Стенд: не проверяется (интеграция ставится файлами, HACS нет) — локально.
- `single_config_entry` — Стенд: Настройки → Устройства и службы → Добавить интеграцию → «House Plan» недоступна второй раз.
- Обновление через HACS (`?v=` после рестарта) — Стенд: не проверяется (нет HACS; версию ресурса видно в DevTools: `houseplan-card.js?v=1.58.0`).
- YAML-mode Lovelace / extra_module_url — Стенд: частично: стенд как раз грузит карточку через `extra_module_url` (см. configuration.yaml) — если дашборд открылся, механизм жив.
- Удаление entry → ресурс исчезает, `.storage/houseplan.*` живёт — Стенд: можно (Настройки → Интеграции → House Plan → удалить), стенд сам восстановится при сбросе; переустановку файлами проверить нельзя.
- Diagnostics download + REDACTED — Стенд: Настройки → Интеграции → House Plan → «Загрузить диагностику», убедиться что name/link/description/pdfs = `**REDACTED**`.
## Режимы ★
- Всегда открывается во View — Стенд: войти в редактор, перезагрузить страницу — карточка снова во View.
- View: только pan/zoom/tap/long-press, иконки не таскаются — Стенд: попробовать утащить любую иконку в режиме просмотра — должен идти pan.
- Шапка View: табы пространств, счётчик, zoom, табы редакторов, ⚙ — Стенд: глазами в шапке «Ground Floor | First Floor | Yard».
- Plan: тулбар разметки, иконки скрыты, оранжевая рамка — Стенд: вкладка «Редактор плана».
- Devices: drag иконок, клик открывает редактор маркера — Стенд: вкладка «Редактор устройств».
- Табы скрыты для не-админа — Стенд: не проверяется (второго, не-админского, пользователя на стенде нет).
- Открывания во View инертны (дверь/окно — чистый рисунок) — Стенд: во View потыкать входную дверь в Hallway мимо бейджа замка — ничего не происходит.
- Бейдж замка — единственное исключение — Стенд: клик по замочку на Front Door открывает карточку двери; в редакторе плана он инертен.
- Курсор pointer во View, grab в Devices — Стенд: сравнить курсор над иконкой в двух режимах.
- В Plan открывание интерактивно (drag по стенам, 3 px порог) — Стенд: редактор плана → потаскать дверь вдоль стены, одиночный тап открывает свойства.
## Онбординг ★
Все пункты онбординга требуют ПУСТОЙ конфиг. На стенде: Настройки → Устройства и службы → House Plan можно удалить и добавить интеграцию заново, либо стереть все пространства руками — и пройти онбординг; сброс через час всё вернёт.
- Мастер импорта этажей — Стенд: если на стенде этажи HA не заведены, мастер предложит «Start from scratch»; полный сценарий с этажами — локально (или создать этажи в Настройки → Зоны и этажи, затем удалить пространства карточки).
- Остальные пункты мастера (снять галки → Create disabled, очередь диалогов, Skip/Cancel, авто-разметка с тостом, пустое состояние) — Стенд: в рамках того же прогона после удаления пространств.
## Пространства ★
- Создание с картинкой (SVG/PNG/JPG/WebP), чёткость на зуме — Стенд: «+» в шапке → загрузить свой файл (Ground Floor и Yard нарисованы без подложки, у First Floor подложка есть — интересно сравнить оба пути).
- >8 MB → читаемый тост — Стенд: залить большой файл.
- «Без изображения — нарисую сам», ориентация — Стенд: «+» → режим рисования.
- Белый холст в draw-режиме — Стенд: Ground Floor и Yard такие: борта/имена читаемы на белом.
- Rename / замена картинки / image→draw отвязывает план — Стенд: ⚙ пространства (на First Floor можно отвязать подложку — сброс вернёт).
- Удаление пространства — Стенд: удалить «Yard», убедиться что «Ground Floor» и «First Floor» не тронуты; сброс вернёт.
- Настройки отображения: борта, имена, цвет+прозрачность, заливки — Стенд: ⚙ «Ground Floor» — там всё живое, предпросмотр после сохранения.
- Заливка «zigbee»: красный→зелёный по среднему LQI — Стенд: ⚙ «Ground Floor» → заливка «Сигнал Zigbee»: разброс LQI заведён специально — есть комнаты с сильным (зелёные) и слабым (красные) сигналом, цифры видны под датчиками; «Yard» не залит (нет zigbee).
- Заливка «lights» — Стенд: включить, зажечь свет в комнате с плана — комната жёлтая, потушить — серая.
- Заливка «temperature» + границы комфорта — Стенд: включить: комнаты красятся по датчикам/термоголовкам (значения живые, точные цифры плавают); границы 20–25 редактируются тут же.
- Радиогруппа заливок без легенды — Стенд: глазами в ⚙ пространства.
- Hover затемняет текущую заливку — Стенд: навести на комнату при любой заливке.
- Тултип комнаты со средней температурой — Стенд: навести на Kitchen & Living — «≈NN°».
- Средняя температура только от термометров — Стенд: в комнате с термоголовкой (climate) убедиться, что её current_temperature не ломает среднее (в комнате свой датчик температуры).
- Ширина диалога 500 px, компактные поля — Стенд: глазами в ⚙ пространства.
- Общие настройки (⚙ в шапке): цвета по режимам + Reset — Стенд: покрутить цвета glow/temp/lqi, Reset.
- Пользовательские цвета и на статичной карточке — Стенд: сменить цвет заливки, открыть вид «Схема».
- Градиент LQI между настроенными цветами — Стенд: сменить цвета weak/strong в ⚙ и посмотреть заливку zigbee.
- Per-space «Показывать LQI» — Стенд: выключить в ⚙ «Ground Floor» — бейджи цифр у датчиков и строка сигнала в тултипах пропадают только там.
- Центровка бейджа и глифа — Стенд: глазами на любой иконке при максимальном зуме.
- Hover-подсветка при кастомных бортах — Стенд: покрасить борта и навести.
- Настройки живут на сервере — Стенд: сменить цвет, открыть стенд в приватном окне/другом браузере — цвет тот же.
## Редактор разметки комнат ★
Всё проверяется в «Редакторе плана» на «Ground Floor» (или создайте своё пространство — сброс простит всё).
- Сетка, снап, общие стены — Стенд: дорисовать комнату впритык к существующей.
- Линейка сегмента (метры; cm/cell из настроек) — Стенд: начать рисовать контур, смотреть на бегущую длину.
- Незакрытый контур не сохраняется — Стенд: начать контур, уйти из разметки, вернуться — линий нет.
- Удаление комнаты бережёт общие стены — Стенд: удалить Guest WC (⚙ комнаты → удалить), стены соседних комнат на месте; сброс вернёт.
- Нет инструмента «Erase» в тулбаре — Стенд: глазами.
- Пересечения запрещены (клик внутри чужой комнаты → тост) — Стенд: попытаться начать контур внутри Kitchen & Living.
- Контур вокруг существующей комнаты отклоняется — Стенд: обвести Sauna снаружи.
- Merge двух смежных / отказ для несмежных — Стенд: слить Hallway + Under-Stairs Closet; тост при попытке слить пару без общей стены (подобрать по плану, например Sauna и Guest WC через комнату); сброс вернёт.
- Split: две точки на стенах, бОльшая часть сохраняет имя — Стенд: разрезать Kitchen & Living; Cancel в диалоге — комната цела.
- Split с точкой вне стены / вдоль стены → тост — Стенд: там же.
- Split на не-грид комнатах (снап к стене) — Стенд: полноценно — локально, но снап виден: клик чуть мимо стены цепляется.
- Промах далеко от стены → тост — Стенд: кликнуть в центр комнаты.
- Esc/Ctrl+Z снимает точку, Reset чистит — Стенд: во время рисования.
- Замыкание (≥4 точек) → диалог комнаты — Стенд: нарисовать комнату во «Yard».
- В диалоге только свободные зоны; выбор зоны подставляет имя — Стенд: занятые зоны из списка исчезают; «— без зоны —» есть всегда.
- При «— без зоны —» обычная кнопка «Сохранить» активна после ввода имени и создаёт комнату с `area: null`; отдельной кнопки «Без зоны» нет — Стенд: там же.
- Cancel диалога возвращает контур — Стенд: там же.
- Сохранение с зоной раскладывает устройства зоны — Стенд: частично: у demo-устройств v2 есть registry (группы света и лампы-заглушки), но маркеры стенда расставлены явно; полноценная автораскладка — локально/на даче.
- Erase удаляет линию, удаление комнаты — полигон — Стенд: инструментом «ластик линий» в тулбаре (клик по своей линии).
- Иконки скрыты в разметке — Стенд: глазами.
## Устройства на плане ★
- Авто-устройства только в комнатах своей зоны — Стенд: не проверяется напрямую (все 97 маркеров стенда расставлены явно) — локально/на даче.
- Фильтрация мостов/групп/сцен, 👁 «показать все» — Стенд: «Редактор устройств» → 👁: появляются скрытые сущности — в том числе лампы-заглушки световых групп (демо фильтрации).
- Нумерация дубликатов имён — Стенд: добавить второй маркер той же сущности не даст (занята) — проверяется локально.
- Группы света сворачивают лампы — Стенд: да: в комнатах — группы света, их лампы-заглушки скрыты; 👁 в редакторе устройств показывает заглушки.
- Drag иконок, снап к сетке, позиция per-space — Стенд: редактор устройств: перетащить иконку, F5 — позиция жива; у «Yard» своя раскладка.
- ↺ сброс автолейаута — Стенд: не проверяется: кнопка Reset убрана в v1.33.2 (пункт в TESTING.md исторический).
- Бейдж температуры, LQI с цветом — Стенд: под датчиками цифры LQI (разброс задан специально: от красных до зелёных по комнатам), температура на бейджах.
- Живые состояния: фактическая работа жёлтая, дверь/разблокированный замок/клапан оранжевые, штора нейтральная и меняет иконку, unavailable блёклый — Стенд: пощёлкать свет; тапнуть штору в Study; unavailable — Pantry Light, он такой всегда.
- Морфинг иконок по состоянию — Стенд: дверь/замок: открыть lock замка Front Door из карточки двери — иконка меняется; гаражные ворота во «Yard».
- «Значение вместо иконки» — Стенд: уже настроено: температуры котла в Boiler Room и % бака воды показаны цифрами; можно переключить display у любого датчика.
- RGB только в glow/activity — Стенд: включить лампу цветом (если выбранная группа поддерживает цвет — смотреть карточку): бейдж жёлтый стандартный, цвет только в пятне glow и activity-эффекте.
- Красная пульсация тревоги — Стенд: включить `input_boolean.demo_leak` (Настройки → Устройства и службы → Помощники) — датчики протечки пульсируют красным; датчики дыма вспыхивают сами каждые 10 минут (автоматизация).
- Стоимость рендера (geometry once) — Стенд: не проверяется руками — smoke_render_perf.
- Тап vs drag открывания — Стенд: редактор плана, тап по двери = свойства, drag на место = ничего не записано.
- Вогнутый остров — Стенд: нарисовать U-комнату во «Yard» и остров внутри.
- Backend hardening (B2–B5) — Стенд: не проверяется руками — unit/backend.
- Гонка сохранений (markup vs Save) — Стенд: два окна: в одном правка разметки, в другом Save диалога — правка выживает; остальное — тесты.
- Niche split — Стенд: разрез, начинающийся и кончающийся на одной стене — вырезается ниша.
- Контент только через подписанные URL — Стенд: залить план, скопировать URL картинки из DevTools, убрать authSig → 401; старые пути `/houseplan_files/plans` → 404.
- Каждая опция редактора сохраняема — Стенд: перебрать display/tap/fill в диалогах — ошибок валидации быть не должно.
- Кнопка настроек комнаты в геометрическом центре — Стенд: редактор плана, глазами.
- Один индикатор всегда (лампа жёлтая в plan-редакторе glow-пространства) — Стенд: включить свет, открыть редактор плана — бейдж жёлтый (glow-слоя там нет).
- Size/angle parity — Стенд: задать маркеру size 3 / angle 37 в диалоге → и на «Схеме» тоже ×3 и повёрнут.
- Tap запускает автоматизацию — Стенд: готового Run-маркера в v2 нет — назначить самому: в диалоге любого маркера tap-действие «Run» + поиск по automation/script/scene; тап → диалог подтверждения; Esc = не выполнять.
- Бейджи light-source в Glow — Стенд: у горящей группы света бейдж стандартный (индикатор — пятно), у включённого устройства с ролью «Всегда» (см. вводные) жёлтый.
- Множитель размера иконки растит глиф — Стенд: size 3 у любого маркера.
- Auto-grid parity, activity ghost, hidden LQI parity, ghost без цифр — Стенд: скрыть любой датчик с LQI: LQI комнаты не меняется, «Схема» совпадает с планом; «Hidden and disabled» в редакторе устройств показывает синий пунктирный призрак без значений и эффектов.
- Скрытие с плана — Стенд: кнопка «Скрыть» в левом нижнем углу диалога существующего устройства; после сохранения маркер исчезает из всех режимов и счётчика, но LQI комнаты держит. Через «Скрытые и деактивированные» тот же диалог предлагает кнопку «Показать».
- «Жёлтый = работает» — Стенд: вытяжка (kitchen hood) в Kitchen & Living: включить → жёлтая подложка; термоголовка с активным нагревом — тоже. AC в Bedroom — отдельный случай, см. «Климат без hvac_action».
- Safety floor редактора на touch (best effort, не проверка паритета) — Стенд: с телефона в редакторе плана pinch не создаёт геометрию, отпускание после pan не ставит точку, из редактора можно безопасно вернуться в View.
- Legacy-геометрия, положительные размеры, границы 1e100, no-op repair — Стенд: не проверяется (нужен подложенный битый store, у тестировщика нет доступа к .storage) — unit/backend.
- Карточка под другим контентом дашборда — Стенд: вид «Схема» — карточка стоит после других карточек и не схлопывается.
- Stranded migration repair / geometry repair — Стенд: не проверяется руками (WS-команда) — backend.
- Редакторы видят весь холст — Стенд: «Yard» (одна комната): в редакторе плана виден весь белый квадрат, во View — контент-фит.
- Save ждёт пропорции выбранного плана — Стенд: прикрепить «уже загруженный» план и мгновенно Save.
- Зум ниже фита (пол 0.4x) — Стенд: минусовать зум ниже 100%.
- Migration crash / parallel upload quota — Стенд: не проверяется (kill HA между записями невозможен) — backend.
- Зум открывается на контенте — Стенд: «Yard» открывается комнатой на весь экран.
- Удаление используемого плана запрещено — Стенд: в списке «уже загруженные» у подложки First Floor (first-floor.svg) delete неактивен.
- Квота загрузок — Стенд: можно доливать планы до квоты — тост; сброс почистит.
- Миграция на квадратный холст — Стенд: не проверяется (миграция уже прошла; нужен старый store) — unit.
- Картинка плана по центру с полями — Стенд: залить широкую картинку — поля сверху/снизу, без растяжения.
- Re-attach отвязанного плана — Стенд: ⚙ «First Floor» → «рисование» → Save → reload → «Уже загруженные» → прикрепить first-floor.svg обратно.
- Detach хранит файл — Стенд: там же: после отвязки файл в списке; замена плана убирает старый сразу.
- Перепривязка не ест мануалы — Стенд: маркер с 2 PDF перепривязать на другую сущность — оба открываются.
- Ничего не копится на idle — Стенд: не проверяется полноценно (ежечасный сброс раньше суточного sweep) — backend.
- Drag выигрывает у удалённого move — Стенд: два окна, тащить разные иконки одновременно.
- Одноимённые загрузки из двух вкладок — Стенд: можно, два вложения обязаны выжить; тонкости — unit.
- Временные файлы не выживают — Стенд: не проверяется (нужен доступ к ФС) — backend.
- Две полные карточки согласны в позициях — Стенд: два окна: drag в одном виден во втором без reload.
- Загруженный SVG инертен (script не исполняется) — Стенд: залить SVG со `<script>alert(1)</script>`, открыть его подписанный URL в новой вкладке — alert нет, план рендерится.
- Вложение не перезаписывает другое — Стенд: приложить manual.pdf к двум маркерам — два независимых файла.
- Два быстрых эдита выживают — Стенд: быстро сделать две правки подряд (throttle сети в DevTools) — обе на месте.
- Открытые границы следуют геометрии — Стенд: границы между Kitchen & Living ↔ Hallway ↔ Under-Stairs Closet уже открыты — утащить вершину общей стены в редакторе плана — разрыв едет вместе; можно открыть и свою.
- Внутренние лимиты (max+1) — Стенд: не проверяется руками — unit/backend.
- Большие файлы стримятся (50 MB) — Стенд: можно залить 50 MB мануал и скачать дважды; память HA снаружи не видна — полноценно только локально.
- Паритет статичной карточки (fill none) — Стенд: у комнаты поставить fill «нет» и сравнить со «Схемой».
- Layout доходит до статичной карточки — Стенд: drag иконки на «Плане» → на «Схеме» (другая вкладка того же дашборда) двигается.
- Repair-issue смертны — Стенд: удалить пространство с битым планом… проще: удалить пространство — связанные предупреждения из Настройки → Ремонт исчезают.
- Не-подписанный путь не зацикливает запросы — Стенд: не проверяется руками — unit.
- Подписи не усиливаются на плохой сети — Стенд: DevTools throttling + Network: один sign-запрос на URL.
- Битая папка планов не валит save — Стенд: не проверяется (нужна ФС) — backend.
- Два редактора, один план — Стенд: две вкладки, залить подложку в каждой по очереди — служится последняя, файлы целы.
- Фон статичной карточки — Стенд: открыть «Схему»: подложка First Floor на месте, в Network нет неподписанных запросов.
- Отклонённый save не трогает план — Стенд: две вкладки: обе меняют план, вторая получает конфликт — старый план жив.
- Кэш подписей на 200+ URL — Стенд: не воспроизводимо (нет 200 файлов) — smoke_sign_cap.
- Климат не дорожает с комнатами — Стенд: не проверяется руками — smoke_climate_once.
- Upload при конкурентной ревизии — Стенд: две вкладки: приложить фон при открытом втором редакторе.
- Подписанный фон плана — Стенд: см. выше: authSig в Network, нет failed login в журнале HA (Настройки → Система → Журналы).
- Зомби-диалоги — Стенд: Esc во время сохранения при throttling — диалог закрыт, тост об ошибке живёт.
- Нет hover-тултипов на touch — Стенд: с телефона.
- Слайдеры шрифтов (50–300%) — Стенд: ⚙ пространства + ⚙ комнаты: живой образец в диалоге следует слайдеру.
- Room settings tier 3 (имя, зона, fill override, источник T°/влажности) — Стенд: ⚙ любой комнаты; источник температуры/влажности можно переопределить (датчики влажности в доме есть) и посмотреть карточку.
- PDF переживает перепривязку — Стенд: см. «перепривязка не ест мануалы».
- Киоск-режим — Стенд: вид «Киоск» дашборда: шапки нет, свайп листает пространства с точками-индикатором, дабл-тап сброс зума, лонг-пресс 3 с на пустом месте — поповер размеров; авто-листание cycle — задано в конфиге вида; реальный планшет — руками на своём.
- Иконка-ссылка зоны у имени комнаты — Стенд: во View у имён комнат с привязанной зоной есть ↗ — клик ведёт в зону HA; в редакторах иконки нет.
- Смарт-гайды — Стенд: тащить иконку в редакторе устройств — пунктирные направляющие от соседей, бейдж длина·угол.
- Свет тогглится по умолчанию — Стенд: тап по любой группе света во View = вкл/выкл без настройки.
- Производные стены тоже режутся (.seg) — Стенд: открытые границы уже есть (Kitchen & Living ↔ Hallway ↔ Under-Stairs Closet): в редакторе плана сплошной линии под пунктиром нет.
- Пунктир открытых границ в разметке — Стенд: там же.
- Nav-персистентность (пространство+режим) — Стенд: уйти в «Yard», закрыть вкладку, открыть — снова «Yard»; `#space=f1` в URL сильнее.
- Чистка tap-действий + правый клик — Стенд: ПКМ по иконке во View = more-info HA.
- Редизайн секции биндинга — Стенд: «+» в редакторе устройств: радио Виртуальное/Из списка HA, «показать сущности», поиск в дропдауне.
- Настоящий пунктир открытой границы — Стенд: см. открытые границы.
- Hover открытия стены — Стенд: инструмент «Открыть границу»: у общей стены курсор pointer + янтарный пунктир-превью; на уже открытой — красное превью.
- Открытые границы: свет течёт по зоне — Стенд: при glow зажечь свет в Hallway — свечение заливает и Kitchen & Living, и Under-Stairs Closet через открытые границы.
- Свет через дверь непрерывен — Стенд: glow: смотреть проём из Hallway — сам проём освещён, за ним луч с чёткими краями, сужённый откосами; наружная дверь не светится вовсе.
- Per-source радиус glow — Стенд: поле «Радиус свечения» в диалоге лампы.
- Скрытая light-primary — Стенд: лампы-заглушки световых групп скрыты в реестре — glow комнаты питается группой; смотреть, что скрытые лампы не рисуют своих маркеров.
- Marker controls (тогл связки ламп) — Стенд: у настенного выключателя или виртуального маркера прописать «Управляет источниками света» + Toggle и тапнуть: лампы комнаты разом.
- Независимый Glow — Стенд: выбрать любую заливку пространства, отдельно
включить «Свечение источников света», зажечь свет — заливка данных остаётся,
поверх появляется пятно; радиус меняется в ⚙. Пересечения нескольких пятен
должны быть ярче и смешивать цвета.
- Островные комнаты — Стенд: нарисовать остров во «Yard».
- Иконка не прыгает при перепривязке — Стенд: перепривязать маркер: позиция та же; смена комнаты в том же пространстве тоже не двигает.
- Плейсхолдер автоиконки — Стенд: диалог без явной иконки: «Auto: mdi:…» с превью.
- Нет кнопки Reset в тулбаре Devices — Стенд: глазами: add / 👁 / ⬡.
- Сетка во всех редакторах + fade декора — Стенд: редактор фона: комнаты/иконки блёкнут до 35%, декор яркий.
- Редактор фона (фигуры/текст/ластик) — Стенд: порисовать во «Yard»: прямоугольник-«газон», текст; готовый образец — контур гаража.
- Свои изображения — Стенд: редактор подложки → «Изображение», загрузить PNG
с прозрачностью и безопасный SVG до 2 МиБ; выбрать из палитры, проверить
one-shot предпросмотр, плавный resize/отражение/поворот и отсутствие магнита
к стене. Создать вторую копию в другом пространстве: удалить общий файл из
палитры можно только после удаления обеих копий. Во View и отдельной карточке
изображение одинаково пассивно; светлая/тёмная тема не меняет его пиксели.
- Превью открывания (призрак 90 см) — Стенд: инструмент «Открывание», водить у стены.
- Split-polyline, курсоры, Esc-цепочка — Стенд: split Kitchen & Living ломаной через середину.
- Подсветка выбранного в merge/split — Стенд: янтарная обводка первой комнаты.
- Карточка vs инструмент — Стенд: в редакторе плана тащить карточку комнаты при активном Draw — точек не ставится.
- Карточки комнат (метрики, drag, resize) — Стенд: включить метрики в ⚙ пространства; в редакторе плана карточку можно тащить и растягивать за углы.
- Esc закрывает диалоги по одному — Стенд: наоткрывать вложенных диалогов.
- Общая ⚙ видна во всех режимах — Стенд: глазами.
- Табы редакторов (2 шт + X) — Стенд: глазами.
- ⚙ пространства в каждом режиме — Стенд: глазами.
- Lock action (Unlock красный + подтверждение) — Стенд: карточка Front Door; вторая дверь с замком — Terrace.
- Флаг нового устройства (красная точка) — Стенд: не проверяется напрямую (набор сущностей демо фиксирован; точка была бы у новых) — локально.
- Ноль устройств в HA — Стенд: не проверяется (в демо ~100 сущностей) — smoke_new_device.
## Стены, перегородка, декор (новое в доме v2)
- Толстые стены со штриховкой — Стенд: «Ground Floor» нарисован от руки, у стен 23 записи толщины: наружные/несущие толстые, со штриховкой; на зуме штриховка остаётся чёткой, бумага комнат ложится по контурам.
- Перегородка и колонна — Стенд: на Ground Floor есть одна перегородка и одна колонна — найти глазами; в редакторе плана редактируются своими инструментами.
- Пунктирная декор-линия — Стенд: на Ground Floor одна пунктирная линия декора; в редакторе фона выделяется и редактируется.
- Декор-тексты — Стенд: подписи Porch и Terrace на Ground Floor, контур гаража во «Yard» — чистый декор, во View инертны.
## Подложка-картинка на «First Floor» (новое в доме v2)
- First Floor демонстрирует фичу подложки (docs/BACKDROP.md): архитектурная SVG-картинка `first-floor.svg`, нарисованная точно по контурам комнат — Стенд: открыть «First Floor», глазами: картинка под бумагой комнат, бумага всегда по контурам.
- Двигать/масштабировать/вращать подложку — Стенд: «Редактор фона» на First Floor: сместить/отмасштабировать/повернуть картинку, Save, F5 — держится; сброс вернёт эталон.
## Живые текст-метки (новое в доме v2)
- «Boiler {}» и «Water tank {}» в Boiler Room — Стенд: глазами: плейсхолдер `{}` подставляет живые состояния `sensor.boiler_flow_temperature` и `sensor.water_tank_level`; значения меняются со временем.
- «Outdoor {}» во «Yard» — Стенд: там же, уличная температура.
- Редактирование — Стенд: редактор фона: текст с `{}` и привязанной сущностью.
## Шторы и ворота — covers (новое в доме v2)
- Тап открывает/закрывает штору — Стенд: две шторы (curtains) в Study: тап во View = открыть/закрыть, иконка морфится по состоянию.
- Гаражные ворота — Стенд: «Yard»: cover ворот исключён из общего тогла карточки правилами доменов — общий тогл ворота не трогает; открыть можно из карточки.
## Медиаплееры нейтральны (новое в доме v2)
- TV + колонки играют — маркер остаётся нейтральным (media-правило: воспроизведение ≠ «работа») — Стенд: запустить воспроизведение из карточки плеера и убедиться, что жёлтой подложки нет.
## Климат без hvac_action и составная розетка (новое в доме v2)
- AC в Bedroom = `climate.ecobee` БЕЗ атрибута hvac_action — жёлтая подложка приходит по фолбэку hvac_modes — Стенд: включить кондиционер из карточки: маркер желтеет, хотя hvac_action нет.
- Составной Smart Plug: сущность Power + опциональные свитчи — маркер красит только Power — Стенд: пощёлкать опции в карточке (маркер не меняется), затем Power (маркер желтеет).
## Unavailable и деактивированные (новое в доме v2)
- Pantry Light всегда unavailable — Стенд: глазами: блёклый маркер, без активности; тултип/карточка показывают недоступность.
- Smart Plug 2 деактивирована в реестре HA — зарезервирована под будущую фичу disabled-devices; сейчас рендерится по текущему поведению — Стенд: см. раздел «Деактивированные устройства HA».
## «Значение вместо иконки» в бою (новое в доме v2)
- Числа — Стенд: Boiler Room: температуры котла и % бака воды показаны цифрами вместо иконок.
- Текст и энергия — Стенд: Study: текстовый статус-сенсор (строка) и сенсор энергии в kWh (число) — оба в режиме «значение».
## Солнце и день/ночь (новое в доме v2)
- `weather.demo_weather_south` подключена к «Ground Floor» — Стенд: глазами: клинья солнечного света из окон внешних стен, фон день/ночь по реальному времени (docs/SUN.md); настройки — в ⚙ пространства.
## Диалог устройства (маркеры) ★
- Все поля сохраняются — Стенд: любой маркер: имя/иконка/модель/ссылка/описание, F5.
- Перепривязка с поиском, занятые исключены — Стенд: дропдаун биндинга: уже размещённые сущности в списке отсутствуют.
- Виртуальное устройство: имя+комната, пунктир — Стенд: создать своё через «+» (готового виртуального в v2 нет — все маркеры привязаны к сущностям).
- Комнаты без зоны в списке комнат — Стенд: нарисовать комнату «без зоны» и поместить туда маркер.
- Room override центрирует — Стенд: сменить комнату маркера.
- Tap-action override — Стенд: перебрать все варианты у одного маркера.
- PDF: ok / >50 MB / .exe — Стенд: приложить файлы к маркеру; большие и .exe должны дать читаемую ошибку.
- `javascript:` в ссылке не кликабелен — Стенд: вписать `javascript:alert(1)` в поле ссылки — в карточке не ссылка.
- Remove: авто → скрытый маркер, виртуальное → насовсем — Стенд: удалить свой виртуальный маркер и любой entity-маркер (сброс вернёт).
## Правила иконок ★
- ⬡ открывает редактор с текущими правилами — Стенд: редактор устройств → ⬡.
- Тест-поле, добавление/удаление/порядок — Стенд: там же, ввести имя «Boiler…».
- Битый regex краснеет и пропускается — Стенд: вписать `([`.
- Reset к дефолтам — Стенд: там же.
- Правила переиконивают существующие; per-device иконка сильнее; замки всегда mdi:lock — Стенд: правило `.*light.* → mdi:star` и смотреть план.
- Живут после reload и во втором браузере — Стенд: приватное окно.
## Tap-действия и жесты ★
- Тап → карточка, `toggle` тогглит только свет/розетки/вентиляторы — Стенд: пощёлкать группы света (toggle по умолчанию), TV/колонку (карточка).
- Замки не тогглятся никогда; шторы Study открываются/закрываются тапом (covers), гаражные ворота — нет — Стенд: замок Front Door; штора в Study; ворота во «Yard».
- Long-press всегда карточка — Стенд: зажать лампу на 600 мс — карточка вместо toggle.
- Drag >3 px отменяет tap/long-press — Стенд: потащить палец с иконки.
- pointercancel без фантомов — Стенд: с телефона: начать тап и свернуть браузер.
## Zoom / pan / подписи
- Wheel у курсора, +/−, fit, % — Стенд: глазами.
- Pinch + двухпальцевый pan — Стенд: с телефона.
- Зум живёт per-space в localStorage — Стенд: зазумить «Ground Floor», перейти в «Yard» и назад, F5.
- Resize окна перефитит — Стенд: свернуть боковую панель HA.
- Подписи комнат таскаются (rl_*) — Стенд: в редакторе плана утащить имя комнаты, F5.
- Читаемость подписей на мин/макс зуме — Стенд: глазами на белом плане и на подложке First Floor.
## Мультиклиент ★
- Две вкладки: drag виден без reload — Стенд: два окна рядом.
- Конфликт конфига → тост, авторесинк, retry — Стенд: два окна: одновременно править настройки пространства.
- Точечные layout-апдейты не трутся — Стенд: тащить разные иконки в двух окнах.
- `admin_only` для не-админа — Стенд: не проверяется (нет второго пользователя) — backend.
## Крайние случаи
- HA без устройств/зон — Стенд: не проверяется (демо полон сущностей) — локально.
- Пространство без комнат — Стенд: создать пустое, видна подсказка разметки.
- Комната без зоны + борта — Стенд: нарисовать, кликнуть — ничего.
- Нет zigbee вовсе — Стенд: «Yard»: заливка lqi оставляет двор незалитым, бейджей нет.
- 100+ устройств в одном пространстве — Стенд: почти: на «Ground Floor» ~51 маркер из 97; полная сотня в одном пространстве — локальная синтетика.
- Длинные имена — Стенд: переименовать маркер в очень длинное имя.
- HTML/эмодзи в именах — Стенд: назвать маркер `<b>xss</b>🚿` — текст, не разметка.
- План удалён с диска → Repairs — Стенд: не проверяется (нет доступа к ФС) — backend.
- Битый houseplan.config — Стенд: не проверяется (нет доступа к .storage) — backend.
- Рестарт HA при открытом диалоге — Стенд: не проверяется: demo_guard блокирует рестарт HA на стенде (кнопка перезапуска даёт ошибку) — локально/на даче.
- Legacy layout v1 — Стенд: не проверяется — unit.
- Киоск холодный старт в приложении — Стенд: Companion app + вид «Киоск», убить и открыть.
## Релизные регрессии
- Ноль ошибок консоли — Стенд: DevTools console на дашборде, в разметке, диалогах, зуме (обратный отсчёт сброса стенда в консоли — норма, не ошибка).
- Ноль houseplan-ошибок в логе HA — Стенд: Настройки → Система → Журналы, фильтр «houseplan».
- npm test / pytest / CI — Стенд: не про стенд — CI.
- Скриншоты README — Стенд: не про стенд.
## houseplan-space-card (вид «Схема»)
- Рендер идентичен плану, без шапки — Стенд: вид «Схема» дашборда.
- Полностью неинтерактивна — Стенд: покликать по «Схеме» — ничего, даже тултипов.
- Кнопка-футер открывает полную карточку на этом пространстве — Стенд: клик по кнопке под «Схемой».
- Несколько с разными space — Стенд: «Схема» содержит несколько пространств — один общий WS-запрос (Network).
- Неизвестный space → аккуратная ошибка — Стенд: отредактировать вид, вписать space: nope.
- show_button: false — Стенд: правкой YAML вида.
- #space= диплинк — Стенд: открыть `…/plan#space=f2` (First Floor).
## Состояние и активность устройства
- В списке отображения ровно четыре режима: «Значок + состояние», «Значок + состояние и активность», «Значение + состояние», «Всегда статичный значок»; «Только пульсация» отсутствует.
- «Всегда статичный значок»: включённое, выключенное, unavailable и тревожное устройство выглядят одинаково нейтрально, без °/%/LQI и activity; hover и клик работают как прежде. У alarm-capable привязки есть предупреждение.
- У пылесоса этот режим скрывает puck и след, а возврат к динамическому режиму снова показывает сохранённый след.
- Motion в «Значок + активность» даёт три волны только при `off → on` и затихает примерно через 3,3 с, даже если датчик ещё `on` — Стенд: датчики движения расставлены по Ground Floor.
- Occupancy/presence показывает спокойную постоянную пульсацию, пока присутствие активно — Стенд: датчики присутствия там же (контраст с тремя конечными волнами motion — рядом).
- Штора в `opening/closing` показывает дыхание только в «Значок + активность»; при прямом `closed ↔ open` без промежуточного состояния эффект держится примерно 3,3 с — Стенд: шторы в Study.
- Работающий свет, реле, вентилятор, climate с активным `hvac_action` и пылесос получают жёлтую подложку; медиаплееры при воспроизведении остаются нейтральными (media-правило); `automation = on` (включена) тоже нейтральна.
- Дверь/окно, разблокированный замок и открытый клапан — оранжевые, а не жёлтые.
- Тревога всегда красная и пульсирует во всех динамических режимах; «Всегда статичный значок» — явное нейтральное исключение. Unavailable приглушён и не получает обычной активности — Стенд: дым сам каждые 10 минут, протечка через `input_boolean.demo_leak`, unavailable — Pantry Light.
- Цвет и размер ×2..×8 применяются к обычной активности; тревога остаётся красной.
- Размер ×0.5..×3 и поворот; бейджи масштабируются — Стенд: любой маркер.
- При выключенных live-состояниях обычные статус и активность выключены, критическая тревога остаётся.
- reduce motion — Стенд: включить в ОС тестера; обычная активность обозначается компактной точкой, статичное кольцо не появляется, а тревога остаётся видна по красной подложке.
## Двери, окна и ворота
Замки уже стоят: Front Door (вход через Hallway) и Terrace — бейджи замков на
открываниях. Оконные/дверные контакты навешаны на несколько окон и дверей;
всего на Ground Floor 15 открываний.
- Клик мимо стены → тост; у стены → диалог — Стенд: инструмент «Открывание» в разметке.
- Дверь: косяки+полотно+дуга, длина в см — Стенд: глазами у входной двери.
- Ворота: две равные створки без дуги, статически открыты наружу на 10°;
по умолчанию 300 см. На локальной сборке проверить датчик, замок и Glow;
на стенде пока не посеяны.
- Контакт: open → створка + дуга акцентом — Стенд: переключить сущность контакта из more-info/Developer Tools (demo — админ, может) и смотреть створку.
- Unavailable → статичный дефолт — Стенд: не проверяется на открываниях (unavailable в доме только Pantry Light) — локально.
- Замок: зелёный/оранжевый/серый бейдж — Стенд: замок Front Door, открыть/закрыть из карточки.
- Карточка с двумя состояниями, замок не тогглится с плана — Стенд: клик по двери/замку во View.
- Flip зеркалит петли/сторону — Стенд: диалог открывания (двойной клик с инструментом).
- Клик с инструментом → редактирование; Delete — Стенд: там же.
- Hover: акцент + grab во View — Стенд: навести на дверь.
- Drag вдоль стен с переснапом за углы — Стенд: тащить дверь по периметру Hallway.
- Один клик = карточка, дабл = свойства, drag = ничего — Стенд: там же.
## Живые пылесосы (docs/VACUUM.md)
Симулятор: робот `vacuum.demo_robot` с базой в Under-Stairs Closet (база =
маркер), карта в стиле Tasshack (позиция-словарь, комнаты с именами как на
плане, mm, ось Y перевёрнута), калибровка уже прописана. Маршрут уборки:
змейка Under-Stairs Closet → Hallway → Guest Bedroom → Kitchen & Living.
- Docked: только маркер базы — Стенд: глазами (робот в Under-Stairs Closet).
- Уборка: круглая пульсирующая шайба едет, база на месте — Стенд: тап по маркеру робота → карточка → Start (или Настройки → Устройства и службы → Сущности → vacuum.demo_robot); шайба змейкой проходит все 4 комнаты маршрута.
- Глайд ~1.2 с, телепорт при zoom/pan/switch — Стенд: во время уборки позумить.
- Режимы следа never/cleaning/always — Стенд: диалог маркера робота → «Показывать путь робота»; в always виден след прошлой уборки (если после сброса она уже была).
- Серверный след (переживает reload) — Стенд: запустить уборку, F5 посреди — линия продолжается с места; вторая вкладка видит ту же линию.
- Стиль: тёмный ореол + светлое ядро — Стенд: глазами поверх glow-заливки.
- Скрытый маркер: ни шайбы, ни следа — Стенд: скрыть маркер робота на время уборки.
- Калибровка: «Настроить автоматически» — Стенд: диалог робота → «Живая позиция»: имена комнат карты совпадают с комнатами плана — автокалибровка сходится; панель подгонки (призрак, углы, поворот, зеркало — зеркало осмысленно: ось Y в карте перевёрнута) тоже можно открыть и покрутить, Esc/Cancel не портит.
- Мультиэтаж (матрица на карту) — Стенд: частично: карта одна (map 1), матрица хранится по её id; мультикарта — только на реальном Dreame.
- Pause/Return — Стенд: кнопки в карточке робота: пауза замирает, «домой» возвращает по своим следам с двойной скоростью.
## Чего на стенде нет принципиально
- Реальное Zigbee/Z-Wave железо, реальные роботы (Dreame/Xiaomi/Valetudo), реальный настенный планшет.
- HACS-путь установки/обновления, YAML-mode Lovelace, переустановка интеграции с сохранением конфига.
- Рестарт HA изнутри — заблокирован demo_guard (сброс контейнера раз в час — единственный «рестарт»).
- Всё, что требует доступа к файловой системе стенда: битые store, kill -9 между записями, недоступные папки, наблюдение за памятью процесса.
- Долгоживущие сценарии (суточный sweep, «часом позже») — сброс стенда наступает раньше.
- Не-админский пользователь (admin_only, скрытие табов) — на стенде один админ demo.