mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-01 04:09:17 +00:00
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>
155 lines
7.5 KiB
Markdown
155 lines
7.5 KiB
Markdown
# 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.
|