[object Object]

← back to Wallco Ai

Add read-only room-mockup coverage audit (2026-06-01): over-claim=0, 506 coverage gap / 268 reclaimable orphans

fea3eeaa905b5c045c0c280b73d58a47558ed5ba · 2026-05-31 21:33:15 -0700 · Steve Abrams

Files touched

Diff

commit fea3eeaa905b5c045c0c280b73d58a47558ed5ba
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Sun May 31 21:33:15 2026 -0700

    Add read-only room-mockup coverage audit (2026-06-01): over-claim=0, 506 coverage gap / 268 reclaimable orphans
---
 output/room-mockup-coverage-2026-06-01.md | 80 +++++++++++++++++++++++++++++++
 1 file changed, 80 insertions(+)

diff --git a/output/room-mockup-coverage-2026-06-01.md b/output/room-mockup-coverage-2026-06-01.md
new file mode 100644
index 0000000..c0b8f8b
--- /dev/null
+++ b/output/room-mockup-coverage-2026-06-01.md
@@ -0,0 +1,80 @@
+# wallco.ai — Room-Mockup Coverage Audit (PUBLISHED designs)
+
+**Date:** 2026-06-01 · **Mode:** READ-ONLY (no rooms generated, no orphans deleted, no prod writes)
+**Source of truth:** prod `dw_unified.wallco_rooms` (rows where `removed_at IS NULL`) vs. on-disk PNGs at `/root/public-projects/wallco-ai/data/rooms/design_<id>_<room>.png`
+**Present threshold:** file exists AND `> 50 KB` (≤50 KB treated as a broken/blank render)
+**Why the table is authoritative:** the customer PDP "See in a room" surface calls `resolveDesignRooms()` which queries `wallco_rooms` **live** per request — what's in the table IS what the customer can see (server.js:212–232).
+
+---
+
+## Headline (the metric the task asked for)
+
+| Metric | Count |
+|---|---|
+| Published designs (`all_designs.is_published = true`) | **2,868** |
+| Active room rows for published designs (`removed_at IS NULL`) | **2,363** |
+| Rows **present** (canonical PNG > 50 KB) | **2,363** (canonical 2,363 / legacy-uploads 0) |
+| Rows **over-claiming** (table flag set, file missing/undersized) | **0** ✅ |
+
+**Over-claiming = 0.** Every single active `wallco_rooms` row for a published design resolves to a real `data/rooms/design_<id>_<room>.png` larger than 50 KB. Zero rows fall back to the legacy `/uploads/rooms` path, and zero rows are broken. The table is clean — the customer PDP never points at a missing room file. There is no over-claim sample list because the set is empty.
+
+> The 2026-05-30 dual-path resolver + the `wallco_rooms` table being the live source (memory `feedback_wallco_pdp_rooms_from_table_not_snapshot`) are holding: no drift between the table's claims and disk.
+
+---
+
+## Coverage gap (surfaced in-scope from the same read-only pass)
+
+Over-claim is a *false-positive* check (table says yes, disk says no — none found). The inverse — *false-negative availability* — is where the real gap lives:
+
+| Metric | Count |
+|---|---|
+| Published designs **with** a live room row | **2,362** |
+| Published designs **with NO** live room row (coverage gap) | **506** |
+| ↳ of those, a usable PNG (> 50 KB) **exists on disk** but has **no live table row** → customer never sees it (orphan / under-claim) | **268** |
+| ↳ of those, **no room at all** (no row, no file) | **238** |
+
+**The actionable finding is the 268 orphans.** A perspective-warped room render already exists on disk for these published designs, but because there's no `wallco_rooms` row (or the row was soft-deleted), the live-table-reading PDP shows nothing. These are recoverable by **re-inserting a `wallco_rooms` row** pointing at the existing file — no regeneration cost. (Recovery is a prod write → out of scope for this read-only audit; flagged for a follow-up gated task.)
+
+The remaining 238 published designs have genuinely never had a room rendered and would need generation (free/local PIL composite per memory `reference_wallco_free_local_room_renders`).
+
+---
+
+## 20 sample broken-from-customer-POV design ids (orphans: file on disk, no live row)
+
+```
+11   (living_room)
+12   (bedroom_hero + bedroom)
+10137 (living_room)
+10143 (living_room)
+10146 (living_room)
+10149 (living_room)
+10165 (living_room)
+10878 (living_room)
+11308 (living_room)
+11537 (living_room)
+11542 (living_room)
+11598 (living_room)
+11727 (living_room)
+11819 (living_room)
+11874 (living_room)
+12401 (living_room)
+12796 (living_room)
+13124 (living_room)
+13288 (living_room)
+13682 (living_room)
+```
+
+(Over-claim sample list is intentionally empty — over-claim count is 0.)
+
+---
+
+## Method notes
+- Published set = `all_designs.is_published = true` (2,868).
+- Room claims = `wallco_rooms WHERE removed_at IS NULL AND design_id ∈ published`.
+- Disk check mirrors the server's `resolveRoomUrl()` dual-path logic (canonical `data/rooms/` first, then legacy `image_path` under `public/`), with the task's added `> 50 KB` presence threshold.
+- Scripts: `/tmp/room_coverage.py` (over-claim) and `/tmp/room_gap2.py` (coverage/orphan) run on prod read-only via `sudo -u postgres psql`.
+
+## What this means / suggested next steps (gated — not executed)
+1. **Reclaim the 268 orphans** (highest ROI, near-zero cost): insert `wallco_rooms` rows for published designs whose `data/rooms/design_<id>_<type>.png` exists but has no live row. — *prod write, Steve-gated.*
+2. **Generate rooms for the 238 bare published designs** via the free/local PIL composite path (`scripts/pil-room-composite.py`), then insert rows. — *generation + prod write, Steve-gated.*
+3. Over-claim needs no action (0).

← b1e98d1 overnight cohort audit loop — 17 cohorts, 98 unpub, $0.24, D  ·  back to Wallco Ai  ·  curator A5: per-card 'Bake adjustment' button on grid cards cabd7d1 →