[object Object]

← back to Claude Webdev Accelerator

accelerator: estimate-instant contrarian handoff (yielded to concurrent session; 5 open fixes + verify notes)

3e77ec3b9baaa8b8c589ed6abb9808c8d3128996 · 2026-07-16 07:50:31 -0700 · Steve

Files touched

Diff

commit 3e77ec3b9baaa8b8c589ed6abb9808c8d3128996
Author: Steve <steve@designerwallcoverings.com>
Date:   Thu Jul 16 07:50:31 2026 -0700

    accelerator: estimate-instant contrarian handoff (yielded to concurrent session; 5 open fixes + verify notes)
---
 clients/estimate-instant-contrarian-handoff.md | 51 ++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/clients/estimate-instant-contrarian-handoff.md b/clients/estimate-instant-contrarian-handoff.md
new file mode 100644
index 0000000..faa7930
--- /dev/null
+++ b/clients/estimate-instant-contrarian-handoff.md
@@ -0,0 +1,51 @@
+# estimate-instant — contrarian handoff (from the yielded accelerator session)
+
+Two Claude sessions built `estimate-instant` concurrently on 2026-07-15/16. This
+session **yielded** to the active one (Steve's call) after running the playbook's
+verify + contrarian gate. Captured here so the fixes aren't lost. Checked against
+the active session's HEAD `646c3eb` — **all 5 remain open**.
+
+## Verified working (this session, hand-checked)
+- Roll-math `estimate()`: 120"×96" Heirloom Damask → 2 rolls / $192 / 26% waste ✓;
+  grasscloth 200"×108" → 3 rolls / $384 / 25% ✓; too-tall + zero-input guards fire ✓.
+- Embeddable widget `embed.js` (iframe + auto-height postMessage) — shipped, matches
+  the brief's 200+-site embed thesis.
+
+## Contrarian verdict: FIX FIRST — 5 open items (highest leverage first)
+
+1. **Leads PII exposed in public mode** — `server.js:57` `if (!BASIC_AUTH) return true`.
+   `/api/leads` + `/admin` are gated only when `BASIC_AUTH` is set. On any embed host
+   that runs the estimator open (the whole point of the widget), the leads store is
+   world-readable. Fix: a separate always-on `ADMIN_AUTH` (default `admin:DW2024!`)
+   that gates `/api/leads` + `/admin` independent of the public-preview `BASIC_AUTH`.
+
+2. **postMessage targets `'*'`** — `public/index.html:165`. Send height to the known
+   host origin instead. Pass it in: embed.js `f.src = origin + '/?embed=1&host=' +
+   encodeURIComponent(location.origin)`; index reads `host` and targets it.
+
+3. **Unit toggle silently mis-scales** — `public/index.html:128` only relabels ft/in;
+   the typed value is unchanged, so toggling ft→in feeds e.g. `12` back through the
+   inch path. Fix: convert the current `#w`/`#h` values in place on toggle (×12 / ÷12),
+   or clear them.
+
+4. **Half-drop math is an approximation stated with false confidence** —
+   `server.js:96` docks `repeat/2` from usable roll length. The defensible
+   never-short model is per-strip: `cutLen += repeat/2` before rounding up to the
+   full repeat. Minimum honest fix if not reworking: say so in the disclaimer
+   ("half-drop / large-repeat patterns — add ~10–15%").
+
+5. **Single "wall width" invites under-ordering a room** — `public/index.html:70`.
+   Add a hint: "total width of all walls to cover (linear footage)". One sentence
+   prevents every non-trade user from ordering for their widest wall only.
+
+## New surface to gate (added by the active session, needs its own review)
+- Shopify **"Buy N rolls" checkout CTA** hands off to the **live** Shopify checkout
+  (TEST banner + stand-in-variant logic present). Live checkout = customer-facing /
+  money → verify the variant mapping and keep it Steve-gated before any public embed.
+
+## Data note (already handled by the active session)
+- Real roll specs now pull via `scripts/pull-rollspecs.sql` from `dw_unified`. Seed
+  `data/rolls.json` remains the labeled-representative fallback. `dw_unified`
+  wallcovering roll metafields are messy free-text (e.g. `length:"Sisal"`,
+  `width:"36 inches (trim to 34\")"`) — the SQL must normalize width/length/repeat,
+  not trust the raw metafield strings.

← 1be34c6 shopify: read-only catalog puller + normalize sample variant  ·  back to Claude Webdev Accelerator  ·  preview: env-overridable gate cred (PREVIEW_GATE) per contra 9affadd →