← back to Dw Yolo Loop
jsonld-425-scan: sized the $4.25 JSON-LD leak — 87.8% of multi-variant products (101/115, CI 81.8-93.8%); ~21k fleet estimate, corroborates ~26k GMC bound; systemic across vendors; single-variant showroom-lines excluded; PJ excluded
0f99d97d5bcacc850402dd5e85191cd11423c82d · 2026-06-17 12:44:03 -0700 · Steve Abrams
Files touched
A scripts/jsonld-425-scan/jsonld-425-scan-2026-06-17.jsonA scripts/jsonld-425-scan/jsonld-425-scan.mjs
Diff
commit 0f99d97d5bcacc850402dd5e85191cd11423c82d
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Wed Jun 17 12:44:03 2026 -0700
jsonld-425-scan: sized the $4.25 JSON-LD leak — 87.8% of multi-variant products (101/115, CI 81.8-93.8%); ~21k fleet estimate, corroborates ~26k GMC bound; systemic across vendors; single-variant showroom-lines excluded; PJ excluded
---
.../jsonld-425-scan-2026-06-17.json | 165 +++++++++++++++++++++
scripts/jsonld-425-scan/jsonld-425-scan.mjs | 81 ++++++++++
2 files changed, 246 insertions(+)
diff --git a/scripts/jsonld-425-scan/jsonld-425-scan-2026-06-17.json b/scripts/jsonld-425-scan/jsonld-425-scan-2026-06-17.json
new file mode 100644
index 0000000..8ca386b
--- /dev/null
+++ b/scripts/jsonld-425-scan/jsonld-425-scan-2026-06-17.json
@@ -0,0 +1,165 @@
+{
+ "ts": "2026-06-17T19:42:59.905Z",
+ "sample": 360,
+ "evaluated": 347,
+ "single": 232,
+ "multiOk": 14,
+ "multiLeak": 101,
+ "multiTotal": 115,
+ "leakPctMulti": 87.82608695652173,
+ "pjSkip": 13,
+ "errs": 0,
+ "noProduct": 0,
+ "leaks": [
+ {
+ "h": "faux-leaf-squares-fls-2771",
+ "vendor": "Hollywood Wallcoverings",
+ "ld": 4.25,
+ "maxV": 31.92
+ },
+ {
+ "h": "wild-meadow-wallpaper-plaster-dough-pink-gat-6532d",
+ "vendor": "British Walls",
+ "ld": 4.25,
+ "maxV": 216.71
+ },
+ {
+ "h": "linus-linen-faux-wallpaper-lln-6640",
+ "vendor": "LEED Walls",
+ "ld": 4.25,
+ "maxV": 44.94
+ },
+ {
+ "h": "pauline-s-retro-geometric-scr-8006",
+ "vendor": "Designer Wallcoverings",
+ "ld": 4.25,
+ "maxV": 146.18
+ },
+ {
+ "h": "ralph-suede-solid-faux-suede-sdp-72346",
+ "vendor": "Designer Wallcoverings",
+ "ld": 4.25,
+ "maxV": 115.8
+ },
+ {
+ "h": "tanya-s-trellis-black-gold-lat-807",
+ "vendor": "Designer Wallcoverings",
+ "ld": 4.25,
+ "maxV": 63.76
+ },
+ {
+ "h": "avante-snake-wallcovering-xas-44294",
+ "vendor": "Hollywood Wallcoverings",
+ "ld": 4.25,
+ "maxV": 40.24
+ },
+ {
+ "h": "acanthus-on-grass-prs-85793",
+ "vendor": "Schumacher",
+ "ld": 4.25,
+ "maxV": 177.38
+ },
+ {
+ "h": "via-verdana-leather-lea-99602",
+ "vendor": "Primo Leathers",
+ "ld": 4.25,
+ "maxV": 26.65
+ },
+ {
+ "h": "new-york-midnight-wallmural-mur-205099",
+ "vendor": "Luxury Murals",
+ "ld": 4.25,
+ "maxV": 721.72
+ },
+ {
+ "h": "sullivan-lilac-ombre-vine-trail-wallpaper-wallpaper-cca-82901",
+ "vendor": "LA Walls",
+ "ld": 4.25,
+ "maxV": 79.99
+ },
+ {
+ "h": "harpswell-grey-herringbone-awning-stripe-wallpaper-cca-83156",
+ "vendor": "LA Walls",
+ "ld": 4.25,
+ "maxV": 72.49
+ },
+ {
+ "h": "grafito-eggplant-texture-wallpaper-cgs-83531",
+ "vendor": "LA Walls",
+ "ld": 4.25,
+ "maxV": 135.49
+ },
+ {
+ "h": "canal-texture-durable-walls-xwa-52089",
+ "vendor": "Hollywood Wallcoverings",
+ "ld": 4.25,
+ "maxV": 66.82
+ },
+ {
+ "h": "canal-texture-durable-walls-xwa-52093",
+ "vendor": "Hollywood Wallcoverings",
+ "ld": 4.25,
+ "maxV": 66.82
+ },
+ {
+ "h": "hanover-faux-embossed-faux-linen-walls-xwy-53165",
+ "vendor": "Hollywood Wallcoverings",
+ "ld": 4.25,
+ "maxV": 15.06
+ },
+ {
+ "h": "hollywood-contemporary-cobblestone-xhw-2010433",
+ "vendor": "Hollywood Wallcoverings",
+ "ld": 4.25,
+ "maxV": 71.46
+ },
+ {
+ "h": "whittier-way-twisted-paper-weave-hlw-73173",
+ "vendor": "Hollywood Wallcoverings",
+ "ld": 4.25,
+ "maxV": 43.22
+ },
+ {
+ "h": "schumacher_wallpaper_dwsw_5005341-jpg",
+ "vendor": "Schumacher",
+ "ld": 4.25,
+ "maxV": 309.5
+ },
+ {
+ "h": "schumacher_wallpaper_dwsw_5007520-jpg",
+ "vendor": "Schumacher",
+ "ld": 4.25,
+ "maxV": 179.19
+ },
+ {
+ "h": "schumacher_wallpaper_dwsw_5004725-jpg",
+ "vendor": "Schumacher",
+ "ld": 4.25,
+ "maxV": 246.15
+ },
+ {
+ "h": "glitterwalls-glm9115",
+ "vendor": "Glitter Walls",
+ "ld": 4.25,
+ "maxV": 94.95
+ },
+ {
+ "h": "dwrw-74182",
+ "vendor": "Rebel Walls",
+ "ld": 4.25,
+ "maxV": 83.38
+ },
+ {
+ "h": "dwrw-74399",
+ "vendor": "Rebel Walls",
+ "ld": 4.25,
+ "maxV": 83.38
+ },
+ {
+ "h": "dwrw-74403",
+ "vendor": "Rebel Walls",
+ "ld": 4.25,
+ "maxV": 83.38
+ }
+ ]
+}
\ No newline at end of file
diff --git a/scripts/jsonld-425-scan/jsonld-425-scan.mjs b/scripts/jsonld-425-scan/jsonld-425-scan.mjs
new file mode 100644
index 0000000..2b80d59
--- /dev/null
+++ b/scripts/jsonld-425-scan/jsonld-425-scan.mjs
@@ -0,0 +1,81 @@
+// jsonld-425-scan — READ-ONLY, $0. Wider stratified follow-up to c61. Sizes the
+// confirmed $4.25-JSON-LD leak against the MULTI-VARIANT population specifically.
+// For each sampled live PDP: parse Product JSON-LD offers.price + fetch variant
+// prices. Classify:
+// - single-variant (not at risk by definition)
+// - multi-variant + $4.25 default in JSON-LD while real variant exists = LEAK
+// - multi-variant + JSON-LD shows real price = OK
+// Honest denominator = the MULTI-VARIANT population (the only set that can leak).
+// EXCLUDES Phillip Jeffries (phillip-jeffries-display-excluded rule).
+const WWW='https://www.designerwallcoverings.com';
+const UA='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36';
+const sleep=ms=>new Promise(r=>setTimeout(r,ms));
+async function get(u){for(let a=0;a<4;a++){try{const r=await fetch(u,{headers:{'User-Agent':UA}});if(r.status===429){await sleep(1500*(a+1));continue;}return {status:r.status,text:await r.text()};}catch(e){await sleep(800*(a+1));}}return {status:0,text:''};}
+const PJ=/phillip[- ]?jeffries|phillip-jeffries/i;
+
+// stratified handle pool: pull from ALL 30 US product sitemaps, a few from each
+const idx=await get(`${WWW}/sitemap.xml`);
+const prodMaps=[...idx.text.matchAll(/<loc>([^<]+sitemap_products_\d+\.xml[^<]*)<\/loc>/g)].map(m=>m[1].replace(/&/g,'&')).filter(u=>!/\/en-ca\//.test(u));
+let handles=[];
+for(const sm of prodMaps){
+ const x=await get(sm);
+ const hs=[...x.text.matchAll(/<loc>[^<]*\/products\/([^<\/?]+)/g)].map(m=>m[1]);
+ // take ~12 spread across each sitemap for vendor/age diversity
+ const step=Math.max(1,Math.floor(hs.length/12));
+ for(let i=0;i<hs.length && handles.length<400;i+=step) handles.push(hs[i]);
+ await sleep(100);
+}
+handles=[...new Set(handles)].slice(0,360);
+console.log(`=== jsonld-425-scan (READ-ONLY, $0) ===\nstratified sample: ${handles.length} live PDPs across ${prodMaps.length} sitemaps (PJ excluded)\n`);
+
+function ldPrice(html){
+ const blocks=[...html.matchAll(/<script type="application\/ld\+json">([\s\S]*?)<\/script>/g)].map(m=>m[1]);
+ for(const b of blocks){ let j; try{j=JSON.parse(b);}catch{continue;}
+ const cands=j['@graph']?j['@graph']:[j];
+ for(const c of cands){ if(c['@type']==='Product'){ const o=Array.isArray(c.offers)?c.offers[0]:c.offers; if(o&&o.price!=null) return parseFloat(o.price); } } }
+ return null;
+}
+
+let single=0, multiOk=0, multiLeak=0, pjSkip=0, errs=0, noProduct=0;
+const leaks=[];
+let done=0;
+for(const h of handles){
+ const pj=await get(`${WWW}/products/${h}.json`);
+ let prod; try{ prod=JSON.parse(pj.text).product; }catch{ errs++; done++; continue; }
+ if(!prod){ errs++; done++; continue; }
+ if(PJ.test(prod.vendor||'')||PJ.test(h)){ pjSkip++; done++; continue; }
+ const prices=(prod.variants||[]).map(v=>parseFloat(v.price)).filter(n=>!isNaN(n));
+ const maxV=prices.length?Math.max(...prices):null;
+ const isMulti=(prod.variants||[]).length>1;
+ const pdp=await get(`${WWW}/products/${h}`);
+ const ld=pdp.status===200?ldPrice(pdp.text):null;
+ if(ld===null){ noProduct++; done++; await sleep(120); continue; }
+ if(!isMulti){ single++; }
+ else if(ld<=4.25 && maxV!=null && maxV>4.25){ multiLeak++; if(leaks.length<25)leaks.push({h,vendor:prod.vendor,ld,maxV}); }
+ else { multiOk++; }
+ done++;
+ if(done%50===0) console.log(` ${done}/${handles.length} (multi-leak so far: ${multiLeak})`);
+ await sleep(140);
+}
+
+const multiTotal=multiOk+multiLeak;
+const leakPctMulti=multiTotal?(100*multiLeak/multiTotal):0;
+const evaluated=single+multiOk+multiLeak;
+console.log(`\n=== RESULTS ===`);
+console.log(`evaluated: ${evaluated} | PJ-skipped: ${pjSkip} | json-err: ${errs} | no-JSONLD-product: ${noProduct}`);
+console.log(`single-variant (not at risk): ${single}`);
+console.log(`MULTI-variant total: ${multiTotal}`);
+console.log(` multi OK (JSON-LD shows real price): ${multiOk}`);
+console.log(` multi LEAK ($4.25 in JSON-LD, real variant exists): ${multiLeak}`);
+console.log(`\n*** LEAK RATE among MULTI-variant products: ${multiLeak}/${multiTotal} = ${leakPctMulti.toFixed(1)}% ***`);
+console.log(`LEAK RATE among ALL evaluated: ${multiLeak}/${evaluated} = ${evaluated?(100*multiLeak/evaluated).toFixed(1):0}%`);
+// Wilson-ish honest bound note
+if(multiTotal>0){
+ const p=multiLeak/multiTotal, se=Math.sqrt(p*(1-p)/multiTotal), lo=Math.max(0,p-1.96*se)*100, hi=Math.min(1,p+1.96*se)*100;
+ console.log(`95% CI on multi-variant leak rate: ${lo.toFixed(1)}% – ${hi.toFixed(1)}% (n=${multiTotal})`);
+}
+if(leaks.length){ console.log('\nsample leaks:'); leaks.slice(0,15).forEach(x=>console.log(` ${x.h.slice(0,46)} [${x.vendor}] ld=$${x.ld} max=$${x.maxV}`)); }
+
+import fs from 'fs';
+fs.writeFileSync('/tmp/jsonld-425-scan.json',JSON.stringify({ts:new Date().toISOString(),sample:handles.length,evaluated,single,multiOk,multiLeak,multiTotal,leakPctMulti,pjSkip,errs,noProduct,leaks},null,2));
+console.log('\nwrote /tmp/jsonld-425-scan.json');
← 2845706 jsonld-audit: Product JSON-LD structurally healthy (50/50) b
·
back to Dw Yolo Loop
·
cycle 63: canonical+robots indexability audit (347/347 clean f80814f →