Files
houseplan-card/docs/STATUS.md
T
Matysh d7c20ff6a5 v1.52.1: the v1.52.0 review (HP-1520-01/-02, HP-1513-01)
- HP-1520-01: the glow layer is hidden in the plan editor, but the yellow
  suppression still fired there — a lit lamp had NEITHER indicator. The
  gate now equals the layer's visibility (disp.fill === 'glow' &&
  !this._markup), so the badge returns exactly where the spot is absent.
- HP-1513-01: the static card ignored marker.size and marker.angle — the
  same stored marker looked different on the two cards. It mirrors
  --dev-scale and the icon rotation now; geometry only, no live dressing.
- HP-1520-02: TESTING/UX-MODES still demanded the removed RGB icon tint,
  and the lightC comment described the old use. All three brought to the
  v1.52.0 contract.

smoke_light_badges grew the editor-mode vectors; new
smoke_size_angle_parity asserts the x3 ratio inside each card (absolute px
are incomparable across containers) and rotation on both. Inventory:
147 / 51 / 43 / 71.
2026-07-29 21:55:13 +03:00

14 KiB
Raw Blame History

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) and docs/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, ROADMAP.md when plans move.

Snapshot (2026-07-29)

Item State
Version v1.52.1 everywhere (manifest, const.py, package.json, CARD_VERSION); deployed to the home instance
Workflow Since 2026-07-22: minor changes go to branch dev (build + smokes → deploy home → commit → push, NO release); releases are batched on the owner's command (merge dev→main, one tag, one release with a summary changelog, CI checked on dev beforehand)
GitHub https://github.com/Matysh/houseplan-cardmain carries every published release, the latest tag is the current version above; dev is where work lands and is merged into main at release time (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 validate.yml (hacs + hassfest + frontend + backend) green; release.yml attaches the bundle on release publish
HACS Custom repository works. Inclusion PR: hacs/default#9004 — open, valid, labeled; ~864 older open PRs but merge rate ≈180/mo; realistic ETA 13 months (checked 2026-07-24)
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), deployed v1.52.1 via direct copy (HACS custom repo also installed)
Localization UI en/ru (src/i18n/*.json), everything user-visible localized incl. kiosk popover
Tests Four layers: frontend unit (npm test, node:test over test-build/), 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
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 (2026-07-22) is the feature guard rail — check before accepting any feature

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; nav (space+mode) persists across reloads (v1.38.2). Kiosk mode (v1.41.0): kiosk: true — no header/editors, swipe between spaces, double-tap zoom reset, cycle: N carousel, per-screen size multipliers in localStorage.
  • Glow fill (v1.35v1.37): dark house + per-source light pools (rgb/color temp/default; per-source radius), door sectors, open boundaries (room.open_to, virtual walls, dashed, transitive light zones).
  • Real switches (v1.36): marker.controls[] group-toggle with HA-group semantics; icon mirrors targets; hidden grouped lamps fixed (tiered primaryEntity). Lights toggle by default (v1.39): primary domain light → tap toggles, kettle-style devices keep the card default.
  • Plan geometry: polyline split (v1.32), island rooms w/ evenodd holes (v1.34), smart guides + 45° angle badge (v1.40), opening hover preview.
  • 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.44v1.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.49v1.50.2).
  • Explicit hide flags (v1.51.0, docs/FILTERING.md): per-device "Hide from plan" checkbox seeded once from the old filter; local "Show hidden" ghosts; hidden counts toward room LQI on both cards, casts no light (v1.51.1).
  • Yellow = working right now (v1.51.0): climate by hvac_action, service switches can no longer become primary, glow pool and icon share one condition. Editor gestures on touch (pinch/pan) landed the same release.

Recent milestones (details in CHANGELOG.md)

  • v1.10.0 — audit & refactor: asyncio.Lock around all store writes (race fix, atomic expected_rev), point layout/update instead of full layout/set (anti last-writer-wins), new layout/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-box centres 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-icon is 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.segments stripped 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.0v1.23.1).

Where things live

  • Source of truth: the git repo (GitHub main). In a sandbox session: clone from GitHub or from houseplan-card.git.bundle (kept fresh in the user folder root and in houseplan-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-v1100 exist on the box).

Open items / watchlist

  1. 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).
  2. GitHub auth: fine-grained PAT (Contents R/W, issued 2026-07-23) in the sandbox ~/.git-credentials; pushes go over SSH with the ha_jb key. The old classic PAT expired and is gone.
  3. Privacy: legacy real-house plan sources (assets/) removed from the tree in v1.13.3, but they persist in git history and old release archives; 8 README screenshots in docs/images are still from the real house (replacement with synthetic ones is a standing watchlist item). History rewrite deliberately NOT done — it would break existing release tags/HACS installs.
  4. 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.
  5. Roadmap: phases 710 are DONE (v1.12.0 quality scale, v1.13.0 universality, v1.13.1 distribution). Next candidates: replace the remaining real-house README screenshots with synthetic ones; measure backend coverage (>95% goal); mypy strict.
  6. The demo harness lives in /tmp/demo (synthetic home: demo.html + capture.mjs) — rebuildable from this repo + docs/DEVELOPMENT.md notes; frames → PIL → GIF.

How to resume work in a fresh session (checklist)

  1. Read this file, then CHANGELOG.md (top entries), DEVELOPMENT.md (environment gotchas).
  2. Restore the repo: git clone <user-folder>/houseplan-card.git.bundle hpcN in /tmp (files from previous sandbox sessions in /tmp belong to nobody and are unreadable — always clone into a fresh directory; npm ci again).
  3. Deployment needs the ha_jb SSH key — it lives in the user folder at houseplan/.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.
  4. Build only in /tmp (never on the mount), npm run build (starts with tsc --noEmit), md5-verify after every deploy, restart HA via nohup ha core restart >/dev/null 2>&1 </dev/null & (otherwise the SSH session hangs).
  5. GitHub pushes: SSH remote with the ha_jb key; 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 J1J7, partial/out-of-scope lists, excess audit. Check it before accepting or proposing any feature.