Files
Matysh 9419842333
Validate / golden (push) Failing after 6m50s
Validate / hacs (push) Failing after 11s
Validate / hassfest (push) Failing after 14s
Validate / frontend (push) Successful in 8m18s
Validate / backend (push) Failing after 10m34s
Validate / smoke (push) Failing after 24m45s
Validate / performance_smoke (push) Failing after 9m42s
Full Performance / performance (push) Failing after 54m31s
fix(hacs): keep exactly one *manifest.json in the tree
The HACS submission check does not read hacs.json to find the integration: it
globs `*manifest.json` over the whole clone of the default branch and exits 1
unless there is exactly one (hacs/default, scripts/helpers/integration_path.py).
Three files matched — the two stand-only integrations added on 2026-07-31 and
the golden baseline index added on 2026-08-11 — so the Hassfest job of PR #9004
went red five weeks into the review queue, with a log that named no file.

The stand manifests ship as manifest.template.json and demo/stand/install.sh
renames them at install time; the golden index becomes baselines-index.json
(the exported constant keeps its name, so no consumer changes).
test/repo-hygiene.test.mjs fails if a second manifest ever appears, and the
existing golden-policy assertion — which compared against 'manifest.json' and
happily passed on 'baseline-manifest.json' — now checks the suffix.
2026-08-11 14:03:38 +03: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.

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.