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

155 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.