← back to Designer Wallcoverings
DWKK wrong-join defect: stop trusting corrupt mirror mfr_sku for Kravet pricing
acc6224a301d1430e346e39b7273d86d146b0361 · 2026-07-15 14:22:23 -0700 · Steve Abrams
reprice-restore-kravet.js (the 2026-06-11 one-shot that priced 425 live DWKK
products at the WRONG SKU's MAP by joining the April sheet on the corrupt
shopify_products.mfr_sku column) gets a WARNING banner + runtime guard that
verifies metafield global.Item before any write. kravet-price-monitor.js and
add-kravet-roll-variants.js (recurring) now resolve the mfr SKU as
COALESCE(global.Item metafield, mirror column). Trace:
~/Projects/kravet-wrongjoin-reprice-2026-07/ROOT-CAUSE.md
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Files touched
M DW-Programming/archive-recovery/reprice-restore-kravet.jsM shopify/scripts/cadence/add-kravet-roll-variants.jsM shopify/scripts/cadence/kravet-price-monitor.js
Diff
commit acc6224a301d1430e346e39b7273d86d146b0361
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Wed Jul 15 14:22:23 2026 -0700
DWKK wrong-join defect: stop trusting corrupt mirror mfr_sku for Kravet pricing
reprice-restore-kravet.js (the 2026-06-11 one-shot that priced 425 live DWKK
products at the WRONG SKU's MAP by joining the April sheet on the corrupt
shopify_products.mfr_sku column) gets a WARNING banner + runtime guard that
verifies metafield global.Item before any write. kravet-price-monitor.js and
add-kravet-roll-variants.js (recurring) now resolve the mfr SKU as
COALESCE(global.Item metafield, mirror column). Trace:
~/Projects/kravet-wrongjoin-reprice-2026-07/ROOT-CAUSE.md
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---
.../archive-recovery/reprice-restore-kravet.js | 29 ++++++++++++++++++++++
.../scripts/cadence/add-kravet-roll-variants.js | 13 +++++++---
shopify/scripts/cadence/kravet-price-monitor.js | 11 ++++++--
3 files changed, 48 insertions(+), 5 deletions(-)
diff --git a/DW-Programming/archive-recovery/reprice-restore-kravet.js b/DW-Programming/archive-recovery/reprice-restore-kravet.js
index e227a31a..2f7867b0 100644
--- a/DW-Programming/archive-recovery/reprice-restore-kravet.js
+++ b/DW-Programming/archive-recovery/reprice-restore-kravet.js
@@ -1,5 +1,17 @@
#!/usr/bin/env node
/**
+ * ⚠⚠⚠ WARNING — CONFIRMED DEFECT (2026-07-15, vp-dw-commerce) — DO NOT RE-RUN AS-IS ⚠⚠⚠
+ * This one-shot 2026-06-11 script JOINED THE APRIL SHEET ON THE MIRROR COLUMN
+ * shopify_products.mfr_sku, which is CORRUPT for 593 active DWKK rows (holds a
+ * DIFFERENT Kravet-family SKU than the product's true one). Result: 425 ACTIVE
+ * DWKK products went live at the WRONG SKU's MAP (360 below true MAP, ~$142.6k
+ * under-gap). Ground truth for a product's mfr SKU is the Shopify metafield
+ * global.Item — the mirror mfr_sku column is a write-side cache stamped from
+ * kravet_catalog (whose dw_sku↔product pointers were cross-wired in April).
+ * Root-cause trace: ~/Projects/kravet-wrongjoin-reprice-2026-07/ROOT-CAUSE.md
+ * A runtime guard was added below (2026-07-15): each product's global.Item is
+ * fetched and any row where it disagrees with sp.mfr_sku is SKIPPED, never priced.
+ *
* Kravet-family reprice + restore. ONE vendor. Runs on Kamatera.
* For each archived WRONG_PRICED product matched in kravet_sheet_import_2026_04_20:
* new_retail = round(cost_computed / 0.65 / 0.85, 2) (Kravet discount=0%, confirmed)
@@ -26,6 +38,15 @@ async function shopGet(id) {
const r = await fetch(`https://${SHOP}/admin/api/2024-01/products/${id}.json?fields=id,status,variants`, { headers: { 'X-Shopify-Access-Token': TOKEN } });
if (!r.ok) return null; return (await r.json()).product;
}
+// GUARD (2026-07-15): ground-truth mfr SKU = metafield global.Item. The mirror
+// mfr_sku column is corrupt for 593 DWKK rows — never price off it unverified.
+async function shopTrueMfr(id) {
+ const r = await fetch(`https://${SHOP}/admin/api/2024-01/products/${id}/metafields.json?namespace=global&key=Item`,
+ { headers: { 'X-Shopify-Access-Token': TOKEN } });
+ if (!r.ok) return null;
+ const m = ((await r.json()).metafields || [])[0];
+ return m && m.value ? String(m.value).trim() : null;
+}
async function shopPut(id, body, attempt = 1) {
const r = await fetch(`https://${SHOP}/admin/api/2024-01/products/${id}.json`, {
method: 'PUT', headers: { 'X-Shopify-Access-Token': TOKEN, 'Content-Type': 'application/json' }, body: JSON.stringify({ product: body }) });
@@ -52,6 +73,14 @@ async function main() {
const price = String(row.new_retail);
if (DRY) { done++; continue; }
const id = numId(row.shopify_id);
+ // GUARD (2026-07-15): refuse to reprice when the live metafield global.Item
+ // disagrees with the mirror mfr_sku this row's MAP was joined on.
+ const trueMfr = await shopTrueMfr(id);
+ const norm = s => String(s || '').trim().toUpperCase().replace(/\.0$/, '');
+ if (!trueMfr || norm(trueMfr) !== norm(row.mfr_sku)) {
+ log(` SKIP wrong-join guard: product ${id} global.Item="${trueMfr}" != mirror mfr_sku="${row.mfr_sku}"`);
+ failed++; continue;
+ }
const p = await shopGet(id);
if (!p) { failed++; continue; }
const variants = (p.variants || []).filter(v => !/sample/i.test(v.title || '') && !/sample/i.test(v.option1 || ''));
diff --git a/shopify/scripts/cadence/add-kravet-roll-variants.js b/shopify/scripts/cadence/add-kravet-roll-variants.js
index 8b21d1a0..cd261d77 100644
--- a/shopify/scripts/cadence/add-kravet-roll-variants.js
+++ b/shopify/scripts/cadence/add-kravet-roll-variants.js
@@ -86,17 +86,24 @@ function candidates() {
const onlyClause = ONLY
? `AND s.shopify_id = '${ONLY.startsWith('gid://') ? ONLY : 'gid://shopify/Product/' + ONLY}'`
: '';
+ // WRONG-JOIN FIX (2026-07-15): the mirror column s.mfr_sku is corrupt for 593
+ // active DWKK rows (holds a DIFFERENT Kravet SKU) — pricing joined on it put
+ // 425 live products at the wrong SKU's MAP. Ground truth is the metafield
+ // global.Item; prefer it, fall back to the column only when Item is absent.
+ // See ~/Projects/kravet-wrongjoin-reprice-2026-07/ROOT-CAUSE.md
const sql = `
WITH base AS (
- SELECT DISTINCT s.shopify_id, s.mfr_sku, s.title, s.variant_sku,
+ SELECT DISTINCT s.shopify_id,
+ COALESCE(NULLIF(trim(s.metafields->'global'->'Item'->>'value'),''), s.mfr_sku) AS mfr_sku,
+ s.title, s.variant_sku,
COALESCE(km.map_price, kc.dw_sell_price, km.whls_cost*1.5, kc.cost_price*1.5) AS map,
CASE WHEN km.map_price>0 THEN 'master_map'
WHEN kc.dw_sell_price>0 THEN 'catalog_sell'
WHEN km.whls_cost>0 THEN 'master_cost*1.5'
WHEN kc.cost_price>0 THEN 'catalog_cost*1.5' END AS map_src
FROM shopify_products s
- LEFT JOIN kravet_catalog kc ON upper(trim(kc.mfr_sku))=upper(trim(s.mfr_sku))
- LEFT JOIN kravet_master_price km ON upper(trim(km.mfr_sku))=upper(trim(s.mfr_sku))
+ LEFT JOIN kravet_catalog kc ON upper(trim(kc.mfr_sku))=upper(trim(COALESCE(NULLIF(trim(s.metafields->'global'->'Item'->>'value'),''), s.mfr_sku)))
+ LEFT JOIN kravet_master_price km ON upper(trim(km.mfr_sku))=upper(trim(COALESCE(NULLIF(trim(s.metafields->'global'->'Item'->>'value'),''), s.mfr_sku)))
WHERE s.vendor ~* 'kravet|lee ?jofa|groundworks|brunschwig|baker|mulberry|threads|clarke|cole|gp ?& ?j|colefax|nicolette'
AND s.product_type ~* 'wallcover'
AND s.mfr_sku IS NOT NULL AND s.mfr_sku <> ''
diff --git a/shopify/scripts/cadence/kravet-price-monitor.js b/shopify/scripts/cadence/kravet-price-monitor.js
index 6e306869..a07879c6 100644
--- a/shopify/scripts/cadence/kravet-price-monitor.js
+++ b/shopify/scripts/cadence/kravet-price-monitor.js
@@ -42,11 +42,18 @@ function ddl(){
ddl();
// rolling cursor over distinct Kravet-family wallcovering products that we have an authoritative MAP for
const cursor = psql(`SELECT v FROM kravet_monitor_state WHERE k='cursor'`) || '0';
+ // WRONG-JOIN FIX (2026-07-15): the mirror column s.mfr_sku is corrupt for 593
+ // active DWKK rows (holds a DIFFERENT Kravet SKU). Ground truth is the metafield
+ // global.Item — prefer it, fall back to the column only when Item is absent.
+ // See ~/Projects/kravet-wrongjoin-reprice-2026-07/ROOT-CAUSE.md
const rows = psql(`
WITH cand AS (
- SELECT DISTINCT s.shopify_id, s.mfr_sku, a.new_map AS map_price
+ SELECT DISTINCT s.shopify_id,
+ COALESCE(NULLIF(trim(s.metafields->'global'->'Item'->>'value'),''), s.mfr_sku) AS mfr_sku,
+ a.new_map AS map_price
FROM shopify_products s
- JOIN kravet_authoritative_pricing a ON upper(trim(a.mfr_sku))=upper(trim(s.mfr_sku))
+ JOIN kravet_authoritative_pricing a
+ ON upper(trim(a.mfr_sku))=upper(trim(COALESCE(NULLIF(trim(s.metafields->'global'->'Item'->>'value'),''), s.mfr_sku)))
WHERE s.vendor ~* 'kravet|lee ?jofa|groundworks|brunschwig|baker|mulberry|threads|clarke|cole|gp ?& ?j|colefax|nicolette'
AND s.product_type ~* 'wallcover' AND a.new_map>0)
SELECT shopify_id, mfr_sku, map_price FROM cand
← 899b35d4 auto-save: 2026-07-15T14:07:06 (4 files) — pending-approval/
·
back to Designer Wallcoverings
·
auto-save: 2026-07-15T15:08:15 (4 files) — pending-approval/ 44a1b075 →