Package the reviewed Optimize reconciliation, safe fixed-topology Resize and wall-union isolation fixes from #276, #277 and #278 as the eighth v1.67 prerelease candidate. Issue: #278 User-Visible: yes
25 KiB
Project status & session context
Purpose of this file. Cowork/AI sessions lose context (overflow, new session). This file is the first thing to read when resuming work. It captures the current state, where everything lives, and how to continue safely.
Documentation policy (mandatory): every change is documented in the same commit — a CHANGELOG entry for anything user-visible in BOTH
docs/CHANGELOG.md(English) anddocs/CHANGELOG.ru.md(Russian, since v1.42.0 — the user base is largely Russian-speaking, see the Telegram chat), STATUS.md for state changes (versions, publication, infrastructure), DEVELOPMENT.md for new gotchas, ARCHITECTURE.md for design changes. Work scope and status live in GitHub Issues and their labels, not in a parallel backlog document.
Promotion rule (2026-08-08): every new feature or material behaviour change must pass through a published beta/RC before stable. Stable release commits are promotion-only (versions, generated bundles and release/changelog metadata). Only an explicit owner-approved emergency hotfix may skip this gate.
Snapshot (2026-08-24)
| Item | State |
|---|---|
| Version | v1.67.0-beta.8 candidate everywhere (manifest, const.py, package.json, CARD_VERSION) — eighth prerelease of the v1.67 line |
| Current local cycle | v1.67.0-beta.7 is published. Current dev contains exact explicit-Optimize reconciliation of a redundant partition over one solid shared room wall (#276), fixed-topology Resize that moves only safe horizontal/vertical walls and affects at most two exact endpoint-matched rooms (#277), and component-aware wall-union isolation plus a strict transaction barrier for all physical geometry edits (#278). v1.67.0-beta.8 packages these reviewed S8 changes and remains gated by the full exact-SHA Validate before publication. |
| Hidden Labs Stage | #89 Stage 1 ships in v1.63.0-beta.1. #122 Stage 2 ships in v1.64.0 and evolves the same hidden, expiring iso experiment with matte walls, a low exterior floor edge, restrained shared shadows and live vertical door/window/gate panels. Flat remains default; editors and houseplan-space-card remain flat; live floor effects and HA actions remain unchanged. Public activation remains a separate task. |
| Workflow | Superseded 2026-08-12: the pre-1.62 rule of "local edits without tests or commits" is dead — since release 1.62 every product change follows PROCESS.md (issue in S5-ready+, branch issue/<NN>-slug, trailers on every commit, review pipeline; AGENTS.md is the summary). Release mechanics below remain current. A requested pre-release gets a production build plus the smallest targeted unit/smoke set covering the changed surfaces, one tested dev commit/tag and a GitHub Release with prerelease=true; main stays untouched. The complete local frontend/backend/smoke gate runs only before a stable release, after which main is fast-forwarded to the exact tested dev SHA and the GitHub Release uses prerelease=false. Release bodies are short and bilingual (Russian first): only significant user changes get individual bullets, while minor/code-only work is grouped as Мелкие исправления и улучшения / Small fixes and improvements; every body ends with separate links to the Russian and English changelogs. Detailed RU/EN changelog bullets may link the corresponding closed GitHub Issues; open or partially delivered issues are never presented as shipped. Telegram announcements are sent only for stable releases; beta and RC publication is silent. docs/RELEASE-NOTES.md is the current canonical body instance; npm run release:prerelease -- <tag> --issues=… --yes is the primary local publication path and the manual Publish prerelease workflow is its GitHub-only equivalent once present on main. Nothing is copied to the home instance by hand |
| GitHub | https://github.com/Matysh/houseplan-card — Issues are the canonical task records; their labels carry priority and workflow status (PROCESS.md §9). GitHub Projects is no longer used. main carries stable releases; pre-release tags may point directly at dev. Work lands on dev and is merged into main for a stable release, so dev is normally equal to or ahead of main, never behind. Push via SSH key ha_jb (remote git@github.com:…); API releases via the fine-grained PAT in ~/.git-credentials (Contents R/W, issued 2026-07-23) |
| CI | Prerelease publication requires a green exact-SHA Validate: frontend/backend, smoke (including the #73 rAF frame sampler), golden, HACS/Hassfest and a short absolute-ceiling performance smoke. Obsolete same-ref Validate runs are cancelled. Full seven-sample base/candidate performance moved to performance.yml (main push, weekly, manual); stable release assets fail closed unless Validate and Full Performance are green for the exact tagged SHA and the stable-only CDP compositor screencast finds no empty/black presented frame. |
| HACS | Custom repository works. Inclusion PR: hacs/default#9004 — open, valid, labeled, mergeable clean, never drafted. Queue: 1212 open, 835 older than ours. Merge rate COLLAPSED: 75 in July but almost all in the first decade, 0 in the last week (checked 2026-07-29) — maintainers process in rare bursts; ETA unknowable, months at best. Nothing actionable on our side |
| Home instance | ha.jbstudio.pro (SSH port 22222, key ha_jb; HA config root is /mnt/data/supervisor/homeassistant — /config does NOT exist in this SSH environment), last direct copy was v1.57.0; from v1.58.0 on it updates itself through HACS by tag (no scp) |
| Localization | UI en/ru (src/i18n/*.json), everything user-visible localized incl. kiosk popover |
| Tests | Four layers: Node unit (npm test: frontend pure modules + tooling policy), pure backend (pytest tests_backend, runs anywhere), HA-harness backend (same folder, CI only — needs py3.13 + pytest-homeassistant-custom-component), and browser smokes (demo/smoke_*.mjs, headless chromium). Counts are not written down here — they went stale within two releases while the version line beside them was kept current, which reads as less coverage than exists (review R5-2). Run npm run inventory for the current numbers, or read them off the last CI run |
| Input support | Owner's rule since 2026-08-08: View and kiosk are fully supported and release-blocking on touch. All three editors are desktop-first; touch editing is best effort and may be awkward, reduced or absent when parity is expensive. docs/TOUCH-SUPPORT.md defines the non-negotiable safety floor and documentation/test rules |
| Vacuums | Live puck, server-side trails and fit calibration are shipped. The local v1.61 Stage 1 contract in docs/VACUUM.md adds explicit Dreame/XCME/Valetudo coverage, registry-less source selection, capability diagnostics, path-gap preservation and source-health warnings; #205's issue branch resumes one ended same-map run through an inclusive 30-minute station/pause grace. Roomba remains Stage 2 |
| Demo stand | https://demo.houseplan.tech — public, login demo/demo, resets to a pristine synthetic home every hour. https://dev.houseplan.tech — closed (basic auth), auto-deploys the dev branch every 10 min. Host: ssh -i ~/.ssh/hp_stand hp@135.106.166.146; layout, seeds and gotchas in the memory note houseplan-demo-stand. Since 2026-07-31 the stand covers most of the manual checklist: a scripted robot vacuum (demo/stand/demo_robot — Tasshack-shaped map sensor, serpentine run, pre-solved calibration, seeded server trail), Zigbee-style LQI template sensors, hand/auto-triggered leak+smoke alarms, an hvac_action climate marker and working script/scene/automation targets for tap-run. The stand-specific how-to-check guide is docs/TESTING-DEMO.md |
| Community | Telegram chat: https://t.me/ha_houseplan (created 2026-07-27) — the primary user-facing support channel; GitHub issues stay for bugs/features. Link it from any new release notes and posts |
| Product scope | docs/SCOPE.md is the feature guard rail; docs/TOUCH-SUPPORT.md is the input-support contract — check both before accepting interaction work |
Current feature surface (since the 2026-07-17 snapshot)
- Three editors + View: Plan / Devices / Background (decor layer v1.33) as
tabs with an X to close; View is the default; only the last space persists,
while reload/return from another HA route always starts in View (#93).
Kiosk mode (v1.41.0):
kiosk: true— no header/editors, swipe between spaces, double-tap zoom reset,cycle: Ncarousel, per-screen size multipliers in localStorage. - Independent Glow overlay (#55/#19, refined locally by #61/#65–#67): dark-room
base is used only when the effective fill resolver returns
null, including dynamic modes without usable data; resolved LQI/light/temp/custom colors keep their exact alpha while per-source pools remain visible. Pools use additive screen blending only after a cached real-pixel browser probe and otherwise fall back to normal composition; legacyfill_mode: glowremains losslessly readable/migratable. Marker roles are Auto/Always/Never; colour can remain live, be overridden with live brightness, or be fixed together with brightness. One perceptual alpha resolver gives every source the alpha at the centre of its pool;GLOW_FALLOFFthen spends it over the whole radius. Per-source radius, doorway sight lines and transitive open boundaries remain — all three now fall out of the visibility region instead of separate layers. - Custom room fill (#56, space UX refined locally by #64): the space dialog uses persistent user color/opacity as its ordinary first/default fill instead of a redundant None option; a room keeps None as an explicit inherited-fill suppression. Effective inheritance is room → space → safe documented default; room reset restores space inheritance, and full/static renderers share the same projection.
- Universal device toggle (#94, v1.62.0-beta.3): one
Toggle stateoption is visible for every marker and resolves the exact binding, functional device role or explicitly configured controls. Hint, click, confirmation and cover presentation share one result; partial groups call only the shown available subset, stale controls never fall back, secure targets are no-op, and legacycover/absent light defaults round-trip losslessly. Lights toggle by default (v1.39); other devices still default to the House Plan card. - Plan geometry: polyline split (v1.32), island rooms w/ evenodd holes (v1.34), smart guides + 45° angle badge (v1.40), opening hover preview. Openings support doors, windows and compact wide gates; gates retain door contact/lock/Glow semantics but use two leaves opening only 10° outwards.
- Rooms: room cards with metrics (temp/hum/lqi/light "1 of 3") and proportional resize (v1.31); link icon to the HA area (v1.40.1, room taps removed). New-device red dot (v1.29), lock action button (v1.30).
- Dialog UX: binding radios + entities checkbox + search dropdown (v1.38.0); tap actions simplified to Device card / more-info / Toggle, right-click → more-info (v1.38.1); Esc closes every dialog (v1.30.4).
- Room settings, tier 3 (v1.42.0): per-room fill/temp-source/label sizes; the settings button sits at the room's VISUAL centre (inscribed circle + centroid pull), icon-derived size, zooms with the plan (v1.51.0).
- Files & plans (v1.44–v1.50): signed content urls with sandbox CSP, copy-on-write plan files, "already uploaded" picker + explicit delete (v1.47.0), store quotas instead of any age-based deletion (v1.49.0), nothing is ever deleted on an inference (docs/SCOPE.md rule).
- Square canvas (v1.48.0) with a crash-safe two-store migration (geom_pending, v1.50.0) and an explicit geometry/repair command (v1.50.1); content-fit default zoom with devices as content, zoom out to 0.4×, measured stage height (v1.49–v1.50.2).
- Explicit hide flags (v1.51.0, docs/FILTERING.md): per-device
marker.hiddenseeded once from the old filter and controlled by the bottom-left "Hide" / "Show" action in the device dialog; local "Show hidden" ghosts; hidden counts toward room LQI on both cards, casts no light (v1.51.1). - True plan deletion (v1.60.0-beta.1, 2026-08-07): confirmed Delete beside Hide/Show;
a minimal
marker.removedtombstone prevents auto-rediscovery but exposes the binding to Add. Deleted devices are absent from every plan aggregate and linked marker presentation; layout/files/trails are cleaned and stale layout writes are rejected. Exact contact/lock references owned by architectural openings remain active without restoring the standalone marker; live text and other marker controls retain the older re-add-to-reactivate contract. - Yellow = working right now (v1.51.0): climate uses
hvac_actionwhen available and falls back to a current advertised non-off HVAC mode only when the integration omits the action; service switches can no longer become primary, and glow pool and icon share one condition. Editor gestures on touch (pinch/pan) landed the same release. - Unified device status/activity (v1.59.0-beta.10; pulse pipeline #98 local): four display modes (Icon + state / Icon + state and activity / Value + state / Always static icon), one semantic resolver for yellow actual work, orange open/unlocked, unavailable and always-red alarms; activity projects to three finite waves for a short event or one continuous pulse for presence, mechanical travel and running. Always-static deliberately suppresses every state-driven visual, satellite badge and live vacuum overlay while leaving hover, actions, Glow and controls intact. Legacy Ripple-only migrates to Icon + activity on the next save.
- Passive media lifecycle (v1.60.0-beta.1): every
media_player, regardless of model, stays neutral while powered or playing and fades to the existing unavailable appearance on explicitoff; transport playback is no longer classified as yellow actual work and no new visual state is introduced. - Unified Background editor (v1.60.0-beta.1): typed decor model,
physical cm/in strokes and text size, independent contour/fill opacity, decor+room smart
magnet, common selection/resize/rotate frame for every decor kind, numeric
geometry properties, and shared 50-command Undo/Redo. The plan image now has
an exclusive tool, 0.5 editor de-emphasis elsewhere, independent axes,
rotation, numeric properties and rotated content bounds. Legacy
widthandplan_scaleremain read-compatible and migrate only through explicit plan optimisation. Furniture properties also expose the symbol itself. SeeDECOR-EDITOR.md. - v1.59.0-rc.1 (2026-08-06): whole-plan lossless optimization with an atomic config+layout commit and safe undo; the yellow actual-work plate is retained alongside source glow; all Background objects have Select-mode double-click properties; View hover highlights every room and reports its clean-floor area. Audit fixes add eager activity baselines/source resets, lossless legacy live-text editing, exact wall-fragment endpoints/compaction, editor-visible virtual walls and prerelease-discovery reporting in CI.
- v1.59.0-rc.2 (2026-08-06): Plan actions have one meaning each; Room outline names the closed-contour tool; one named 50-command Undo/Redo stack covers committed plan geometry; positional placement is always grid-bound. Glow and toast overlays no longer steal room/tool pointers, View hover covers shared thick walls, device Hide/Show is explicit, the static no-op aspect field is gone, and the new user guide/product audit replaces archived docs.
- v1.59.0 (2026-08-06): The stable 1.59 line includes all beta/RC work. Room hover follows clean-floor wall faces, including nested contours and projected opening gaps. Thick-wall rendering unions each room's own wall ring, so one room's floor cannot erase another room's wall or leave white slivers at complex crossings.
- v1.59.1 (2026-08-06): device markers resolve a semantic entity role
instead of trusting registry order; one light-source resolver now drives
Glow, Light fill, room statistics, marker feedback and controls. Glow uses
0.7 opacity. Current dev keeps external
controlsnon-spatial: they still drive group state, but only a real lamp marker or explicitis_lightmarker can place a Glow pool. Compacted real walls retain their correct inner face and body at real/virtual T-junctions. - v1.59.2 (2026-08-07): every modal uses the shared
hp-dialogshell, backed by Home Assistant'sha-dialogwith a native demo fallback. Titles, modal semantics, initial focus, focus trapping, Escape and restore focus are consistent across all editors, nested dialogs and dialog replacement flows.
Recent milestones (details in CHANGELOG.md)
- v1.10.0 — audit & refactor: asyncio.Lock around all store writes (race fix, atomic
expected_rev), pointlayout/updateinstead of fulllayout/set(anti last-writer-wins), newlayout/delete,safeUrl()XSS guard,fetchWithAuth, KEY_HASS, streaming upload cap, card split into modules (styles.ts/types.ts/devices.ts), dynamic spaces in the GUI editor, dead code removed. - v1.11.0 — full English translation + en/ru UI localization.
- v1.11.1 — brand images inside the integration; CI fully green for the first time.
- v1.11.2 — Description textarea fix in the device dialog.
- v1.12.0 — Quality Scale conformance: runtime_data, test-before-setup, unloading, single_config_entry, Store migrations hook, diagnostics, repairs, system health, uninstall cleanup, HA-harness tests in CI, quality_scale.yaml.
- v1.13.0 — universality: floors-import wizard, editable icon rules (+device_class fallback), tap actions with a security model, i18n dictionaries in JSON, light-theme pass.
- v1.13.1 — distribution: synthetic-home demo GIF in the README, issue templates,
CONTRIBUTING.md, Discussions. Forum/Reddit drafts are in the user folder
(
posts_drafts.md) awaiting manual posting. - v1.13.2 — audit round 3: buildDevices unit-test suite, multi-placeholder t(), conflict resync in _saveConfigNow, pointercancel long-press fix, repairs re-check on config save (repairs.py).
- v1.13.3 — privacy: legacy real-house assets/ removed; README screenshots synthetic.
- v1.14.0 — per-space display settings (borders/names/color/opacity/fills), draggable room labels, hand-drawn spaces (no image required), demo/ harness in-repo, docs/TESTING.md manual checklist (update with every functional change!).
- v1.15.0 — temperature room fill (blue/green/yellow) with editable comfort bounds.
- v1.15.1 — display-settings UX: radio fill selector, inline compact bounds (with the Number('')→0 bound-collapse bug fixed), avg room temp in the tooltip, darken-on-hover, wider space dialog.
- v1.15.2 — fix: average room temperature (fill + tooltip) counted non-thermometers
(fridges/TRVs/chip
*_device_temperature/diagnostic); now thermometer/air-monitor only. - v1.15.3 — fix: device icon badge sat 1 px off its anchor (content-box + 1 px
border);
box-sizing: border-boxcentres it exactly on the device point. - v1.15.4 — fix: real
ha-icon(block + big line-height) put the glyph ~1.8 px low;.dev ha-iconis now a zero-line-height flex box. Reverted v1.15.3 border-box (shrank the badge). Verified live. Demo stub made faithful so the smoke guards it. - v1.15.5 — fix: room hover was always grey; legacy overlay/yard hover rules scoped
with
:not(.styled)so filled rooms darken their fill, unfilled ones grey. - v1.15.6 — room hover also reveals the border (stroke colour kept, hidden via opacity) even when borders are off.
- v1.16.0 — NEW read-only
houseplan-space-card(static single-space schematic, pointer-events:none, deep-link button) +#space=<id>deep-link in the full card; shared space-geometry/space-render + module-level config cache (config-store). - v1.16.1 — space-card renders room fills as configured on the full card (snapshot), no longer omitted; +shared areaLqi().
- v1.17.x — entity markers get auto icon/temp (issue #1); correct resource URL documented (issue #2); humidity badge (gated on device_class, not the icon).
- v1.18.x — live ruler while drawing rooms (metres / feet+inches) + per-space scale
cell_cm; visibility fix (the badge lived in the markup-hidden devlayer). - v1.19.0 — a line is never an entity of its own: walls derived from room outlines
(
roomEdges), unfinished contours persist nothing, Erase tool removed,space.segmentsstripped on save. - v1.20.0 — rooms may not overlap (strictly-inside clicks refused, overlapping contours refused at close; shared walls stay legal).
- v1.21.x — merge & split rooms (boolean geometry via polyclip-ts; merge = union collapses to one hole-free outline; split = wall-to-wall chord, bigger part keeps identity) + UX fixes.
- v1.22.0 — presence ripples (badge/ripple/icon_ripple + colour/size,
isActiveState), per-device icon size/rotation (--dev-size), one-click HACS badge. NOTE: sources were lost in a sandbox reset after deploy and restored from conversation patches — push immediately after building, never wait for verification. - v1.23.0 — doors & windows: "Opening" markup tool (snap onto derived walls, absolute coords), length in real cm, contact sensor + lock, animated leaf/arc, padlock badge, status card; lock never toggled from the plan.
- v1.23.1 — openings UX: hover outline + grab cursor, drag along walls (angle normalized to [-90,90) so the hinge never flips), click=status / double-click=properties, thicker hit strip. Release v1.23.1 published on GitHub (covers v1.22.0–v1.23.1).
Where things live
- Source of truth: the git repo (GitHub
main). In a sandbox session: clone from GitHub or fromhouseplan-card.git.bundle(kept fresh in the user folder root and inhouseplan-card/). - User folder
houseplan/houseplan-card/— a file mirror of the repo (synced after every commit; the mount cannot delete files, so a few stale artifacts linger — git is authoritative). - Production config: server-side on the HA instance,
.storage/houseplan.config+.storage/houseplan.layout(backups.bak-v1100exist on the box).
Open items / watchlist
- Canonical backlog — GitHub Issues
contain task scope and acceptance criteria; their labels carry priority
and workflow status (
PROCESS.md§9). GitHub Projects is no longer used. The former local product plan is preserved only as a snapshot atlegacy/docs/PRODUCT-IMPROVEMENT-PLAN.ru.mdand must not be updated or used as a backlog. - hacs/default PR #9004 — accepted by the bot into the review queue ('New default repository' label). Minor issues ⇒ the bot drafts the PR (fix and re-ready).
- GitHub auth: fine-grained PAT (Contents R/W, issued 2026-07-23) in the sandbox
~/.git-credentials; pushes go over SSH with theha_jbkey. The old classic PAT expired and is gone. - Privacy: legacy real-house plan sources (
assets/) and screenshots were removed from the current tree. Public documentation images are generated from synthetic fixtures by theDocs screenshotsworkflow, accepted withnpm run docs:accept -- --reviewed, and indexed indocs/images/screenshots.json. Old images persist in git history and release archives; history rewrite is deliberately not done because it would break release tags and HACS installs. - Stale files on the mount that cannot be deleted from the sandbox:
src/data/leftovers,brand_preview.png, old nested bundle copies — ignore, git is authoritative. - Roadmap: phases 7–10 are DONE (v1.12.0 quality scale, v1.13.0 universality, v1.13.1 distribution). Next candidates: measure backend coverage (>95% goal); mypy strict.
- The public-doc screenshot harness is versioned in
demo/docs/capture.mjsand reuses the production component plus deterministic golden fixtures.
How to resume work in a fresh session (checklist)
- Read this file, then CHANGELOG.md (top entries), DEVELOPMENT.md (environment gotchas).
- Restore the repo:
git clone <user-folder>/houseplan-card.git.bundle hpcNin/tmp(files from previous sandbox sessions in/tmpbelong tonobodyand are unreadable — always clone into a fresh directory;npm ciagain). - Deployment needs the
ha_jbSSH key — it lives in the user folder athouseplan/.secrets/ha_jb(outside git) and often survives in the sandbox home~/.ssh/ha_jb; copy with chmod 600. Only ask the user if both are gone. - Build only in
/tmp(never on the mount),npm run build(starts withtsc --noEmit), md5-verify after every deploy, restart HA vianohup ha core restart >/dev/null 2>&1 </dev/null &(otherwise the SSH session hangs). - GitHub pushes: SSH remote with the
ha_jbkey; API releases with the fine-grained PAT from~/.git-credentials(see the watchlist).
Product scope
docs/SCOPE.md (fixed 2026-07-22) is the guard rail for all feature work: mission, personas, jobs J1–J7, partial/out-of-scope lists, excess audit. Check it before accepting or proposing any feature.