Files
houseplan-card/docs/AUDIT-FUNCTIONAL.md
T
Cursor AgentandMatysh 99f7c3a4a9 docs: full project audit pack for agents (market, quality, gaps)
Add docs/AUDIT*.md covering competitive landscape (easy-floorplan 11→430★),
implementation quality, functional integrity, and P0–P3 recommendations.
Refresh PRODUCT.md competitor claim and point STATUS watchlist at the pack.

Co-authored-by: Matysh <Matysh@users.noreply.github.com>
2026-08-05 04:56:01 +00:00

7.5 KiB
Raw Blame History

Audit — functional integrity & gaps

Snapshot: 2026-08-05, product v1.58.0. Cross-check of claimed surface (README / STATUS / SCOPE) against code and tests. Mission lens: SCOPE.md — spatial at-a-glance + quick act.

1. Mission fit

SCOPE personas:

Persona Primary mode Fit
Home admin Plan / Devices / Background editors Strong — full geometry + marker tooling
Household members View Strong — tap toggles, room cards, glow/climate
Guests / kiosk View + kiosk: true Strong — editors blocked, swipe/cycle

Jobs J1–J7 are marked Closed in SCOPE; J4 (onboarding) still partial (floors-import exists; registry-driven room suggestions do not). That matches code reality.

Systematicity grade: high. Features hang off a coherent model:

  • spaces → rooms (polygons) → derived walls → openings
  • markers bound to device/entity/virtual → layout points
  • settings tiers: global → space → room → device
  • View is the product; editors are admin-colored frames (UX-MODES)

Excess features (PDF manuals, virtual devices, LQI) are consciously kept / frozen rather than deleted — unusual and correct for a shipping tool.

2. Claim ↔ code matrix

Feature area Claimed Implemented Tested Notes
One HACS package (integration + card) ✓ ✓ CI hacs/hassfest Matches
GUI room markup (no SVG/YAML) ✓ ✓ smokes + logic units Matches
Doors/windows + lock invariant ✓ ✓ smoke_lock_*, logic CR-1 held
Islands / merge / split / open_to ✓ ✓ units + smokes Matches
Room resize ✓ resize.ts units + smokes Matches
Decor + backdrop transform ✓ ✓ (v1.58) backdrop tests/smokes Paper = room contours
Infinite / square canvas ✓ ✓ canvas smokes Matches CANVAS.md
Align-to-grid ✓ align-grid.ts units Matches
Auto devices by HA area ✓ devices.ts units Matches
Explicit hide-from-plan ✓ ✓ smokes FILTERING.md
Editable icon rules ✓ ✓ — Matches
Tap: info / more-info / toggle / run / cover ✓ ✓ logic + smokes Security model intact
Glow + door sectors ✓ ✓ smokes Island light block = known limit
Temp / LQI / light fills ✓ ✓ units/smokes Matches
Room cards + per-room settings ✓ ✓ smokes Matches
Kiosk ✓ ✓ smokes Matches
Vacuums + server trails ✓ vacuum.ts + trails.py units + smokes Display-only (intentional)
Sun / daynight / wedges ✓ sun.ts units + smokes Matches
houseplan-space-card ✓ ✓ smokes Matches
Signed content + SVG sandbox ✓ ✓ HA tests + smokes Matches
en/ru i18n ✓ ✓ key-parity test Matches
Floors-import wizard ✓ ✓ — Exists; suggestions gap below
Registry room suggestions PRODUCT / J4 Partial / missing — Gap
Music notes / TV ripples UX backlog Absent — Intentional not-planned
Furniture / wall CAD competitor feature Absent — Non-goal
Vacuum commands user ask often Absent — VACUUM.md non-goal
Cloud sync — Absent — Non-goal

Integrity conclusion: marketed surface and shipped surface align unusually well. The main integrity risks are docs drift (ARCHITECTURE/UX-MODES/PRODUCT) and auth UI↔API default mismatch (see AUDIT-QUALITY), not phantom features.

3. Cross-cutting integrity themes

3.1 Coordinate & geometry story — coherent after evolution

Legacy fixed pixel canvas → normalized square → infinite canvas with bounds. Migrations + geometry/repair + dual-store geom_pending show the team treats coordinate changes as product-critical (correct). Frontend space-geometry.ts and backend validation.py intentionally mirror limits (±5000) — two sources of truth, but tested.

3.2 Security story — mostly coherent

Surface Policy Coherent?
Lock / alarm from plan icon Never actuate Yes — tested
Lock via door-card button Explicit labeled control Yes — SCOPE CR-1
SVG plans Sandbox CSP + signing Yes
Config/layout writes may_write Split with UI admin gate
run tap automation/script/scene only + optional confirm Yes

3.3 Multi-client story — mostly coherent

Config writes: CAS + write chain. Layout point updates: rev bumps but no conflict surface — fine for one editor, weak for two tablets dragging at once.

3.4 Filtering story — cleaned up

Old hardcoded “dacha DNA” filters → editable icon rules + explicit hide flags (v1.51). Documented in FILTERING.md. Good systematic cleanup.

4. Gaps (build only with intent)

In-mission polish (SCOPE already lists most)

Gap Persona impact Notes
Registry-driven room suggestions Admin first-run J4 partial; biggest product unlock left
Touch ergonomics of editors Admin on tablet Partial
Value-display richness Household Partial
a11y beyond prefers-reduced-motion All Keyboard/ARIA weak
Plan-level security glance (“N open / all locked”) Household / kiosk SCOPE known gap
Person / presence in rooms Household SCOPE known gap; presence ripples exist at marker level
Threshold colouring for room metrics Household SCOPE known gap
README / screenshot lag vs redesign Adoption Distribution, not function

Engineering gaps that feel like product bugs

Gap Why it matters
Default admin_only=False while UI hides editors from non-admins Non-admin can still mutate via raw WS — surprise vs household persona
Opening-measure magnet placement flake under pinned Chromium One smoke red; pixel-precision path
Demo.html needs hass nudge / F5 for icons Harness quirk; confuses manual demo in a raw browser

Explicit non-gaps (do not “fix” by building these)

  • 3D / glb
  • Furniture / wall drawing (easy-floorplan territory)
  • Vacuum start/zone commands
  • History graphs, cameras, energy
  • Cloud collaboration
  • Becoming a general dashboard framework

5. Systematicity scorecard

Question Answer
Is there one mental model? Yes — spaces/rooms/markers/settings tiers
Do modes prevent tool leakage? Mostly — UX-MODES + kiosk hard-block; View is default
Are overrides predictable? Yes — more specific settings win
Do security rules have a single owner? Tap: resolveTapAction. Write: may_write (UI duplicate — debt)
Are frozen excesses documented? Yes — SCOPE excess audit
Is the roadmap still pointing at the mission? Phase 8–10 are quality/distribution; Phase 9 leftovers are registry/docs — aligned

Grade: A− for functional systematicity. The product feels designed, not accreted — with the structural exception of the Lit shell size (quality debt, not a feature-model debt).

6. Suggested integrity checks for future agents

Before merging a feature:

  1. Does it serve J1–J7 or a SCOPE “known gap”? If neither → reject or rewrite.
  2. Does it introduce a second policy for taps, writes, or file deletion? → fold into resolveTapAction / may_write / collection rules.
  3. Does it need a migration? → dual-store / repair path, not silent reshape.
  4. Is it tested at the right layer? Pure math → npm test / pytest; pointer UX → smoke with check/finish; never a smoke that always exits 0.
  5. Dual CHANGELOG + STATUS/ARCHITECTURE/TESTING updates in the same commit.