[object Object]

← back to Gmc Titlefix

5x sweep 3: widen storefront check 8 -> all 33, add fault-injection self-test

630865490d27ffbc8519e1f71cbd0d32a5a31787 · 2026-09-11 12:40:42 -0700 · Steve

A check that only ever runs on healthy data proves nothing about its own ability
to fail. S2b now feeds the probe a known-LIVE product and a known-dead handle in
the same sweep and requires them to come back different, so a probe that has
silently stopped discriminating is caught rather than printing green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JwXCqw4PdXfTY729wX8BFw

Files touched

Diff

commit 630865490d27ffbc8519e1f71cbd0d32a5a31787
Author: Steve <steve@designerwallcoverings.com>
Date:   Fri Sep 11 12:40:42 2026 -0700

    5x sweep 3: widen storefront check 8 -> all 33, add fault-injection self-test
    
    A check that only ever runs on healthy data proves nothing about its own ability
    to fail. S2b now feeds the probe a known-LIVE product and a known-dead handle in
    the same sweep and requires them to come back different, so a probe that has
    silently stopped discriminating is caught rather than printing green.
    
    Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01JwXCqw4PdXfTY729wX8BFw
---
 5x/last-sweep.json | 40 ++++------------------------------------
 5x/sweep.mjs       | 15 ++++++++++++---
 2 files changed, 16 insertions(+), 39 deletions(-)

diff --git a/5x/last-sweep.json b/5x/last-sweep.json
index 13a60c5..20908cd 100644
--- a/5x/last-sweep.json
+++ b/5x/last-sweep.json
@@ -1,42 +1,10 @@
 {
-  "ts": "2026-09-11T19:36:42.695Z",
-  "defects": [
-    {
-      "check": "S2",
-      "msg": "dwrw-75513 still returns 200 on the storefront after archiving"
-    },
-    {
-      "check": "S2",
-      "msg": "dwrw-75515 still returns 200 on the storefront after archiving"
-    },
-    {
-      "check": "S2",
-      "msg": "dwrw-75518 still returns 200 on the storefront after archiving"
-    },
-    {
-      "check": "S2",
-      "msg": "dwrw-75520 still returns 200 on the storefront after archiving"
-    },
-    {
-      "check": "S2",
-      "msg": "dwrw-75522 still returns 200 on the storefront after archiving"
-    },
-    {
-      "check": "S2",
-      "msg": "dwrw-75524 still returns 200 on the storefront after archiving"
-    },
-    {
-      "check": "S2",
-      "msg": "dwrw-75525 still returns 200 on the storefront after archiving"
-    },
-    {
-      "check": "S2",
-      "msg": "dwrw-75527 still returns 200 on the storefront after archiving"
-    }
-  ],
+  "ts": "2026-09-11T19:40:29.370Z",
+  "defects": [],
   "ledger": [
     "S1 shopify: 33/33 archived, 17/17 fix-set intact",
-    "S2 storefront: 0/8 gone, control 200",
+    "S2 storefront: 33/33 gone, control buyable=true",
+    "S2b fault-injection: discriminates=true",
     "S3 filemaker: 105/105 dated",
     "S4 ledgers: 33+105 undo rows",
     "S5 claims re-derived"
diff --git a/5x/sweep.mjs b/5x/sweep.mjs
index 8e400e6..2d16b15 100644
--- a/5x/sweep.mjs
+++ b/5x/sweep.mjs
@@ -40,7 +40,7 @@ async function storefront(h){ try{
   return {http:r.status,buyable:null,why:'unexpected status'};
  }catch(e){ return {http:null,err:String(e).slice(0,60)}; } }
 let notBuyable=0,unread=0;
-for(const r of arch.slice(0,8)){ const s=await storefront(r.handle);
+for(const r of arch){ const s=await storefront(r.handle);
   if(s.http===null||s.buyable===null){unread++;D('S2',`${r.handle} storefront NOT_MEASURED (${s.err||s.why}) — not a pass`);}
   else if(s.buyable) D('S2',`${r.handle} is STILL BUYABLE after archiving (${s.why})`);
   else notBuyable++; await new Promise(z=>setTimeout(z,400)); }
@@ -48,8 +48,17 @@ for(const r of arch.slice(0,8)){ const s=await storefront(r.handle);
 // could call everything "gone" and look perfectly green while detecting nothing at all.
 const ctl=await storefront(fix[0].handle);
 if(ctl.buyable!==true) D('S2',`CONTROL ${fix[0].handle} is ACTIVE but probe says buyable=${ctl.buyable} (${ctl.why||ctl.err}) — the probe is not detecting live products`);
-console.log(`   archived-not-buyable ${notBuyable}/8 | not-measured ${unread} | control(${fix[0].handle}) http=${ctl.http} buyable=${ctl.buyable}`);
-ledger.push(`S2 storefront: ${notBuyable}/8 gone, control buyable=${ctl.buyable}`);
+console.log(`   archived-not-buyable ${notBuyable}/${arch.length} | not-measured ${unread} | control(${fix[0].handle}) http=${ctl.http} buyable=${ctl.buyable}`);
+ledger.push(`S2 storefront: ${notBuyable}/${arch.length} gone, control buyable=${ctl.buyable}`);
+
+// ---- S2b FAULT INJECTION: prove the probe can go RED, not just green.
+console.log('\nS2b fault injection (probe must disagree between a live and a dead product)');
+const live=await storefront(fix[1].handle);          // ACTIVE -> must be buyable
+const dead=await storefront('this-handle-does-not-exist-tk11448'); // must be gone
+if(live.buyable!==true) D('S2b',`injected LIVE product ${fix[1].handle} read as buyable=${live.buyable} — probe cannot see live products`);
+if(dead.buyable!==false) D('S2b',`injected DEAD handle read as buyable=${dead.buyable} — probe cannot see dead products`);
+console.log(`   live(${fix[1].handle})=${live.buyable} dead(bogus)=${dead.buyable} -> probe discriminates: ${live.buyable===true&&dead.buyable===false}`);
+ledger.push(`S2b fault-injection: discriminates=${live.buyable===true&&dead.buyable===false}`);
 
 // ---- S3 FileMaker: 105 dated + NEGATIVE control (an untouched product must still be blank)
 console.log('\nS3 FileMaker (our rows dated; an UNTOUCHED product must still be blank)');

← c0bbc10 5x sweep 1: fix the storefront probe — redirect:follow measu  ·  back to Gmc Titlefix  ·  5x: TK-11448 verify-and-fix report — 4 sweeps, 1 real defect ffe6554 →