[object Object]

← 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

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 →