← back to Wallco Ai

data/yolo-overnight/spot-check-20260525-1249.md

70 lines

# Spot-Check — published design pages

**Run:** 2026-05-25 12:49 PT  
**Service tested:** `wallco-ai` (PM2 `wallco-ai`, pid 1890751, cwd `/root/public-projects/wallco-ai`)  
**Port correction:** task said `9877`, but `9877` is `paint-visualizer-agent` (no `/design/:id` route). Tested against **`http://127.0.0.1:9905`** where wallco-ai actually serves `/design/:id` (server.js:8990). The 5 IDs were sampled at random from `all_designs WHERE is_published=true AND image_url IS NOT NULL`.

## IDs sampled
```
129 102 10058 9871 9929
```

## Checks performed per ID
- **(a) HTTP 200** on `GET /design/:id`
- **(b) Admin pane collapsed by default** — `<details ...>` for admin pane has NO `open` attribute
- **(c) Hero image loads** — extract the cf-img / preview image src, then HEAD it (follow redirects) and expect 200
- **(d) Crop & Fix modal in DOM** — search rendered HTML for the modal element/id

## Results

| ID | (a) 200 | (b) Admin collapsed | (c) Image HEAD | (d) Crop&Fix modal | Notes |
|----|---------|---------------------|----------------|---------------------|-------|
| 129 | ✅ 200 | ✅ all 4 collapsed | ❌ 404 | ✅ present | src=`/designs/img/DWTT-80746-SAMPLE.jpg`, 344710 bytes |
| 102 | ✅ 200 | ✅ all 4 collapsed | ❌ 404 | ✅ present | src=`/designs/img/DWVE-430760.jpg`, 344780 bytes |
| 10058 | ❌ 404 | ⚠️ 0 admin-pane elements found | ❌ no cf-img src in DOM | ❌ missing | (no src), 21608 bytes |
| 9871 | ❌ 404 | ⚠️ 0 admin-pane elements found | ❌ no cf-img src in DOM | ❌ missing | (no src), 21590 bytes |
| 9929 | ❌ 404 | ⚠️ 0 admin-pane elements found | ❌ no cf-img src in DOM | ❌ missing | (no src), 21608 bytes |

## Re-sample — corrected from `spoon_all_designs` (the route's actual source)

First sample drew from `all_designs` (a separate table). `/design/:id` (server.js:8990) resolves IDs from **`spoon_all_designs`** only — 3/5 of the first sample 404'd because those IDs live in `all_designs` but not `spoon_all_designs`. Re-sampling against the correct table.

| ID | (a) 200 | (b) Admin collapsed | (c) Image HEAD | (d) Crop&Fix modal | Notes |
|----|---------|---------------------|----------------|---------------------|-------|
| 38853 | ✅ 200 | ✅ all 4 collapsed | ✅ 200 | ✅ present | src=`/designs/img/1779399083915_106116584.png`, 350828 bytes |
| 39052 | ✅ 200 | ✅ all 4 collapsed | ✅ 200 | ✅ present | src=`/designs/img/cactus_pine_pass3_1779412713736_1418800545.png`, 350911 bytes |
| 38897 | ✅ 200 | ✅ all 4 collapsed | ✅ 200 | ✅ present | src=`/designs/img/1779399446382_1002715866.png`, 350858 bytes |
| 38865 | ✅ 200 | ✅ all 4 collapsed | ✅ 200 | ✅ present | src=`/designs/img/1779399190247_981488890.png`, 350862 bytes |
| 38842 | ✅ 200 | ✅ all 4 collapsed | ✅ 200 | ✅ present | src=`/designs/img/1779397321167_1832708988.png`, 350855 bytes |

## Findings

### 1. Two-table drift between `all_designs` and `spoon_all_designs` (medium)
- `all_designs` published: **273 rows** ; `spoon_all_designs` published+visible: **203 rows**
- **215** published rows in `all_designs` have no counterpart in `spoon_all_designs` — every `/design/:id` for one of these will 404
- The 3 IDs (10058, 9871, 9929) that 404'd in the first sample are all `kind='seamless_tile'`, `brand='wallco.ai'`, `is_published=true` in `all_designs` but missing from `spoon_all_designs`
- Anything that hands users IDs from `all_designs` (search, color filters, leaderboards, share links) can produce dead links. Worth picking one ledger as canonical or backfilling `spoon_all_designs`.

### 2. Hero image 404 on `best_seller_seed` designs (low/cosmetic)
- IDs 129 and 102 have `kind='best_seller_seed'`; their `image_url` is `/designs/img/DWTT-80746-SAMPLE.jpg` and `/designs/img/DWVE-430760.jpg` respectively — those files are **not on disk** (404)
- The `/designs/img/by-id/:id` fallback returns **200** for both IDs
- server.js:10267 picks `design.image_url || '/designs/img/by-id/'+id` — so the broken on-disk path wins. Either drop the broken `image_url` for seed rows or change the precedence to verify-then-fallback. Easy fix.

### 3. Admin pane / Crop&Fix modal — clean
- All 5 valid IDs: every `<details class="admin-pane">` rendered collapsed (no `open` attr) ✅
- All 5 valid IDs: `<div id="crop-fix-modal">` present in DOM ✅
- Admin panes only render under `isAdmin(req)` — anon curl from 127.0.0.1 is treated as admin (loopback bypass), so the panes were exercised

## Summary

- 5/5 IDs sampled from the canonical route table (`spoon_all_designs`) pass all four checks (a/b/c/d)
- 3/5 IDs sampled from `all_designs` (the broader catalog) 404 — table-drift bug, ~215 published rows are unreachable via `/design/:id`
- 2/5 of those (`best_seller_seed`) rendered with a broken hero src — the by-id fallback works; precedence bug at server.js:10267
- No regression in admin pane collapse behavior, no missing Crop & Fix modal

## What I did NOT do (per escalation rules)

- No destructive action. Did not delete/unpublish the orphaned rows or touch image filesystem.
- Did not patch the precedence bug at server.js:10267 — flagged for Steve. Tiny fix but a behavior change on the live page.
- Did not file the schema-drift question to debate-team — the finding is concrete enough to act on; no ambiguity that needs a panel verdict.