← back to Dw Add Sellable Variant Tk10902
tk10875-wolf-gordon/build-state.mjs
41 lines
#!/usr/bin/env node
// TK-10875 Wolf Gordon — build defect-state.json from data/cohort.tsv.
// cohort.tsv cols: pid \t dw_numeric_sku \t mfr_sku \t title \t price_trade \t computed_roll_retail
// Retail is RECOMPUTED here from price_trade (trade/0.65/0.85) — never trust any stale mirror price.
import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
const dataDir = new URL('./data', import.meta.url).pathname;
mkdirSync(dataDir, { recursive: true });
const rows = readFileSync(`${dataDir}/cohort.tsv`, 'utf8').trim().split('\n').filter(Boolean);
const products = [];
for (const line of rows) {
const [pid, dwSku, mfrSku, title, priceTrade, computed] = line.split('\t');
const trade = parseFloat(priceTrade);
// authoritative recompute (the file already has it, but recompute to be self-consistent)
const rollRetail = Math.round((trade / 0.65 / 0.85) * 100) / 100;
const dw = (dwSku || '').trim();
const ok = !!(pid && dw && rollRetail > 4.5 && Math.abs(rollRetail - parseFloat(computed)) < 0.02);
products.push({
pid: String(pid).trim(),
vendor: 'Wolf Gordon',
title: (title || '').trim(),
dwSku: dw,
mfrSku: (mfrSku || '').trim(),
priceTrade: trade,
rollRetail,
rollSku: dw, // NO MINT — roll variant keeps the numeric DW-SKU
sampleSku: `${dw}-Sample`,
samplePrice: '4.25',
ok,
});
}
const state = {
ts: new Date().toISOString(),
ticket: 'TK-10875',
cohort: 'Wolf Gordon',
counts: { total: products.length, ok: products.filter(p => p.ok).length, bad: products.filter(p => !p.ok).length },
products,
};
writeFileSync(`${dataDir}/defect-state.json`, JSON.stringify(state, null, 2));
console.log(`defect-state.json: total=${state.counts.total} ok=${state.counts.ok} bad=${state.counts.bad}`);
if (state.counts.bad) console.log('BAD rows:', products.filter(p => !p.ok).map(p => p.pid + ' ' + p.dwSku));