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