← back to CelebritySignatures
screenrecord/DEBUG-REPORT-murals.md
76 lines
# CelebritySignatures /murals — 5-Pass Screen-Record Debug Report
Ticket: **TK-10193**
Date: 2026-08-08
Target: `public/murals.html` — the "design-your-own celebrity-signature mural wall" storefront
Run env: app booted locally on **:9933 in Stripe TEST mode** (no `STRIPE_LIVE`, no real charge). `:9920`
(the ticket's original port) has since been reassigned to `idea-loop`; there is no live web process for
CelebritySignatures anymore (it is now the submitted iOS app, `apps/mobile`). Title "murals storefront :9920"
was a batch-creation mislabel — `/murals` is the real, distinct surface (siblings: /upload=TK-10194 DONE,
front=TK-10191, /game=TK-10192).
Artifacts:
- `screenrecord/rec-murals/run{0..4}/*.webm` — 5 screen recordings (one per unique click-order combination)
- `screenrecord/debug-log-murals.jsonl` — 100 append-only action rows across the 5 passes
- `screenrecord/murals-debug.mjs` — the 5-pass harness · `verify2-murals.mjs` — phase-isolated confirmation
---
## HIGHEST-LEVERAGE FIX (top item)
### BUG 1 — "Request a quote instead" wipes name+email, so a following "Pay & order" is blocked
**Severity: Medium (UX friction on a real purchase path)** — order-dependent / state-leak.
The order form has two buttons: **`#payBtn` "Pay & order →"** (Stripe checkout) and
**`<button type="submit">Request a quote instead</button>"`**. On a successful quote submit the handler calls
**`f.reset()`** (`murals.html:664`), which clears every field including name + email. `#payBtn` then hard-guards
on those fields (`murals.html:670-671`): if empty it returns early with *"Enter your name and a valid email
first."* and never calls `/api/mural-checkout`.
Reproduced (fresh page, phase-isolated):
1. Fill name + email → click **"Request a quote instead"** → `POST /api/mural-order` 200, "request #1024 received"; **fields now `name:"" email:""`**.
2. Click **"Pay & order →"** → **no `/api/mural-checkout` call**, message *"Enter your name and a valid email first."*
Real-user impact: someone who requests a quote and then decides to buy is bounced and must retype name+email.
Both buttons live in the same form, so this path is reachable in normal use.
**Recommended fix (pick one, ~2–5 lines in `murals.html`):**
- Don't `f.reset()` the whole form on quote success — instead clear only `notes` and keep name/email/dims; or
- Preserve name+email across the reset (`const {value:n}=f.name,{value:e}=f.email; f.reset(); f.name.value=n; f.email.value=e;`); or
- Have `#payBtn` fall back to a light modal/prompt for name+email instead of a dead-end error when they're blank.
---
## Verified WORKING (no defects found across all 5 passes)
- **Catalog + selector** — `/api/murals-catalog` loads; `#selMural` populated with **33 options**.
- **Gallery** — renders `[data-place]` "Place on wall" buttons + `[data-roster]` drawers; "Place on wall" sets the active mural and scrolls to the studio.
- **Wall/mural sliders** — `#wallW/#wallH/#wallWnum/#wallHnum` and `#murW/#murH` all drive `drawScene()`; slider↔number sync works; values clamp on commit.
- **Scene presets** — `#scenePresets` buttons toggle the active class and redraw.
- **Center-on-wall** — `#btnCenter` re-centers the mural.
- **Provenance modal** — opens; closes on **Escape**, on **✕ (`#provX`)**, and on backdrop click.
- **Signature finder** — `#finderInput` requires ≥2 chars (by design); a real 2+ char query filters `SIGS` and renders hits / a "not in the archive yet — request a custom mural" miss state.
- **Order form ("Request a quote instead")** — `POST /api/mural-order` → 200, returns a request # (verified #1015, #1024).
- **Pay & order (fields intact)** — `#payBtn` → `POST /api/mural-checkout` → **HTTP 200** in test mode (real Stripe checkout session created; navigation to Stripe was intentionally blocked by the harness nav-guard, never paid).
- **JS health** — **zero `console.error` and zero `pageerror`** across all 5 passes / all click orders.
---
## NOTES / non-bugs
- **AdSense + reCAPTCHA third-party frames** load on the page; the harness nav-guard aborted their off-host
iframe navigations (`googleads.g.doubleclick.net`, `ep2.adtrafficquality.google`, `recaptcha/api2`). Not a
defect — expected for a page with an AdSense unit; flagged only so a future reviewer knows those aborts in the
log are the guard, not a page error.
- **Harness selector gap (honest disclosure):** the first 5-pass harness used `.gallery .place` / `.gallery .r-item`,
which don't match the real classes (`[data-place]` buttons; `.r-item` only exists after a roster drawer is
opened). Those two steps logged "none present." A separate phase-isolated check confirmed the gallery IS
populated and interactive — so this was a harness selector miss, **not** an empty-gallery bug. The recordings
still captured the gallery rendering.
---
## Per-run recordings
`screenrecord/rec-murals/run0..run4/` — run0 logical order · run1 reverse · run2 sliders-first · run3 seeded
shuffle · run4 prior-error-first. BUG 1 manifested in every run where the quote-submit step preceded the pay
step (the harness always fills-then-submits before paying), consistent with the source-level cause.