[object Object]

← back to York Reprice 2026 08

York cadence/bridge: fix scan-truncation cap (90x60=5400 -> 120x100) — JS catalog is 6193

4b91284400d8bd96a4a39bb4a2ba4318c99bc7e9 · 2026-07-28 15:57:01 -0700 · Steve Abrams

Root cause of the chronic onboard-ready=619 false alarm: the vendor:'Jeffrey Stevens' live scan
capped at 90 pages x 60 = 5400 products but the catalog is ~6193, silently missing ~793 late-page
products (AH295100 is #5944). Their live SKUs went unrecognized -> inflated onboard-ready AND could
mask real reprice/disco in the tail. Full-scan re-test: live JS 5367->6141, onboard-ready 619->87
(87 spot-verified genuinely un-onboarded, not false positives), reprice-drift 0, disco 0.

Files touched

Diff

commit 4b91284400d8bd96a4a39bb4a2ba4318c99bc7e9
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Tue Jul 28 15:57:01 2026 -0700

    York cadence/bridge: fix scan-truncation cap (90x60=5400 -> 120x100) — JS catalog is 6193
    
    Root cause of the chronic onboard-ready=619 false alarm: the vendor:'Jeffrey Stevens' live scan
    capped at 90 pages x 60 = 5400 products but the catalog is ~6193, silently missing ~793 late-page
    products (AH295100 is #5944). Their live SKUs went unrecognized -> inflated onboard-ready AND could
    mask real reprice/disco in the tail. Full-scan re-test: live JS 5367->6141, onboard-ready 619->87
    (87 spot-verified genuinely un-onboarded, not false positives), reprice-drift 0, disco 0.
---
 bridge-reprice.mjs       | 5 +++--
 cadence/york-cadence.mjs | 7 +++++--
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/bridge-reprice.mjs b/bridge-reprice.mjs
index effc712..f582049 100644
--- a/bridge-reprice.mjs
+++ b/bridge-reprice.mjs
@@ -23,8 +23,9 @@ try{ const out=execSync(`PGPASSWORD=DW2024! /opt/homebrew/opt/postgresql@14/bin/
   console.log(`  single-roll targets loaded: ${RPS.size}`);
 }catch(e){ console.log('  ⚠ single-roll load failed (falling back to MAP-only):',String(e.message||e).slice(0,80)); }
 let cur=null, live=[];
-for(let pg=0;pg<90;pg++){
-  const Q=`query($c:String){products(first:60,after:$c,query:"vendor:'Jeffrey Stevens'"){pageInfo{hasNextPage endCursor} nodes{id status title dwc:metafield(namespace:"dwc",key:"manufacturer_sku"){value} cust:metafield(namespace:"custom",key:"manufacturer_sku"){value} variants(first:20){nodes{id sku title price}}}}}`;
+// JS catalog ~6,193 products; old 90×60=5,400 cap truncated the scan (missed ~793). 120×100 headroom.
+for(let pg=0;pg<120;pg++){
+  const Q=`query($c:String){products(first:100,after:$c,query:"vendor:'Jeffrey Stevens'"){pageInfo{hasNextPage endCursor} nodes{id status title dwc:metafield(namespace:"dwc",key:"manufacturer_sku"){value} cust:metafield(namespace:"custom",key:"manufacturer_sku"){value} variants(first:20){nodes{id sku title price}}}}}`;
   const d=(await gql(Q,{c:cur}))?.products; if(!d)break;
   for(const p of d.nodes){const mfr=norm(p.dwc?.value||p.cust?.value); if(!mfr)continue;
     const rolls=p.variants.nodes.filter(v=>!isSample(v)); if(!rolls.length)continue;
diff --git a/cadence/york-cadence.mjs b/cadence/york-cadence.mjs
index ce2dba5..85c9077 100644
--- a/cadence/york-cadence.mjs
+++ b/cadence/york-cadence.mjs
@@ -64,8 +64,11 @@ let onboardCand=[]; try{ onboardCand=q(`
 
 // 2. live Jeffrey Stevens
 let cur=null, reprice=[], disco=[], liveMfr=new Set(), liveTitles=new Map();
-for(let pg=0;pg<90;pg++){
-  const d=(await gql(`query($c:String){products(first:60,after:$c,query:"vendor:'Jeffrey Stevens'"){pageInfo{hasNextPage endCursor} nodes{status title dwc:metafield(namespace:"dwc",key:"manufacturer_sku"){value} cust:metafield(namespace:"custom",key:"manufacturer_sku"){value} variants(first:20){nodes{id sku price title}}}}}`,{c:cur}))?.products; if(!d)break;
+// PAGE CAP: the JS catalog is ~6,193 products; the old 90×60=5,400 cap silently TRUNCATED the scan
+// (~793 late-page products unseen), so their live SKUs weren't recognized → inflated onboard-ready
+// AND could mask real reprice/disco in the tail. 120×100=12,000 headroom; hasNextPage breaks early.
+for(let pg=0;pg<120;pg++){
+  const d=(await gql(`query($c:String){products(first:100,after:$c,query:"vendor:'Jeffrey Stevens'"){pageInfo{hasNextPage endCursor} nodes{status title dwc:metafield(namespace:"dwc",key:"manufacturer_sku"){value} cust:metafield(namespace:"custom",key:"manufacturer_sku"){value} variants(first:20){nodes{id sku price title}}}}}`,{c:cur}))?.products; if(!d)break;
   for(const p of d.nodes){const mfr=norm(p.dwc?.value||p.cust?.value); if(!mfr)continue; liveMfr.add(mfr);
     { const a=liveTitles.get(mfr)||[]; a.push(p.title||''); liveTitles.set(mfr,a); } // for collision-aware onboard 2-factor
     const m=M.get(mfr); if(!m)continue;

← 25d9e88 York cadence fixes: reprice valid-price-set (dup MAP rows) +  ·  back to York Reprice 2026 08  ·  bridge-reprice: valid-MAP-set guard (dup-MAP SKUs) + NaN/0 p d27db35 →