Решения владельца: 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
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, plusdemo_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 — seedocs/TESTING-DEMO.mdand the memory notehouseplan-demo-stand. -
demo_guard/— stand-only guard (2026-07-31). Visitors log in as an administrator (the card editor is gated onis_admin) and kept restarting HA from the UI, which looked like the stand crashing between hourly resets. The component re-registershomeassistant.restart/homeassistant.stopas no-ops after startup. Deployed by the sameinstall.shinto 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.jsfromseed-demo/www/, wired throughfrontend: extra_module_url. Logs a styledconsole.infoevery minute, switching toconsole.warnfor the last 5 minutes.www/stand-dev-info.jsis the dev-stand counterpart: a singleconsole.infosaying 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 thedevtree between betas carries the last beta's bundle. Validate publishes the bundle it built for the head ofdevinto the orphan branchdev-build(one commit, force-pushed,DEV-BUILD.jsonnames the source SHA;scripts/dev-build.mjs). The host deploy script must overlay it aftergit 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-buildUntil
/opt/hp/bin/hp-update-dev.shdoes this, the dev stand shows the last beta's bundle instead of the head ofdev.
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.