← back to Wallco Ai

output/room-mockup-coverage-2026-06-01.md

81 lines

# 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).