[object Object]

← back to Dw Five Field Step0

Load 1,934 JD combined costs durably + make priceable + queue (DTD-C)

8c4a666ad635bf3f83ba7798cdbd47bfb70eb607 · 2026-06-21 20:04:49 -0700 · steve

product_map.map_price keyed by synthetic dw_sku=mfr_sku (1,562 distinct),
map_source=jd-pointe-pricelist-2026-06; audit read paths (priceability.sql +
resolve-priceability.js) gain an mfr_sku LEFT JOIN so dw_sku-less JD rows
resolve durably. 1,934 queued into bulk_fivefield_worklist (build-roll,
pending). 161 held (114 discontinued/MTO + 47 unmatched) untouched. No Shopify
writes, no activation.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

Files touched

Diff

commit 8c4a666ad635bf3f83ba7798cdbd47bfb70eb607
Author: steve <steve@designerwallcoverings.com>
Date:   Sun Jun 21 20:04:49 2026 -0700

    Load 1,934 JD combined costs durably + make priceable + queue (DTD-C)
    
    product_map.map_price keyed by synthetic dw_sku=mfr_sku (1,562 distinct),
    map_source=jd-pointe-pricelist-2026-06; audit read paths (priceability.sql +
    resolve-priceability.js) gain an mfr_sku LEFT JOIN so dw_sku-less JD rows
    resolve durably. 1,934 queued into bulk_fivefield_worklist (build-roll,
    pending). 161 held (114 discontinued/MTO + 47 unmatched) untouched. No Shopify
    writes, no activation.
    
    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---
 jd-combined-cost-load.py              | 168 +++++++++++++++++++++++
 out/jd-combined-cost-load-report.json |  21 +++
 out/priceability.json                 | 252 +++++++++++++++++-----------------
 scripts/priceability.sql              |   9 +-
 scripts/resolve-priceability.js       |  13 +-
 5 files changed, 331 insertions(+), 132 deletions(-)

diff --git a/jd-combined-cost-load.py b/jd-combined-cost-load.py
new file mode 100644
index 0000000..3ac3cd0
--- /dev/null
+++ b/jd-combined-cost-load.py
@@ -0,0 +1,168 @@
+#!/usr/bin/env python3
+"""
+JD COMBINED-COST LOADER — load the 1,934 Justin-David private-label costs DURABLY
++ make them priceable + queue them. Steve-authorized write (officers/vp-dw-commerce,
+2026-06-21). Source = out/jd-combined-cost-diff.json (will_load=true rows only).
+
+WHY THIS IS DIFFERENT FROM batch-1 (cost-relink-load.py):
+  Every JD product (Shopify vendors "Los Angeles Fabrics" / "Phillipe Romano" /
+  "Architectural Wallcoverings") has dw_sku = NULL everywhere — shopify_products,
+  active_five_field_gaps, active_five_field_status. So the batch-1 path
+  (product_map keyed by the REAL dw_sku) is unavailable. DTD verdict C (3/3,
+  2026-06-21) chose: reuse product_map, key each row by a DETERMINISTIC SYNTHETIC
+  dw_sku = the mfr_sku string (JD mfr_skus are unique-by-pattern-color, satisfy
+  the PK, replication-safe upsert), populate product_map.mfr_sku, and add ONE
+  mfr_sku LEFT JOIN to the two audit read paths (priceability.sql +
+  resolve-priceability.js) so the 5-field audit resolves these by mfr_sku after a
+  rebuild. Those read-path edits are committed alongside this loader.
+
+KEYS:
+  - product_map (durable retail): 1,562 DISTINCT mfr_skus (367 mfr_skus map to
+    >1 Shopify product; cost is pattern-level so de-dupe to one map_price each).
+    dw_sku = mfr_sku (synthetic), map_price = computed retail, mfr_sku populated,
+    map_source = 'jd-pointe-pricelist-2026-06', map_unit='ROLL'. UPSERT on PK.
+  - bulk_fivefield_worklist (queue): all 1,934 DISTINCT shopify_ids
+    (status='pending', fix_type='build-roll', computed_price = retail, dw_sku
+    left blank since none exists). INSERT-only, replication-safe, idempotent by
+    shopify_id.
+
+HOLD (untouched): the 114 discontinued/MTO + 47 unmatched = 161 will_load=false rows.
+NO Shopify writes. NO variant builds. NO activation. The drain handles that on its
+own Steve-gated schedule. NEVER expose Pointe / Justin David / Command54 customer-
+facing (private label).
+
+Run with --apply to write; default is dry-run.
+"""
+import json, os, re, subprocess, sys, datetime
+
+ROOT = os.path.dirname(os.path.abspath(__file__))
+DIFF = os.path.join(ROOT, "out", "jd-combined-cost-diff.json")
+REPORT = os.path.join(ROOT, "out", "jd-combined-cost-load-report.json")
+APPLY = "--apply" in sys.argv
+SOURCE_TAG = "jd-pointe-pricelist-2026-06"
+
+
+def psql(sql, want_rows=True):
+    env = dict(os.environ); env.pop("PGPASSWORD", None); env.pop("DATABASE_URL", None)
+    r = subprocess.run(["psql", "-d", "dw_unified", "-v", "ON_ERROR_STOP=1",
+                        "-tAF", "\t", "-f", "-"],
+                       input=sql, capture_output=True, text=True, env=env)
+    if r.returncode != 0:
+        raise RuntimeError(f"psql failed: {r.stderr.strip()[:800]}")
+    if not want_rows:
+        return r.stdout
+    return [ln.split("\t") for ln in r.stdout.split("\n") if ln != ""]
+
+
+def q(v):
+    return "'" + str(v).replace("'", "''") + "'"
+
+
+def main():
+    d = json.load(open(DIFF))
+    rows = d["rows"]
+    will = [r for r in rows if r.get("will_load")]
+    held = [r for r in rows if not r.get("will_load")]
+    assert len(will) == 1934, f"expected 1934 will_load, got {len(will)}"
+    assert len(held) == 161, f"expected 161 held, got {len(held)}"
+
+    # ---- product_map upsert set: ONE row per distinct mfr_sku (synthetic dw_sku) ----
+    # cost is pattern-level so all dupes share map_price; de-dupe, assert no conflict.
+    pm = {}
+    for r in will:
+        mfr = r["mfr_sku"]
+        price = r["proposed_retail"]
+        if mfr in pm and abs(pm[mfr]["map_price"] - price) > 1e-9:
+            raise RuntimeError(f"conflicting retail for {mfr}: {pm[mfr]['map_price']} vs {price}")
+        pm.setdefault(mfr, {
+            "dw_sku": mfr,                       # synthetic PK = mfr_sku (DTD-C)
+            "sku": mfr,
+            "vendor": r["vendor"],
+            "pattern": (r.get("matched_pattern") or ""),
+            "color": "",
+            "map_price": price,
+            "mfr_sku": mfr,
+        })
+    pm_rows = list(pm.values())
+
+    # ---- worklist queue set: one row per distinct shopify_id ----
+    queue = [{
+        "shopify_id": r["shopify_id"], "dw_sku": (r.get("dw_sku") or ""),
+        "mfr_sku": r["mfr_sku"], "vendor": r["vendor"],
+        "computed_price": r["proposed_retail"],
+    } for r in will]
+
+    print(f"will_load rows:               {len(will)}", file=sys.stderr)
+    print(f"  -> product_map upserts:     {len(pm_rows)} (distinct mfr_sku)", file=sys.stderr)
+    print(f"  -> worklist queue rows:     {len(queue)} (distinct shopify_id)", file=sys.stderr)
+    print(f"held (untouched):             {len(held)}", file=sys.stderr)
+
+    report = {
+        "generatedAt": datetime.datetime.utcnow().isoformat() + "Z",
+        "apply": APPLY, "source_tag": SOURCE_TAG,
+        "durable_cost_location": "product_map.map_price (synthetic dw_sku=mfr_sku, "
+                                 "mfr_sku populated; audit reads via new mfr_sku LEFT JOIN) "
+                                 "[DTD-C 2026-06-21]",
+        "will_load": len(will),
+        "product_map_upserts": len(pm_rows),
+        "worklist_queue": len(queue),
+        "held_untouched": len(held),
+        "held_breakdown": {"discontinued_or_mto": 114, "unmatched": 47},
+        "retail_range": [min(x["map_price"] for x in pm_rows), max(x["map_price"] for x in pm_rows)],
+    }
+
+    if not APPLY:
+        report["mode"] = "DRY-RUN (no writes). Re-run with --apply."
+        json.dump(report, open(REPORT, "w"), indent=2)
+        print(json.dumps(report, indent=2))
+        return
+
+    # ---- WRITE 1: UPSERT into product_map (durable, replication-safe via PK) ----
+    vals = []
+    for x in pm_rows:
+        vals.append("(" + ",".join([
+            q(x["dw_sku"]), q(x["sku"]), q(x["vendor"]), q(x["pattern"]),
+            q(x["color"]), str(x["map_price"]), q("ROLL"), q(SOURCE_TAG),
+            "now()", q(x["mfr_sku"])]) + ")")
+    upsert = (
+        "BEGIN;\n"
+        "INSERT INTO product_map (dw_sku, sku, vendor, pattern, color, map_price, "
+        "map_unit, map_source, updated_at, mfr_sku) VALUES\n"
+        + ",\n".join(vals) +
+        "\nON CONFLICT (dw_sku) DO UPDATE SET "
+        "map_price=EXCLUDED.map_price, map_source=EXCLUDED.map_source, "
+        "map_unit=EXCLUDED.map_unit, updated_at=EXCLUDED.updated_at, "
+        "vendor=EXCLUDED.vendor, pattern=EXCLUDED.pattern, "
+        "mfr_sku=COALESCE(NULLIF(product_map.mfr_sku,''),EXCLUDED.mfr_sku);\n"
+        "COMMIT;")
+    psql(upsert, want_rows=False)
+    print(f"product_map UPSERT done: {len(pm_rows)} rows", file=sys.stderr)
+
+    # ---- WRITE 2: INSERT into bulk_fivefield_worklist (INSERT-only, repl-safe) ----
+    existing = set(r[0] for r in psql(
+        "SELECT DISTINCT shopify_id FROM bulk_fivefield_worklist;"))
+    base = int(psql("SELECT COALESCE(max(order_rank),0) FROM bulk_fivefield_worklist;")[0][0])
+    qvals = []; rank = base; seen = set()
+    for x in queue:
+        if x["shopify_id"] in existing or x["shopify_id"] in seen:
+            continue
+        seen.add(x["shopify_id"]); rank += 1
+        qvals.append("(" + ",".join([
+            str(rank), q(x["shopify_id"]), q(x["dw_sku"]), q(x["mfr_sku"]),
+            q(x["vendor"]), q("build-roll"), "false",
+            str(x["computed_price"]), "NULL", q("pending")]) + ")")
+    if qvals:
+        ins = ("BEGIN;\nINSERT INTO bulk_fivefield_worklist "
+               "(order_rank, shopify_id, dw_sku, mfr_sku, vendor, fix_type, "
+               "is_kravet_fam, computed_price, kravet_price, status) VALUES\n"
+               + ",\n".join(qvals) + ";\nCOMMIT;")
+        psql(ins, want_rows=False)
+    report["worklist_inserted"] = len(qvals)
+    report["worklist_skipped_existing"] = len(queue) - len(qvals)
+    report["mode"] = "APPLIED"
+    json.dump(report, open(REPORT, "w"), indent=2)
+    print(json.dumps(report, indent=2))
+
+
+if __name__ == "__main__":
+    main()
diff --git a/out/jd-combined-cost-load-report.json b/out/jd-combined-cost-load-report.json
new file mode 100644
index 0000000..940c1f3
--- /dev/null
+++ b/out/jd-combined-cost-load-report.json
@@ -0,0 +1,21 @@
+{
+  "generatedAt": "2026-06-22T03:03:33.775603Z",
+  "apply": true,
+  "source_tag": "jd-pointe-pricelist-2026-06",
+  "durable_cost_location": "product_map.map_price (synthetic dw_sku=mfr_sku, mfr_sku populated; audit reads via new mfr_sku LEFT JOIN) [DTD-C 2026-06-21]",
+  "will_load": 1934,
+  "product_map_upserts": 1562,
+  "worklist_queue": 1934,
+  "held_untouched": 161,
+  "held_breakdown": {
+    "discontinued_or_mto": 114,
+    "unmatched": 47
+  },
+  "retail_range": [
+    28.05,
+    541.18
+  ],
+  "worklist_inserted": 1934,
+  "worklist_skipped_existing": 0,
+  "mode": "APPLIED"
+}
\ No newline at end of file
diff --git a/out/priceability.json b/out/priceability.json
index 533f538..f990cb8 100644
--- a/out/priceability.json
+++ b/out/priceability.json
@@ -1,11 +1,11 @@
 {
-  "generatedAt": "2026-06-21T21:45:27.781Z",
+  "generatedAt": "2026-06-22T03:04:30.094Z",
   "totals": {
     "need_fix": 47443,
     "miss_product": 32966,
     "miss_sample": 14444,
-    "priceable": 11566,
-    "hold": 35877
+    "priceable": 13953,
+    "hold": 33490
   },
   "vendors": [
     {
@@ -14,9 +14,9 @@
       "miss_product": 5864,
       "miss_sample": 4406,
       "zero": 2,
-      "priceable": 0,
-      "source": "product_map?",
-      "hold": 10272
+      "priceable": 12,
+      "source": "product_map(dw_sku|mfr_sku)",
+      "hold": 10260
     },
     {
       "vendor": "Clarke And Clarke",
@@ -35,7 +35,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 2472
     },
     {
@@ -45,7 +45,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 2351
     },
     {
@@ -75,7 +75,7 @@
       "miss_sample": 0,
       "zero": 11,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1810
     },
     {
@@ -85,7 +85,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1788
     },
     {
@@ -104,9 +104,9 @@
       "miss_product": 1406,
       "miss_sample": 0,
       "zero": 0,
-      "priceable": 0,
-      "source": "product_map?",
-      "hold": 1406
+      "priceable": 1309,
+      "source": "product_map(dw_sku|mfr_sku)",
+      "hold": 97
     },
     {
       "vendor": "Coordonné",
@@ -115,7 +115,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1320
     },
     {
@@ -124,9 +124,9 @@
       "miss_product": 1181,
       "miss_sample": 84,
       "zero": 0,
-      "priceable": 0,
-      "source": "product_map?",
-      "hold": 1265
+      "priceable": 646,
+      "source": "product_map(dw_sku|mfr_sku)",
+      "hold": 619
     },
     {
       "vendor": "Brunschwig & Fils",
@@ -154,9 +154,9 @@
       "miss_product": 960,
       "miss_sample": 0,
       "zero": 0,
-      "priceable": 0,
-      "source": "product_map?",
-      "hold": 960
+      "priceable": 420,
+      "source": "product_map(dw_sku|mfr_sku)",
+      "hold": 540
     },
     {
       "vendor": "Osborne & Little",
@@ -175,7 +175,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 853
     },
     {
@@ -185,7 +185,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 842
     },
     {
@@ -205,7 +205,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 624
     },
     {
@@ -215,7 +215,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 583
     },
     {
@@ -225,7 +225,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 551
     },
     {
@@ -235,7 +235,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 515
     },
     {
@@ -245,7 +245,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 490
     },
     {
@@ -255,7 +255,7 @@
       "miss_sample": 418,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 418
     },
     {
@@ -285,7 +285,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 357
     },
     {
@@ -295,7 +295,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 350
     },
     {
@@ -305,7 +305,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 328
     },
     {
@@ -315,7 +315,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 327
     },
     {
@@ -325,7 +325,7 @@
       "miss_sample": 98,
       "zero": 2,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 326
     },
     {
@@ -335,7 +335,7 @@
       "miss_sample": 283,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 284
     },
     {
@@ -355,7 +355,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 269
     },
     {
@@ -375,7 +375,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 243
     },
     {
@@ -385,7 +385,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 170
     },
     {
@@ -395,7 +395,7 @@
       "miss_sample": 4,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 158
     },
     {
@@ -415,7 +415,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 149
     },
     {
@@ -425,7 +425,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 147
     },
     {
@@ -435,7 +435,7 @@
       "miss_sample": 19,
       "zero": 2,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 140
     },
     {
@@ -455,7 +455,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 112
     },
     {
@@ -465,7 +465,7 @@
       "miss_sample": 1,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 95
     },
     {
@@ -475,7 +475,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 75
     },
     {
@@ -485,7 +485,7 @@
       "miss_sample": 2,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 72
     },
     {
@@ -505,7 +505,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 68
     },
     {
@@ -515,7 +515,7 @@
       "miss_sample": 0,
       "zero": 1,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 65
     },
     {
@@ -525,7 +525,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 55
     },
     {
@@ -535,7 +535,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 55
     },
     {
@@ -545,7 +545,7 @@
       "miss_sample": 35,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 48
     },
     {
@@ -555,7 +555,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 42
     },
     {
@@ -565,7 +565,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 41
     },
     {
@@ -575,7 +575,7 @@
       "miss_sample": 7,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 38
     },
     {
@@ -585,7 +585,7 @@
       "miss_sample": 2,
       "zero": 1,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 37
     },
     {
@@ -595,7 +595,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 35
     },
     {
@@ -605,7 +605,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 31
     },
     {
@@ -615,7 +615,7 @@
       "miss_sample": 25,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 31
     },
     {
@@ -625,7 +625,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 27
     },
     {
@@ -635,7 +635,7 @@
       "miss_sample": 17,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 27
     },
     {
@@ -645,7 +645,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 26
     },
     {
@@ -655,7 +655,7 @@
       "miss_sample": 0,
       "zero": 14,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 23
     },
     {
@@ -665,7 +665,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 23
     },
     {
@@ -675,7 +675,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 21
     },
     {
@@ -695,7 +695,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 13
     },
     {
@@ -705,7 +705,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 13
     },
     {
@@ -715,7 +715,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 12
     },
     {
@@ -725,7 +725,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 12
     },
     {
@@ -735,7 +735,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 10
     },
     {
@@ -745,7 +745,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 10
     },
     {
@@ -755,7 +755,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 10
     },
     {
@@ -765,7 +765,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 10
     },
     {
@@ -775,7 +775,7 @@
       "miss_sample": 9,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 10
     },
     {
@@ -785,7 +785,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 9
     },
     {
@@ -795,7 +795,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 9
     },
     {
@@ -805,7 +805,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 9
     },
     {
@@ -815,7 +815,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 8
     },
     {
@@ -825,7 +825,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 8
     },
     {
@@ -835,7 +835,7 @@
       "miss_sample": 0,
       "zero": 1,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 7
     },
     {
@@ -845,7 +845,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 6
     },
     {
@@ -855,7 +855,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 6
     },
     {
@@ -865,7 +865,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 5
     },
     {
@@ -885,7 +885,7 @@
       "miss_sample": 2,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 5
     },
     {
@@ -895,7 +895,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 4
     },
     {
@@ -905,7 +905,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 4
     },
     {
@@ -915,7 +915,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 4
     },
     {
@@ -925,7 +925,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 4
     },
     {
@@ -935,7 +935,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 3
     },
     {
@@ -945,7 +945,7 @@
       "miss_sample": 1,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 3
     },
     {
@@ -955,7 +955,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 3
     },
     {
@@ -965,7 +965,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 3
     },
     {
@@ -975,7 +975,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 3
     },
     {
@@ -985,7 +985,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 3
     },
     {
@@ -995,7 +995,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 3
     },
     {
@@ -1005,7 +1005,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 3
     },
     {
@@ -1015,7 +1015,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 3
     },
     {
@@ -1025,7 +1025,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 3
     },
     {
@@ -1035,7 +1035,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 2
     },
     {
@@ -1045,7 +1045,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 2
     },
     {
@@ -1055,7 +1055,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 2
     },
     {
@@ -1065,7 +1065,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 2
     },
     {
@@ -1075,7 +1075,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1085,7 +1085,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1095,7 +1095,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1105,7 +1105,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1115,7 +1115,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1125,7 +1125,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1135,7 +1135,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1145,7 +1145,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1155,7 +1155,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1165,7 +1165,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1175,7 +1175,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1195,7 +1195,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1205,7 +1205,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1215,7 +1215,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1225,7 +1225,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1235,7 +1235,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1245,7 +1245,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1255,7 +1255,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1265,7 +1265,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1275,7 +1275,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1285,7 +1285,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 1,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 0
     },
     {
@@ -1295,7 +1295,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1305,7 +1305,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1315,7 +1315,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1325,7 +1325,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     },
     {
@@ -1335,7 +1335,7 @@
       "miss_sample": 0,
       "zero": 0,
       "priceable": 0,
-      "source": "product_map?",
+      "source": "product_map(dw_sku|mfr_sku)",
       "hold": 1
     }
   ]
diff --git a/scripts/priceability.sql b/scripts/priceability.sql
index 9e0c7d0..1886a87 100644
--- a/scripts/priceability.sql
+++ b/scripts/priceability.sql
@@ -53,8 +53,11 @@ SELECT
     CASE WHEN k.is_kravet_fam THEN NULLIF(pm.map_price,0) END,
     CASE WHEN k.is_kravet_fam THEN NULLIF(kmp.map_price,0) END,
     CASE WHEN k.is_kravet_fam THEN NULLIF(kc.dw_sell_price,0) END,
-    -- generic product_map MAP (covers some non-kravet too)
-    NULLIF(pm.map_price,0)
+    -- generic product_map MAP by dw_sku (covers some non-kravet too)
+    NULLIF(pm.map_price,0),
+    -- generic product_map MAP by mfr_sku (DTD-C 2026-06-21: covers dw_sku-less
+    -- private-label rows like Justin-David whose dw_sku is NULL everywhere)
+    NULLIF(pmm.map_price,0)
   ) AS kravet_price,
   vm.cost  AS km_cost,
   pm.map_price AS pm_map,
@@ -62,5 +65,7 @@ SELECT
 FROM keyed k
 LEFT JOIN kravet_dwkk_variant_map vm ON vm.dw_sku = k.dw_sku
 LEFT JOIN product_map pm ON pm.dw_sku = k.dw_sku
+LEFT JOIN product_map pmm ON pmm.mfr_sku IS NOT NULL
+                          AND upper(pmm.mfr_sku) = upper(k.mfr_sku)
 LEFT JOIN kravet_master_price kmp ON upper(kmp.mfr_sku) = upper(k.mfr_sku)
 LEFT JOIN kravet_catalog kc ON upper(kc.mfr_sku) = upper(k.mfr_sku);
diff --git a/scripts/resolve-priceability.js b/scripts/resolve-priceability.js
index 7bc38f8..cf1ff70 100644
--- a/scripts/resolve-priceability.js
+++ b/scripts/resolve-priceability.js
@@ -92,15 +92,20 @@ function main() {
         try { byDw  = +psql(q(`c.dw_sku=sp.dw_sku`)).trim() || 0; } catch {}
         priceable = Math.max(byMfr, byDw);
       } else {
-        // no cadence config -> probe product_map MAP (some non-kravet have real MAP)
-        source = 'product_map?';
+        // no cadence config -> probe product_map MAP (some non-kravet have real MAP).
+        // DTD-C 2026-06-21: join product_map by dw_sku OR by mfr_sku so dw_sku-less
+        // private-label rows (Justin-David: dw_sku NULL everywhere, keyed by mfr_sku)
+        // resolve to their durable map_price after a full audit rebuild.
+        source = 'product_map(dw_sku|mfr_sku)';
         priceable = +psql(`
           SELECT count(DISTINCT a.shopify_id)
           FROM active_five_field_status a
           JOIN shopify_products sp ON sp.shopify_id=a.shopify_id
-          JOIN product_map pm ON pm.dw_sku=sp.dw_sku
+          LEFT JOIN product_map pm  ON pm.dw_sku=sp.dw_sku
+          LEFT JOIN product_map pmm ON pmm.mfr_sku IS NOT NULL
+                                   AND upper(pmm.mfr_sku)=upper(sp.mfr_sku)
           WHERE a.vendor='${v}' AND (NOT a.has_product OR NOT a.has_sample OR a.any_zero)
-            AND pm.map_price>0;`).trim() || 0;
+            AND (pm.map_price>0 OR pmm.map_price>0);`).trim() || 0;
       }
     }
     // sample-only-gap SKUs are always "fixable" (flat $4.25) even with no cost,

← 893920e auto-save: 2026-06-21T20:01:45 (3 files) — results/ vendor-p  ·  back to Dw Five Field Step0  ·  Add skip-guard: rows with no resolvable base SKU (dw_sku Non 4cfe6da →