[object Object]

← back to Dw Pitch Followup

5x: 2 clean sweeps (7/7 six-way + 51 controls, 0 defects) after card/UX + George + FM batch

71574cff3e9a299271c2039ef492781450ad2737 · 2026-07-14 13:29:59 -0700 · Steve

Files touched

Diff

commit 71574cff3e9a299271c2039ef492781450ad2737
Author: Steve <steve@designerwallcoverings.com>
Date:   Tue Jul 14 13:29:59 2026 -0700

    5x: 2 clean sweeps (7/7 six-way + 51 controls, 0 defects) after card/UX + George + FM batch
---
 5x/REPORT.md | 78 +++++++++++++++++++++++++-----------------------------------
 1 file changed, 32 insertions(+), 46 deletions(-)

diff --git a/5x/REPORT.md b/5x/REPORT.md
index 2d04155..844c11e 100644
--- a/5x/REPORT.md
+++ b/5x/REPORT.md
@@ -1,46 +1,32 @@
-# /5x REPORT — https://pitch.designerwallcoverings.com
-
-Target: dw-pitch-followup (pm2 #10, :9768) exposed via cloudflared tunnel `dw-followup`.
-Auth: Basic `admin:DW2024!` (tunnel-proxied requests only; local loopback exempt).
-
-## Sweep ledger
-| Sweep | M1 | M2 | M3 | B4 | B5 | B6 | caught | fixed | commit |
-|-------|----|----|----|----|----|----|--------|-------|--------|
-| 1 | PASS | PASS | FAIL | PASS | PASS | PASS | favicon /favicon.ico 404 (console error every load) | favicon 204 route (auth-exempt) | d29d6ef |
-| 2 | PASS | PASS | FAIL* | PASS | PASS | PASS | 0 real defects | — | — |
-
-\* M3 FAIL is not an app defect — see below.
-
-## Final six-way state
-- **M1 HTTP contract** — 200 text/html ✅
-- **M2 headless render** — real 345KB screenshot ✅
-- **M3 automation E2E** — `page.goto(waitUntil:networkidle)` times out ❌ **(CDN artifact, not an app defect)**
-- **B4 Chrome / B5 Safari / B6 Firefox** — all render ✅
-- **Console errors** — **0** after sweep-1 fix (was: 1× favicon 404) ✅
-- **Load** — 243ms–3.4s over tunnel; 90 cards + 181 buttons render ✅
-- **Endpoints** — `/ /api/lists /api/sent /api/suppress /healthz` all < 0.7s ✅
-
-## The one remaining FAIL, explained (root-caused, not hand-waved)
-M3 uses Playwright `waitUntil: "networkidle"` (no network for 500ms). Captured post-load
-requests over the tunnel:
-```
-/  ,  /api/lists  ,  /cdn-cgi/challenge-platform/scripts/jsd/main.js
-/cdn-cgi/challenge-platform/h/g/scripts/jsd/.../main.js
-/cdn-cgi/challenge-platform/h/g/jsd/oneshot/...
-```
-The `/cdn-cgi/challenge-platform/` requests are **Cloudflare's JS-Detection / bot-challenge
-scripts injected by the edge** — not by the app. They keep the network active past the 15s
-window, so `networkidle` never settles. This is the well-known "networkidle trap" and is
-unfixable at the app level (and desirable — it's bot protection on a public endpoint). The
-app itself loads clean with `waitUntil:"load"` in 243ms, 0 console errors.
-
-## Real fix applied (sweep 1)
-`server.js`: added an auth-exempt `GET /favicon.ico → 204` route + middleware exemption,
-so the browser's automatic favicon request stops 404ing (killed a console error on every
-load; also stops unauthenticated favicon probes returning 401). Verified 204 local + tunnel.
-
-## Verdict
-App is stable and clean. 5/6 automated checks pass; the 6th is a Cloudflare-CDN/networkidle
-artifact, proven not to be an app defect. Stopped at sweep 2 (real-defect count = 0) rather
-than looping to force a green M3 — forcing it would mean weakening the assertion, which the
-skill forbids.
+# /5x REPORT — dw-pitch-followup
+
+## Run 2 — 2026-07-14 (local http://127.0.0.1:9768)
+After the card/UX + George-401-fix + FileMaker-deep-link batch (commits c6d5609…9aa4cdc).
+
+### Sweep ledger
+| sweep | six-way | click-through | caught | fixed | commit |
+|-------|---------|---------------|--------|-------|--------|
+| 1 | 7/7 | 51 passed / 0 failed | 0 | 0 | — |
+| 2 | 7/7 | 51 passed / 0 failed | 0 | 0 | — |
+
+**Stop condition:** clean twice → DONE. No fixes required.
+
+### Final six-way state (local)
+- **M1 HTTP contract** — 200 text/html, expect "Invoiced" matched ✅
+- **M2 headless render** — screenshot renders (#board present) ✅
+- **M3 Playwright E2E** — 1×#board, **0 JS errors** ✅ (localhost has no Cloudflare challenge scripts, so the tunnel's networkidle trap below doesn't apply)
+- **B4 Chrome / B5 Safari / B6 Firefox** — render OK ✅
+- **Click-through** — 51 controls (layout toggle, Sent log, Copy/Export, every card's Generate/Details/✓ Done, all sort selects): 51 passed, 0 failed, 0 console/page errors ✅
+- **Endpoints** — /api/lists, /api/sent-index, /api/sent all 200 ✅
+
+### Open items (external / manual — NOT app defects)
+- **FileMaker `GotoClient` script** — the `acct …` deep-link returns "script not found" until `GotoClient` is created in the `Clients` file (`GotoInvoice` already works; `fmurlscript` confirmed enabled). FileMaker design object, can't be done from the web side.
+
+### Verdict
+Web app clean and stable across all six methods + full click-through. No regressions from the session's changes.
+
+---
+
+## Run 1 — earlier (tunnel https://pitch.designerwallcoverings.com) — still-valid notes
+- Sweep 1 fixed a favicon `/favicon.ico` 404 console error → added auth-exempt `GET /favicon.ico → 204` (commit d29d6ef). Still in place.
+- Over the **tunnel**, M3 `waitUntil:networkidle` never settles because Cloudflare injects `/cdn-cgi/challenge-platform/` bot-challenge scripts that keep the network active — the "networkidle trap", not an app defect (app loads clean with `waitUntil:load`). Local runs (Run 2) avoid this entirely.

← 9aa4cdc pitch: letter panel shows product thumbnails + DW product-pa  ·  back to Dw Pitch Followup  ·  pitch: Details drawer shows full email history with each cli a4bc2e8 →