← back to Dw Yolo Loop
cycle 91: AI-preamble leak sweep (DTD unanimous A) — 5 genuine leaks ALL Versace, confirmed by 2 methods (HIGH-pattern + body-START classifier both=5) w/ broad-net guard (58 here-is hits, 53 legit mid-copy); Wallpaper TITLE blast-radius=0 (titles normalized, independent productsCount) + ~9486 any-field mostly legit vendor-names; BOTH better than stale banned-word memory (25131+68); disposition=surgical fix 5 Versace descriptions P3 (not bulk rewrite), titles need nothing, update stale memory
4aa2eb1a7d1f97ddd7ab0e1fc9429af1f66e7d24 · 2026-06-18 12:40:53 -0700 · Steve Abrams
Files touched
A scripts/ai-preamble-leak-sweep/FINDING.mdA scripts/ai-preamble-leak-sweep/ai-preamble-leak-sweep.mjsA scripts/ai-preamble-leak-sweep/body-start-classifier.mjsA scripts/ai-preamble-leak-sweep/broad-net-bound.mjsA scripts/ai-preamble-leak-sweep/wallpaper-reconcile.mjs
Diff
commit 4aa2eb1a7d1f97ddd7ab0e1fc9429af1f66e7d24
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Thu Jun 18 12:40:53 2026 -0700
cycle 91: AI-preamble leak sweep (DTD unanimous A) — 5 genuine leaks ALL Versace, confirmed by 2 methods (HIGH-pattern + body-START classifier both=5) w/ broad-net guard (58 here-is hits, 53 legit mid-copy); Wallpaper TITLE blast-radius=0 (titles normalized, independent productsCount) + ~9486 any-field mostly legit vendor-names; BOTH better than stale banned-word memory (25131+68); disposition=surgical fix 5 Versace descriptions P3 (not bulk rewrite), titles need nothing, update stale memory
---
scripts/ai-preamble-leak-sweep/FINDING.md | 37 +++++++++++++
.../ai-preamble-leak-sweep.mjs | 64 ++++++++++++++++++++++
.../body-start-classifier.mjs | 23 ++++++++
scripts/ai-preamble-leak-sweep/broad-net-bound.mjs | 28 ++++++++++
.../ai-preamble-leak-sweep/wallpaper-reconcile.mjs | 11 ++++
5 files changed, 163 insertions(+)
diff --git a/scripts/ai-preamble-leak-sweep/FINDING.md b/scripts/ai-preamble-leak-sweep/FINDING.md
new file mode 100644
index 0000000..b7f12ec
--- /dev/null
+++ b/scripts/ai-preamble-leak-sweep/FINDING.md
@@ -0,0 +1,37 @@
+# AI-preamble body-text leak = 5 live products (ALL Versace), confirmed by two methods; the live "Wallpaper" TITLE blast-radius is 0 (titles fully normalized) — both better than the stale memory implied — cycle 91
+
+**DTD verdict A (unanimous 3/3 — Claude + Codex + Qwen).** READ-ONLY (Admin GraphQL full active scan ×3 passes + independent productsCount reconciliation; no mutation), **$0**. Sweeps content quality of live product descriptions for leaked LLM scaffolding (the body-text analogue of the c88 blank PDP) + reconciles the banned-word "Wallpaper" title debt.
+
+## 🟡 Result: 5 genuine AI-preamble leaks, ALL Versace — small, unambiguous, fixable
+Full active scan (71,717, complete, PJ excluded):
+- **5 HIGH-confidence AI-preamble leaks (0.007%), all [Versace]** — live descriptions that BEGIN with leaked LLM scaffolding:
+ - "Versace Plain Gold Wallcovering" → "Here's the product description:"
+ - "Versace Stripe Brown Wallcovering" → "Here's the product description:"
+ - "Art De La Table Gold Black Wallcovering" → "Here is a product description:"
+ - "Heritage Green Blue Wallcovering" → "Okay, here is the product description for the wallcovering:"
+ - "Palazzo No 12 Light Grey Wallcovering" → "Here is a product description:"
+- These are genuine, embarrassing, customer-facing defects (the shopper sees the AI's preamble line above the real copy) — clearly fixable (trim the leaked line / regenerate).
+
+## 🔬 Skeptical decode — confirmed by TWO independent methods + a broad-net false-positive guard (the c90 lesson applied)
+- **Don't trust one pattern.** Pass 1 (HIGH-confidence patterns: "here is a description/product description/revised/SEO…", "as an AI", "I cannot assist", etc.) → 5, all Versace.
+- **Broad-net upper bound:** a loose "here is / here's" net flagged 58 active bodies — but that pattern catches legitimate marketing copy ("Here is a striking damask…"). So 58 is an upper bound, NOT a defect count.
+- **Pass 2 (body-START classification)** — does the body BEGIN with the preamble (or "here is" + a description/colon word), the real leak signature? → **exactly 5, the SAME Versace products.** The other 53 "here is/here's" hits are mid-copy legitimate marketing (Designer Wallcoverings 28, Phillipe Romano 13, etc., all mid-sentence). So the true defect count is 5, corroborated by two methods — not 58 (over-count) and not missed.
+- **Negative control:** 71,712 bodies have no preamble → a body-start preamble is a true anomaly. 176 active products have an empty body (a separate thin-content signal, not a preamble defect).
+
+## 🔑 Memory reconciliation — the live state is BETTER than `banned-word-live-blast-radius` recorded
+The memory says ~25,131 LIVE products contain "Wallpaper" + ~68 AI-preamble leaks (incl. Thibaut AT10701). Measured TODAY by independent productsCount queries:
+- **`status:active title:Wallpaper*` = 0** — NO active product TITLE contains "Wallpaper"; titles are fully normalized to "Wallcovering" (`title:Wallcovering*` ≥ 10,000, the count cap). The title-brand-hygiene concern is effectively RESOLVED.
+- **`status:active` any-field "Wallpaper" = 9,486** — these are body/tag/VENDOR-NAME occurrences (e.g. vendor "Malibu Wallpaper", "Missoni Wallpaper" are proper nouns; body mentions) — mostly LEGITIMATE, not title-brand violations, and far below the memory's 25,131.
+- **AI-preamble = 5 today vs the memory's ~68;** Thibaut AT10701 not found by free-text (remediated/archived/SKU-format). → Either substantial remediation happened since the memory was written, or the memory used looser patterns. Net: the live content-hygiene state is materially better than the memory implies → **the `banned-word-live-blast-radius` memory is stale and should be updated (flag for Steve).**
+
+## 📋 Disposition (GATED — Steve's call)
+1. **Fix the 5 Versace preamble descriptions (P3 — tiny, clean, unambiguous):** trim the leaked scaffolding line (or regenerate the description without the preamble). A 5-product surgical content edit, NOT a bulk rewrite. Steve-gated prod write.
+2. **"Wallpaper" TITLE debt = 0 → nothing to do on titles.** The ~9,486 any-field occurrences are mostly legitimate (vendor proper nouns + body copy); the banned-word bulk rewrite remains Steve-gated AND is far smaller / lower-priority than the memory implied. Do NOT propose a bulk title rewrite (titles are already clean).
+3. **Update the stale memory (flag):** `banned-word-live-blast-radius` (25,131 live + 68 preamble) does not match the measured live state (0 title-Wallpaper, 5 preamble) — recommend Steve let me update it.
+4. **176 empty-body active products** = a separate thin-content residual (no description) — minor, future enrichment, not this defect.
+
+## What this does NOT cover (named residuals)
+- **WEAK-pattern body issues** beyond preamble (truncated copy, placeholder "[insert]", duplicated boilerplate) — only LLM-preamble was targeted.
+- **Image CORRECTNESS** (c88), **full-404** (c88), **merchandising-DEPTH** (c87), **POD-vendor liveness** + **variant-oversold census** (c90 carry-forwards) — still open.
+
+_Cycle 91. DTD-picked A (unanimous 3/3). AI-preamble body-leak sweep: full active scan (71,717) → 5 genuine leaks, ALL Versace ("Here's the product description:" / "Okay, here is the product description for the wallcovering:"), confirmed by TWO independent passes (HIGH-pattern + body-START classification both = the same 5) with a broad-net guard (58 "here is" hits, 53 = legitimate mid-copy, NOT defects). "Wallpaper" TITLE blast-radius = 0 (titles normalized to Wallcovering; independent productsCount), ~9,486 any-field occurrences mostly legit vendor-names/body — both materially BETTER than the stale `banned-word-live-blast-radius` memory (25,131 + 68). Disposition: surgically fix the 5 Versace descriptions (P3, not a bulk rewrite); titles need nothing; update the stale memory (flag). PJ excluded. Read-only, $0, the 5-product fix gated._
diff --git a/scripts/ai-preamble-leak-sweep/ai-preamble-leak-sweep.mjs b/scripts/ai-preamble-leak-sweep/ai-preamble-leak-sweep.mjs
new file mode 100644
index 0000000..c335247
--- /dev/null
+++ b/scripts/ai-preamble-leak-sweep/ai-preamble-leak-sweep.mjs
@@ -0,0 +1,64 @@
+// ai-preamble-leak-sweep — READ-ONLY, $0. Cycle 91. Finds the genuine customer-facing defect: LLM
+// scaffolding/preamble leaked into live product descriptions ("Here is a description...", "Certainly!
+// Here's...", "As an AI...", "I hope this helps", "Below is a...") = the body-text analogue of a blank PDP.
+// Tiered patterns (HIGH-confidence vs WEAK) to control false positives; captures a snippet per hit for
+// human verification. ALSO counts the live "Wallpaper" title blast-radius as CONTEXT (NOT a defect, NOT
+// reopening GMC). NEGATIVE CONTROL: the bulk of bodies have no preamble -> a leak is a true anomaly. EXCLUDES PJ.
+import fs from 'fs';
+const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
+const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
+const PJ=/phillip[- ]?jeffries/i;
+const sleep=ms=>new Promise(r=>setTimeout(r,ms));
+async function gql(q,v){for(let a=0;a<6;a++){const r=await fetch(GQL,{method:'POST',headers:{'X-Shopify-Access-Token':TOK,'Content-Type':'application/json'},body:JSON.stringify({query:q,variables:v})});if(r.status===429||r.status>=500){await sleep(2000*(a+1));continue;}const j=await r.json();if(j.errors&&JSON.stringify(j.errors).includes('Throttled')){await sleep(2500*(a+1));continue;}return j;}return null;}
+// HIGH-confidence LLM-preamble patterns (low false-positive)
+const HIGH=[
+ /\bas an ai\b/i,
+ /\bas a language model\b/i,
+ /\bi(?:'m| am) (?:sorry|unable|just an ai|happy to (?:help|provide|assist))/i,
+ /\bi (?:cannot|can(?:'|no)t) (?:assist|help|provide|fulfill|generate)/i,
+ /\bcertainly[!,.]?\s+(?:here|i|below)/i,
+ /\bsure[!,]\s+(?:here|i|below)/i,
+ /\bhere(?:'s| is) (?:a|an|the|your) (?:description|revised|rewritten|product description|seo|updated|enhanced)/i,
+ /\bhere(?:'s| is) (?:a|an|the) (?:possible|sample|suggested)/i,
+ /\bbelow is (?:a|an|the) (?:description|revised|rewritten|product)/i,
+ /\bi hope this helps\b/i,
+ /\b(?:revised|rewritten) (?:product )?description:/i,
+ /\bas requested,?\s+(?:here|i|below)/i,
+ /\[insert [a-z ]+\]/i,
+];
+// WEAK patterns (flag separately; higher false-positive)
+const WEAK=[ /\bhere(?:'s| is) (?:a|an|the|your)\b/i, /\blet me know if\b/i, /\bfeel free to\b/i ];
+const stripHtml=h=>(h||'').replace(/<[^>]+>/g,' ').replace(/&[a-z]+;/g,' ').replace(/\s+/g,' ').trim();
+const Q=`query($cursor:String){ products(first:60, after:$cursor, query:"status:active"){ pageInfo{hasNextPage endCursor}
+ edges{node{ title vendor descriptionHtml } } } }`;
+let cursor=null,pages=0,scanned=0,complete=true;
+let high=0, weakOnly=0, wallpaperTitle=0, emptyBody=0;
+const highByVendor={}, highEx=[];
+while(true){ const j=await gql(Q,{cursor}); if(!j?.data){complete=false;break;} const c=j.data.products;
+ for(const e of c.edges){ const n=e.node; if(PJ.test(n.vendor||''))continue; scanned++;
+ if(/wallpaper/i.test(n.title||'')) wallpaperTitle++;
+ const body=stripHtml(n.descriptionHtml);
+ if(!body){ emptyBody++; continue; }
+ const hi=HIGH.find(rx=>rx.test(body));
+ if(hi){ high++; highByVendor[n.vendor]=(highByVendor[n.vendor]||0)+1;
+ if(highEx.length<30){ const m=body.match(hi); const at=Math.max(0,(m.index||0)-20); highEx.push({t:(n.title||'').slice(0,40),vendor:n.vendor,pat:hi.source.slice(0,30),snip:body.slice(at,at+90)}); } }
+ else if(WEAK.some(rx=>rx.test(body))) weakOnly++;
+ }
+ pages++; if(!c.pageInfo.hasNextPage)break; cursor=c.pageInfo.endCursor;
+ const cost=j.extensions?.cost?.throttleStatus; if(cost&&cost.currentlyAvailable<500) await sleep(1500); else await sleep(250);
+ if(pages%100===0) console.log(` ${pages}p scanned=${scanned} high-preamble=${high}`);
+}
+const pct=x=>scanned?(100*x/scanned).toFixed(3):'0';
+console.log(`\n=== ai-preamble-leak-sweep (READ-ONLY, $0) ===`);
+console.log(`active scanned: ${scanned} (complete=${complete}, ${pages}p) [PJ excluded]`);
+console.log(`\nAI-PREAMBLE LEAK (the defect):`);
+console.log(` HIGH-confidence preamble in live body: ${high} (${pct(high)}%)`);
+console.log(` WEAK-only (needs human review, higher false-positive): ${weakOnly} (${pct(weakOnly)}%)`);
+console.log(` empty/no body: ${emptyBody}`);
+console.log(` NEGATIVE CONTROL: ${scanned-high-weakOnly} bodies with no preamble -> a HIGH hit is a true anomaly.`);
+console.log(`\nCONTEXT (NOT a defect, NOT GMC): live titles containing 'Wallpaper': ${wallpaperTitle} (${pct(wallpaperTitle)}%) [brand-hygiene debt, Steve-gated bulk rewrite]`);
+console.log(`\nHIGH-preamble by vendor (top 15):`); Object.entries(highByVendor).sort((a,b)=>b[1]-a[1]).slice(0,15).forEach(([v,n])=>console.log(` ${v}: ${n}`));
+console.log(`\nHIGH-preamble examples (snippet for verification):`); highEx.forEach(x=>console.log(` "${x.t}" [${x.vendor}] /${x.pat}/ => "...${x.snip}..."`));
+fs.writeFileSync('/tmp/ai-preamble-leak-sweep.json',JSON.stringify({ts:new Date().toISOString(),scanned,complete,high,weakOnly,emptyBody,wallpaperTitle,highByVendor,highEx},null,2));
+console.log(`\nwrote /tmp/ai-preamble-leak-sweep.json`);
diff --git a/scripts/ai-preamble-leak-sweep/body-start-classifier.mjs b/scripts/ai-preamble-leak-sweep/body-start-classifier.mjs
new file mode 100644
index 0000000..56ea272
--- /dev/null
+++ b/scripts/ai-preamble-leak-sweep/body-start-classifier.mjs
@@ -0,0 +1,23 @@
+import fs from 'fs';
+const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
+const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
+const sleep=ms=>new Promise(r=>setTimeout(r,ms));
+async function gql(q,v){for(let a=0;a<6;a++){const r=await fetch(GQL,{method:'POST',headers:{'X-Shopify-Access-Token':TOK,'Content-Type':'application/json'},body:JSON.stringify({query:q,variables:v})});if(r.status===429||r.status>=500){await sleep(1500*(a+1));continue;}return r.json();}return null;}
+const PJ=/phillip[- ]?jeffries/i;
+const strip=h=>(h||'').replace(/<[^>]+>/g,' ').replace(/\s+/g,' ').trim();
+// genuine-preamble = "here is/here's" appears at the START of the body or right before a colon/description word
+const GENUINE=/^(?:okay,?\s*|sure,?\s*|certainly,?\s*)?here(?:'s| is)\b.{0,40}(?:description|:|product|below|revised|seo|following)/i;
+const HEREIS=/here(?:'s| is)\b/i;
+const Q=`query($cursor:String){ products(first:60, after:$cursor, query:"status:active"){ pageInfo{hasNextPage endCursor} edges{node{ title vendor descriptionHtml }} } }`;
+let cursor=null,scanned=0,genuineStart=0; const ex=[];
+while(true){ const j=await gql(Q,{cursor}); if(!j?.data)break; const c=j.data.products;
+ for(const e of c.edges){ const n=e.node; if(PJ.test(n.vendor||''))continue; scanned++; const b=strip(n.descriptionHtml); if(!b||!HEREIS.test(b))continue;
+ const head=b.slice(0,80);
+ // classify: does the body START with a preamble, or does "here is" appear mid-copy?
+ const startsPreamble = GENUINE.test(b.slice(0,120)) || /^(okay|sure|certainly)[,!: ]/i.test(b) || /^here(?:'s| is)\b/i.test(b);
+ if(startsPreamble){ genuineStart++; if(ex.length<25) ex.push({t:(n.title||'').slice(0,38),vendor:n.vendor,head:head}); }
+ }
+ cursor=c.pageInfo.endCursor; if(!c.pageInfo.hasNextPage)break; const co=j.extensions?.cost?.throttleStatus; if(co&&co.currentlyAvailable<500)await sleep(1500); else await sleep(200); }
+console.log(`scanned ${scanned}; GENUINE preamble (body STARTS with here-is/okay/sure/certainly or here-is+description): ${genuineStart}`);
+ex.forEach(x=>console.log(` "${x.t}" [${x.vendor}] => "${x.head}"`));
diff --git a/scripts/ai-preamble-leak-sweep/broad-net-bound.mjs b/scripts/ai-preamble-leak-sweep/broad-net-bound.mjs
new file mode 100644
index 0000000..2adcc48
--- /dev/null
+++ b/scripts/ai-preamble-leak-sweep/broad-net-bound.mjs
@@ -0,0 +1,28 @@
+import fs from 'fs';
+const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
+const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
+const sleep=ms=>new Promise(r=>setTimeout(r,ms));
+async function gql(q,v){for(let a=0;a<6;a++){const r=await fetch(GQL,{method:'POST',headers:{'X-Shopify-Access-Token':TOK,'Content-Type':'application/json'},body:JSON.stringify({query:q,variables:v})});if(r.status===429||r.status>=500){await sleep(2000*(a+1));continue;}const j=await r.json();if(j.errors&&JSON.stringify(j.errors).includes('Throttled')){await sleep(2500*(a+1));continue;}return j;}return null;}
+const PJ=/phillip[- ]?jeffries/i;
+// BROADER nets to bound the under-count: anywhere in body
+const BROAD=[
+ {k:'product description:', rx:/product description:/i},
+ {k:'here is/here\'s', rx:/here(?:'s| is)\b/i},
+ {k:'okay/sure/certainly start', rx:/\b(okay|sure|certainly)[,!:]/i},
+ {k:'as an ai / language model', rx:/\bas an ai\b|\blanguage model\b/i},
+ {k:'i hope/let me know/feel free', rx:/\bi hope this\b|\blet me know if\b|\bfeel free to\b/i},
+ {k:'description for the', rx:/description for the (wallcovering|wallpaper|product|fabric)/i},
+];
+const strip=h=>(h||'').replace(/<[^>]+>/g,' ').replace(/\s+/g,' ').trim();
+const Q=`query($cursor:String){ products(first:60, after:$cursor, query:"status:active"){ pageInfo{hasNextPage endCursor} edges{node{ vendor descriptionHtml }} } }`;
+let cursor=null,pages=0,scanned=0; const cnt={}; BROAD.forEach(b=>cnt[b.k]=0); let anyBroad=0; const anyByVendor={};
+while(true){ const j=await gql(Q,{cursor}); if(!j?.data)break; const c=j.data.products;
+ for(const e of c.edges){ const n=e.node; if(PJ.test(n.vendor||''))continue; scanned++; const b=strip(n.descriptionHtml); if(!b)continue;
+ let hit=false; for(const p of BROAD){ if(p.rx.test(b)){ cnt[p.k]++; hit=true; } }
+ if(hit){ anyBroad++; anyByVendor[n.vendor]=(anyByVendor[n.vendor]||0)+1; } }
+ pages++; if(!c.pageInfo.hasNextPage)break; cursor=c.pageInfo.endCursor; const co=j.extensions?.cost?.throttleStatus; if(co&&co.currentlyAvailable<500)await sleep(1500); else await sleep(200); }
+console.log(`scanned ${scanned} active bodies`);
+console.log(`ANY broad-preamble hit: ${anyBroad}`);
+Object.entries(cnt).forEach(([k,v])=>console.log(` [${k}] ${v}`));
+console.log(`broad-hit by vendor (top 12):`); Object.entries(anyByVendor).sort((a,b)=>b[1]-a[1]).slice(0,12).forEach(([v,n])=>console.log(` ${v}: ${n}`));
diff --git a/scripts/ai-preamble-leak-sweep/wallpaper-reconcile.mjs b/scripts/ai-preamble-leak-sweep/wallpaper-reconcile.mjs
new file mode 100644
index 0000000..c6353e6
--- /dev/null
+++ b/scripts/ai-preamble-leak-sweep/wallpaper-reconcile.mjs
@@ -0,0 +1,11 @@
+import fs from 'fs';
+const ENV=fs.readFileSync('/Users/stevestudio2/Projects/secrets-manager/.env','utf8');
+const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
+const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
+async function gql(q,v){const r=await fetch(GQL,{method:'POST',headers:{'X-Shopify-Access-Token':TOK,'Content-Type':'application/json'},body:JSON.stringify({query:q,variables:v})});return r.json();}
+// independent mechanism: Shopify search query for title containing wallpaper, vs an active baseline.
+async function count(q){ const j=await gql(`query($q:String){ productsCount(query:$q){ count } }`,{q}); return j.data?.productsCount?.count ?? ('ERR '+JSON.stringify(j.errors)); }
+console.log("active total:", await count("status:active"));
+console.log("active title:*Wallpaper*:", await count("status:active title:Wallpaper*"));
+console.log("active (any-field) Wallpaper:", await count("status:active Wallpaper"));
+console.log("active title:*Wallcovering*:", await count("status:active title:Wallcovering*"));
← 7a63e67 cycle 90: officer vp-dw-commerce CONFIRMED (boundary-case so
·
back to Dw Yolo Loop
·
cycle 91: officer vp-dw-marketing CONFIRMED + framing tighte cdf1e93 →