← back to Designerwallcoverings
TK-10014: read-only full-line DWKK MAP audit (bulk-op) -> exact 94 residual below-MAP (99.35% compliant); 5 egregious; ready list
ab3e0f03a4ac7dc96560645011f0ddef4339e219 · 2026-08-09 13:11:57 -0700 · Steve Abrams
Files touched
A shopify/scripts/audit-dwkk-below-map-full.mjsA shopify/scripts/data/kravet-map-pricing/dwkk-below-map-residual-2026-08-09.csvA shopify/scripts/data/kravet-map-pricing/dwkk-full-audit-summary.json
Diff
commit ab3e0f03a4ac7dc96560645011f0ddef4339e219
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Sun Aug 9 13:11:57 2026 -0700
TK-10014: read-only full-line DWKK MAP audit (bulk-op) -> exact 94 residual below-MAP (99.35% compliant); 5 egregious; ready list
---
shopify/scripts/audit-dwkk-below-map-full.mjs | 58 +++++++++++++
.../dwkk-below-map-residual-2026-08-09.csv | 95 ++++++++++++++++++++++
.../dwkk-full-audit-summary.json | 7 ++
3 files changed, 160 insertions(+)
diff --git a/shopify/scripts/audit-dwkk-below-map-full.mjs b/shopify/scripts/audit-dwkk-below-map-full.mjs
new file mode 100644
index 0000000..e10a980
--- /dev/null
+++ b/shopify/scripts/audit-dwkk-below-map-full.mjs
@@ -0,0 +1,58 @@
+#!/usr/bin/env node
+// TK-10014 — READ-ONLY full-line DWKK below-MAP audit via Shopify bulk operation.
+// Exports every DWKK variant sku+price, joins to the coalesced-MAP pool (dw_sku->MAP),
+// reports exact current below-MAP count + writes a residual ready list. NO WRITES.
+import fs from 'node:fs';
+import { execSync } from 'node:child_process';
+const TT = execSync("grep -m1 '^SHOPIFY_ADMIN_TOKEN=' ~/Projects/secrets-manager/.env | cut -d= -f2-", {shell:'/bin/zsh'}).toString().trim();
+const SHOP='designer-laboratory-sandbox.myshopify.com', API='2024-10';
+const DIR='/Users/macstudio3/Projects/designerwallcoverings/shopify/scripts/data/kravet-map-pricing';
+const LOG=`${DIR}/dwkk-full-audit-progress.log`, OUT=`${DIR}/dwkk-below-map-residual-2026-08-09.csv`, SUM=`${DIR}/dwkk-full-audit-summary.json`;
+const log=m=>{const l=`[${new Date().toISOString()}] ${m}`;fs.appendFileSync(LOG,l+'\n');console.log(l);};
+const sleep=ms=>new Promise(r=>setTimeout(r,ms));
+async function gql(query){const r=await fetch(`https://${SHOP}/admin/api/${API}/graphql.json`,{method:'POST',headers:{'X-Shopify-Access-Token':TT,'Content-Type':'application/json'},body:JSON.stringify({query})});return r.json();}
+
+// MAP lookup: dw_sku -> map (from the mirror-derived pool)
+const pool=new Map();
+for(const line of fs.readFileSync('/tmp/dwkk_audit_pool.csv','utf8').trim().split('\n')){const[sku,map]=line.split(',');pool.set(sku,parseFloat(map));}
+log(`pool loaded: ${pool.size} dw_sku->MAP`);
+
+const START=`mutation { bulkOperationRunQuery(query: "{ products(query: \\"sku:DWKK*\\") { edges { node { id status variants { edges { node { sku price } } } } } } }") { bulkOperation { id status } userErrors { field message } } }`;
+
+(async()=>{
+ const s=await gql(START);
+ const ue=s?.data?.bulkOperationRunQuery?.userErrors||[];
+ if(ue.length){log('START userErrors: '+JSON.stringify(ue));process.exit(1);}
+ log('bulk op started: '+JSON.stringify(s?.data?.bulkOperationRunQuery?.bulkOperation||s));
+ // poll
+ let url=null;
+ for(let i=0;i<120;i++){
+ await sleep(5000);
+ const c=await gql(`{ currentBulkOperation(type: QUERY) { id status errorCode objectCount url } }`);
+ const op=c?.data?.currentBulkOperation;
+ if(!op){log('no current op');continue;}
+ if(i%4===0) log(`poll ${i}: status=${op.status} objects=${op.objectCount}`);
+ if(op.status==='COMPLETED'){url=op.url;log(`COMPLETED objects=${op.objectCount}`);break;}
+ if(['FAILED','CANCELED'].includes(op.status)){log('bulk FAILED: '+JSON.stringify(op));process.exit(1);}
+ }
+ if(!url){log('no url (timeout or empty result)');process.exit(1);}
+ // download JSONL
+ const jr=await fetch(url); const text=await jr.text();
+ const lines=text.trim().split('\n').filter(Boolean);
+ log(`downloaded ${lines.length} JSONL lines`);
+ // variant lines have sku + price (+ __parentId). roll variant = sku exactly a pool key.
+ let below=0, atabove=0, checked=0, novar=0;
+ const rows=['dw_sku,map,current_roll,gap'];
+ for(const ln of lines){
+ let o; try{o=JSON.parse(ln);}catch{continue;}
+ if(o.sku && o.price!==undefined && pool.has(o.sku)){
+ const map=pool.get(o.sku), cur=parseFloat(o.price); checked++;
+ if(cur<map-0.01){below++; rows.push(`${o.sku},${map},${cur},${(map-cur).toFixed(2)}`);}
+ else atabove++;
+ }
+ }
+ fs.writeFileSync(OUT, rows.join('\n')+'\n');
+ fs.writeFileSync(SUM, JSON.stringify({ts:'2026-08-09',pool:pool.size,checked,below,atabove},null,2));
+ log(`DONE. pool=${pool.size} checked=${checked} below_MAP=${below} at_or_above=${atabove}`);
+ log(`Residual list: ${OUT} (${below} below-MAP)`);
+})().catch(e=>{log('ERR '+e);process.exit(1);});
diff --git a/shopify/scripts/data/kravet-map-pricing/dwkk-below-map-residual-2026-08-09.csv b/shopify/scripts/data/kravet-map-pricing/dwkk-below-map-residual-2026-08-09.csv
new file mode 100644
index 0000000..11fac57
--- /dev/null
+++ b/shopify/scripts/data/kravet-map-pricing/dwkk-below-map-residual-2026-08-09.csv
@@ -0,0 +1,95 @@
+dw_sku,map,current_roll,gap
+DWKK-100830,330.75,173.25,157.50
+DWKK-100894,462,211.05,250.95
+DWKK-100899,462,211.05,250.95
+DWKK-102270,133.5,111.75,21.75
+DWKK-102408,1367.1,392.18,974.92
+DWKK-102409,1367.1,392.18,974.92
+DWKK-123135,156.71,73.5,83.21
+DWKK-128345,206.18,199.65,6.53
+DWKK-128347,206.18,199.65,6.53
+DWKK-128348,206.18,199.65,6.53
+DWKK-129507,404.18,387.75,16.43
+DWKK-129508,404.18,387.75,16.43
+DWKK-129509,404.18,387.75,16.43
+DWKK-129510,404.18,387.75,16.43
+DWKK-129511,404.18,387.75,16.43
+DWKK-129512,404.18,387.75,16.43
+DWKK-129513,404.18,387.75,16.43
+DWKK-129583,164.93,164.92,0.01
+DWKK-129660,181.43,173.25,8.18
+DWKK-129661,181.43,173.25,8.18
+DWKK-129662,181.43,173.25,8.18
+DWKK-129663,181.43,173.25,8.18
+DWKK-129674,188.93,188.92,0.01
+DWKK-129675,188.93,188.92,0.01
+DWKK-129676,188.93,188.92,0.01
+DWKK-129678,188.93,188.92,0.01
+DWKK-129681,188.93,188.92,0.01
+DWKK-129682,188.93,188.92,0.01
+DWKK-129683,188.93,188.92,0.01
+DWKK-130063,214.43,214.42,0.01
+DWKK-130064,214.43,214.42,0.01
+DWKK-130065,214.43,214.42,0.01
+DWKK-130066,214.43,214.42,0.01
+DWKK-130067,214.43,214.42,0.01
+DWKK-130094,214.43,173.25,41.18
+DWKK-130095,214.43,173.25,41.18
+DWKK-130096,214.43,173.25,41.18
+DWKK-130097,214.43,173.25,41.18
+DWKK-130098,214.43,173.25,41.18
+DWKK-128525,157.43,157.42,0.01
+DWKK-128526,157.43,157.42,0.01
+DWKK-128530,157.43,157.42,0.01
+DWKK-128531,157.43,157.42,0.01
+DWKK-128532,157.43,157.42,0.01
+DWKK-128533,157.43,157.42,0.01
+DWKK-128538,157.43,157.42,0.01
+DWKK-128539,157.43,157.42,0.01
+DWKK-128542,157.43,157.42,0.01
+DWKK-128543,157.43,157.42,0.01
+DWKK-128544,157.43,157.42,0.01
+DWKK-128546,157.43,157.42,0.01
+DWKK-128552,157.43,157.42,0.01
+DWKK-128553,157.43,157.42,0.01
+DWKK-128554,157.43,157.42,0.01
+DWKK-128562,141.68,141.67,0.01
+DWKK-128563,141.68,141.67,0.01
+DWKK-128564,141.68,141.67,0.01
+DWKK-128565,141.68,141.67,0.01
+DWKK-128573,141.68,141.67,0.01
+DWKK-128574,141.68,141.67,0.01
+DWKK-128575,141.68,141.67,0.01
+DWKK-128576,141.68,141.67,0.01
+DWKK-128577,141.68,141.67,0.01
+DWKK-128578,141.68,141.67,0.01
+DWKK-128579,141.68,141.67,0.01
+DWKK-128580,141.68,141.67,0.01
+DWKK-128581,141.68,141.67,0.01
+DWKK-128582,141.68,141.67,0.01
+DWKK-128583,141.68,141.67,0.01
+DWKK-139553,762,747,15.00
+DWKK-139566,757.5,742.5,15.00
+DWKK-139570,757.5,742.5,15.00
+DWKK-139571,757.5,742.5,15.00
+DWKK-139575,137.93,134.25,3.68
+DWKK-139577,762,747,15.00
+DWKK-139582,762,747,15.00
+DWKK-139584,762,747,15.00
+DWKK-139585,762,747,15.00
+DWKK-139587,910.5,892.5,18.00
+DWKK-139588,910.5,892.5,18.00
+DWKK-139589,910.5,892.5,18.00
+DWKK-139590,910.5,892.5,18.00
+DWKK-139591,910.5,892.5,18.00
+DWKK-139592,910.5,892.5,18.00
+DWKK-139593,910.5,892.5,18.00
+DWKK-139594,910.5,892.5,18.00
+DWKK-139595,910.5,892.5,18.00
+DWKK-139598,727.5,712.5,15.00
+DWKK-139600,727.5,712.5,15.00
+DWKK-139614,322.5,315,7.50
+DWKK-139615,322.5,315,7.50
+DWKK-139616,322.5,315,7.50
+DWKK-139617,444,433.5,10.50
+DWKK-139618,229.5,223.5,6.00
diff --git a/shopify/scripts/data/kravet-map-pricing/dwkk-full-audit-summary.json b/shopify/scripts/data/kravet-map-pricing/dwkk-full-audit-summary.json
new file mode 100644
index 0000000..db83a3a
--- /dev/null
+++ b/shopify/scripts/data/kravet-map-pricing/dwkk-full-audit-summary.json
@@ -0,0 +1,7 @@
+{
+ "ts": "2026-08-09",
+ "pool": 15398,
+ "checked": 14542,
+ "below": 94,
+ "atabove": 14448
+}
\ No newline at end of file
← 8c7dd39 TK-10014: MED 579 reprice run = verified no-op (all 579 alre
·
back to Designerwallcoverings
·
auto-data-snapshot: 2026-08-09T13:53:18 (2 data files) — scr 4ad552e →