Files
houseplan-card/demo/stand
Claudeandclaude[bot] 88c4e4e9ae infra(process): bundle and review index change only on the way to dev (#657)
Решения владельца: 1б — индекс ревью не пересобирается в ветке задачи,
только коммитами, идущими в dev; 2б — бандл меняет только кандидат
беты/релиза, стенд dev берёт его из артефакта Validate.

- scripts/bundle-policy.mjs: коммит, трогающий dist/** или
  custom_components/houseplan/frontend/**, обязан нести Release:
  (хук commit-msg и история в CI через validate-commit-provenance;
  коммиты с датой автора до 2026-09-27 не судятся); --verify судит
  целостность свежей сборки всегда, побайтовую сверку с закоммиченной
  копией — только на коммите, меняющем бандл, или кандидате; --clean.
- release-prerelease: публикация отказывает, если отпечаток исходников
  в закоммиченном манифесте не равен отпечатку дерева (хотфикс поверх
  кандидата без пересборки).
- bundle-sync: по умолчанию только demo/srv/assets; --release
  (npm run bundle:release) — ещё и custom_components.
- rebase-on-dev: конфликт в бандле берёт копию dev, без пересборки
  и amend.
- validate.yml: job dev_build публикует card-bundle головы dev в
  сиротскую ветку dev-build (scripts/dev-build.mjs); стенд накладывает
  её demo/stand/update-dev-bundle.sh.
- _process.yml: индекс ревью больше не пересобирается при приведении
  к dev и при публикации документа в ветку задачи.
- golden-wsl-artifact/golden-container: сборка перед съёмкой не
  считается правкой источника, после — bundle:clean.
- test/bundle-tree-committed: судит закоммиченный снимок, не диск.
- 11 мутантов в реестре; PROCESS/AGENTS/DEVELOPMENT/AUTHOR/REVIEWER.

Issue: #657
User-Visible: no
2026-09-26 07:28:23 +00:00
..

Demo-stand extras

Things that live on the public stand (demo.houseplan.tech) but are not part of the shipped integration.

  • demo_robot/ — the scripted robot vacuum (docs/VACUUM.md, "demo stand gets a scripted synthetic robot"). Deployed with ./install.sh <ha-config-dir> into both stand seeds, plus demo_robot: in configuration.yaml; the dev stand picks it up automatically from this path (/opt/hp/bin/hp-update-dev.sh, which calls the same script). The rest of the stand-only config (template LQI sensors, alarm helpers, the smoke automation) lives in the seeds on the stand host — see docs/TESTING-DEMO.md and the memory note houseplan-demo-stand.

  • demo_guard/ — stand-only guard (2026-07-31). Visitors log in as an administrator (the card editor is gated on is_admin) and kept restarting HA from the UI, which looked like the stand crashing between hourly resets. The component re-registers homeassistant.restart/homeassistant.stop as no-ops after startup. Deployed by the same install.sh into seed-demo only (the dev stand sits behind basic auth) + demo_guard: in configuration.yaml.

  • www/stand-reset-timer.js — console-only countdown to the next hourly reset (hp-reset.timer, every hour at :00). Served as /local/stand-reset-timer.js from seed-demo/www/, wired through frontend: extra_module_url. Logs a styled console.info every minute, switching to console.warn for the last 5 minutes. www/stand-dev-info.js is the dev-stand counterpart: a single console.info saying the dev stand only resets on deploy.

  • update-dev-bundle.sh — the dev stand's card bundle (#657). Since #657 the committed bundle changes only in a beta/release candidate, so the dev tree between betas carries the last beta's bundle. Validate publishes the bundle it built for the head of dev into the orphan branch dev-build (one commit, force-pushed, DEV-BUILD.json names the source SHA; scripts/dev-build.mjs). The host deploy script must overlay it after git pull:

    demo/stand/update-dev-bundle.sh --reset <checkout>   # before git pull: restore the tracked copy
    git -C <checkout> pull --ff-only
    demo/stand/update-dev-bundle.sh <checkout>           # after: frontend ← origin/dev-build
    

    Until /opt/hp/bin/hp-update-dev.sh does this, the dev stand shows the last beta's bundle instead of the head of dev.

Why the manifests are templates

Both components ship their manifest as manifest.template.json, and install.sh renames it to manifest.json on the stand.

The reason is the HACS submission check: hacs/default validates a repository by globbing *manifest.json over the whole clone of the DEFAULT branch and refuses anything that does not have exactly one (scripts/helpers/integration_path.py — "No manifest", exit 1). Two stand-only manifests turned the Hassfest job of PR #9004 red on 2026-08-11, five weeks into the review queue. test/repo-hygiene.test.mjs now fails if a second one appears, so this cannot be rediscovered by a reviewer again.