← back to Dw Yolo Loop
scripts/zero-roll-rootcause/era-33-diagnosis.mjs
27 lines
import fs from 'fs';
const ENV=fs.readFileSync('/Users/macstudio3/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){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 Q=`query($cursor:String){ products(first:100, after:$cursor, query:"status:active"){ pageInfo{hasNextPage endCursor} edges{node{handle vendor variants(first:15){edges{node{title price position inventoryPolicy createdAt sku}}}}} } }`;
let cursor=null, pages=0; const z=[];
while(pages<110){ 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;
const vs=(n.variants?.edges||[]).map(x=>x.node).map(v=>({t:v.title,price:parseFloat(v.price),pos:v.position,ip:v.inventoryPolicy,created:v.createdAt,sku:v.sku})).filter(v=>!isNaN(v.price));
if(vs.length<2)continue; const p1=vs.find(v=>v.pos===1)||vs[0]; const zeros=vs.filter(v=>v.price===0);
if(p1.price!==0 && zeros.length){ zeros.forEach(zv=>z.push({h:n.handle,vendor:n.vendor,title:zv.t,created:zv.created,sku:zv.sku,ip:zv.ip})); } }
if(!c.pageInfo.hasNextPage)break; cursor=c.pageInfo.endCursor; pages++; if(z.length>=40)break; await sleep(220);
}
console.log(`zero-roll variants found: ${z.length}`);
const years={}, titles={}, ipc={};
z.forEach(v=>{ const y=(v.created||'').slice(0,4); years[y]=(years[y]||0)+1; titles[v.title]=(titles[v.title]||0)+1; ipc[v.ip]=(ipc[v.ip]||0)+1; });
console.log('by creation YEAR:', JSON.stringify(years));
console.log('by variant TITLE:', JSON.stringify(titles));
console.log('by inventoryPolicy:', JSON.stringify(ipc));
const recent=z.filter(v=>(v.created||'')>='2026-01-01');
console.log(`\nany created in 2026 (would implicate a CURRENT pipeline): ${recent.length}`);
recent.slice(0,5).forEach(v=>console.log(' ',v.h,v.created));
console.log('\nSKU pattern check (roll variant sku vs handle):'); z.slice(0,4).forEach(v=>console.log(` ${v.h.slice(0,34)} roll-sku=${v.sku} title="${v.title}"`));