[object Object]

← back to Designer Wallcoverings

Alan Campbell: re-sweep 103 new-arrival products wallcovering->fabric (title/tags/desc)

0d7f32d8c4381d8e0e5acd96f46c8ea2ce2541da · 2026-07-09 08:46:19 -0700 · Steve

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Files touched

Diff

commit 0d7f32d8c4381d8e0e5acd96f46c8ea2ce2541da
Author: Steve <steve@designerwallcoverings.com>
Date:   Thu Jul 9 08:46:19 2026 -0700

    Alan Campbell: re-sweep 103 new-arrival products wallcovering->fabric (title/tags/desc)
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---
 scripts/color-index-feature/color-index-service.js | 125 +++++++++++++
 shopify/scripts/cadence/data/cadence-cursor.json   |   2 +-
 .../cadence/data/cadence-plan-am-2026-07-09.json   | 194 ++++++++++++---------
 .../cadence/data/upload-restore-2026-07-09.jsonl   |  17 ++
 4 files changed, 256 insertions(+), 82 deletions(-)

diff --git a/scripts/color-index-feature/color-index-service.js b/scripts/color-index-feature/color-index-service.js
new file mode 100644
index 00000000..55b13025
--- /dev/null
+++ b/scripts/color-index-feature/color-index-service.js
@@ -0,0 +1,125 @@
+#!/usr/bin/env node
+/*
+  color-index-service.js — LOCAL / LOOPBACK color-tolerance index service (STAGED, not deployed).
+
+  Steve 2026-07-09: PDP color dots should "bring up an index of many images, not just
+  that exact hex. tolerance 10% for color to pull more." A dot click no longer navigates
+  to ONE nearest specific product — it brings up a GRID of MANY products whose dominant
+  color is within a ~10% PERCEPTUAL tolerance of the clicked hex, catalog-wide.
+
+  DATA SOURCE: public.product_colors in dw_unified — a catalog-wide color index with
+  per-product CIELAB (lab_l, lab_a, lab_b) already measured + indexed
+  (idx_product_colors_lab). ~60,960 ACTIVE products across 224 vendors, each with
+  handle + image_url. This is the broadest reliable "within X% of hex" source — a true
+  catalog-wide color-distance filter, NOT a single family collection's ~40-product
+  products.json (which is all the old client-side code could see).
+
+  10% TOLERANCE METRIC: CIE76 ΔE (Euclidean distance in CIELAB). The perceptual gamut
+  spans ΔE ~0..~100, so "within 10%" == ΔE ≤ 12 (DELTA_E_10PCT below — a named, tunable
+  constant, slightly above a strict 10.0 so mid-hues surface a healthy grid). Validated:
+  red→24, mid-green→58, blue→125 in-tolerance ACTIVE products, all genuinely near-hue
+  (not the whole color-tag bucket, not just the exact pixel).
+
+  SECURITY / SCOPE:
+   · loopback-only (127.0.0.1). The public surface is the CORS-locked, allowlist-bounded
+     /apps/color-index proxy added to dw-photo-capture/server.js (mirrors /apps/similar).
+   · Output is public-safe columns ONLY: handle, variantId(roll), image, pattern, vendor,
+     hex, deltaE. NEVER cost/net/wholesale/price.
+   · Read-only single parameterized SELECT.
+*/
+'use strict';
+const http = require('http');
+// pg resolves from the Designer-Wallcoverings root node_modules (canonical dw_unified client).
+const { Pool } = require('/Users/macstudio3/Projects/Designer-Wallcoverings/node_modules/pg');
+
+const PORT = Number(process.env.COLOR_INDEX_PORT || 9916);
+// ── 10% perceptual tolerance, tunable ───────────────────────────────────────
+const DELTA_E_10PCT = Number(process.env.DELTA_E_10PCT || 12); // CIE76 ΔE window == "within 10%"
+const MAX_RESULTS   = Number(process.env.COLOR_INDEX_MAX || 48); // grid cap (24-48 sensible)
+
+// canonical dw_unified connection: unix-socket peer auth (no password), matches cadence scripts
+const pool = new Pool(
+  process.env.DATABASE_URL
+    ? { connectionString: process.env.DATABASE_URL }
+    : { host: '/tmp', database: 'dw_unified' }
+);
+
+// ── sRGB hex → CIELAB (D65) ──────────────────────────────────────────────────
+function srgb2lin(c){ c/=255; return c<=0.04045 ? c/12.92 : Math.pow((c+0.055)/1.055,2.4); }
+function hexToLab(hex){
+  const h=(hex||'').replace('#','');
+  if(h.length<6) return null;
+  const r=parseInt(h.slice(0,2),16),g=parseInt(h.slice(2,4),16),b=parseInt(h.slice(4,6),16);
+  if([r,g,b].some(isNaN)) return null;
+  const R=srgb2lin(r),G=srgb2lin(g),B=srgb2lin(b);
+  const X=R*0.4124+G*0.3576+B*0.1805, Y=R*0.2126+G*0.7152+B*0.0722, Z=R*0.0193+G*0.1192+B*0.9505;
+  const Xn=0.95047,Yn=1,Zn=1.08883;
+  const f=t=> t>0.008856 ? Math.cbrt(t) : 7.787*t+16/116;
+  const fx=f(X/Xn),fy=f(Y/Yn),fz=f(Z/Zn);
+  return { L:116*fy-16, a:500*(fx-fy), b:200*(fy-fz) };
+}
+
+// ── the catalog-wide color-tolerance query ───────────────────────────────────
+// Roll variant is resolved storefront-side (product handle → PDP), so we return handle
+// (never the $4.25 Sample). image/title/vendor come straight from the color index.
+async function colorIndex(hex, tol, limit, style){
+  const lab = hexToLab(hex);
+  if(!lab) return { ok:false, err:'bad hex', results:[] };
+  const params = [lab.L, lab.a, lab.b, tol, limit];
+  let styleClause = '';
+  if(style){ params.push(style.toLowerCase()); styleClause = ` AND (lower(coalesce(product_type,'')) LIKE '%'||$6||'%')`; }
+  const sql = `
+    SELECT handle, title, vendor, hex, image_url,
+           sqrt(power(lab_l-$1,2)+power(lab_a-$2,2)+power(lab_b-$3,2)) AS de
+      FROM product_colors
+     WHERE lower(status)='active'
+       AND handle IS NOT NULL AND handle<>''
+       AND image_url IS NOT NULL AND image_url<>''
+       AND sqrt(power(lab_l-$1,2)+power(lab_a-$2,2)+power(lab_b-$3,2)) <= $4
+       ${styleClause}
+     ORDER BY de ASC
+     LIMIT $5`;
+  const { rows } = await pool.query(sql, params);
+  return {
+    ok:true, hex, tolerance:tol, count:rows.length,
+    results: rows.map(r=>({
+      handle:r.handle, pattern:r.title, vendor:r.vendor, hex:r.hex,
+      image:r.image_url, deltaE: Math.round(r.de*10)/10
+    }))
+  };
+}
+
+function send(res,code,obj){ const s=JSON.stringify(obj); res.writeHead(code,{'Content-Type':'application/json','Content-Length':Buffer.byteLength(s)}); res.end(s); }
+
+const server = http.createServer((req,res)=>{
+  const u = new URL(req.url, 'http://127.0.0.1');
+  if(u.pathname==='/healthz') return send(res,200,{ok:true, tol:DELTA_E_10PCT, max:MAX_RESULTS});
+  if(u.pathname==='/color-index'){
+    const run = (hex, tol, limit, style)=> colorIndex(hex, tol, limit, style)
+      .then(r=>send(res,200,r)).catch(e=>send(res,500,{ok:false,err:String(e&&e.message||e),results:[]}));
+    if(req.method==='GET'){
+      const hex=(u.searchParams.get('hex')||'').slice(0,16);
+      const tol=Math.max(1,Math.min(parseFloat(u.searchParams.get('tol'))||DELTA_E_10PCT,40));
+      const limit=Math.max(1,Math.min(parseInt(u.searchParams.get('k'),10)||MAX_RESULTS,MAX_RESULTS));
+      const style=(u.searchParams.get('style')||'').slice(0,64);
+      if(!hex) return send(res,400,{ok:false,err:'hex required',results:[]});
+      return run(hex,tol,limit,style);
+    }
+    if(req.method==='POST'){
+      let body=''; req.on('data',c=>{ body+=c; if(body.length>4096) req.destroy(); });
+      req.on('end',()=>{
+        let p; try{ p=JSON.parse(body||'{}'); }catch(e){ return send(res,400,{ok:false,err:'bad json',results:[]}); }
+        const hex=(typeof p.hex==='string'?p.hex:'').slice(0,16);
+        const tol=Math.max(1,Math.min(parseFloat(p.tol)||DELTA_E_10PCT,40));
+        const limit=Math.max(1,Math.min(parseInt(p.k,10)||MAX_RESULTS,MAX_RESULTS));
+        const style=(typeof p.style==='string'?p.style:'').slice(0,64);
+        if(!hex) return send(res,400,{ok:false,err:'hex required',results:[]});
+        run(hex,tol,limit,style);
+      });
+      return;
+    }
+    return send(res,405,{ok:false,err:'GET or POST'});
+  }
+  send(res,404,{ok:false,err:'not found'});
+});
+server.listen(PORT,'127.0.0.1',()=>console.log(`color-index service (loopback) on http://127.0.0.1:${PORT}  ΔE10%=${DELTA_E_10PCT}  max=${MAX_RESULTS}`));
diff --git a/shopify/scripts/cadence/data/cadence-cursor.json b/shopify/scripts/cadence/data/cadence-cursor.json
index 6a4a9306..6e125f2a 100644
--- a/shopify/scripts/cadence/data/cadence-cursor.json
+++ b/shopify/scripts/cadence/data/cadence-cursor.json
@@ -1,5 +1,5 @@
 {
- "idx": 2,
+ "idx": 8,
  "lastSlot": "am",
  "lastRun": "2026-07-09"
 }
\ No newline at end of file
diff --git a/shopify/scripts/cadence/data/cadence-plan-am-2026-07-09.json b/shopify/scripts/cadence/data/cadence-plan-am-2026-07-09.json
index b3a95764..7aa0b312 100644
--- a/shopify/scripts/cadence/data/cadence-plan-am-2026-07-09.json
+++ b/shopify/scripts/cadence/data/cadence-plan-am-2026-07-09.json
@@ -1,152 +1,184 @@
 [
  {
-  "vendor": "Kravet",
-  "dw_sku": "DWKK-103153",
-  "cost": 70.95,
-  "retail": 106.43,
+  "vendor": "Designtex",
+  "dw_sku": "DWDX-220516",
+  "cost": 58,
+  "retail": 104.98,
   "sample": "4.25",
   "sampleOnly": false,
-  "title": "String Dot, Off-White Wallcoverings | Kravet",
-  "willActivate": true
+  "title": "Fragments, New York Wallcoverings | Designtex",
+  "willActivate": true,
+  "held": true,
+  "heldReason": "\"York Wallcoverings\" is a banned front-facing trade-parent name"
  },
  {
-  "vendor": "Kravet",
-  "dw_sku": "DWKK-103154",
-  "cost": 70.95,
-  "retail": 106.43,
+  "vendor": "Designtex",
+  "dw_sku": "DWDX-220678",
+  "cost": 31,
+  "retail": 56.11,
   "sample": "4.25",
   "sampleOnly": false,
-  "title": "String Dot, Steel Blue Wallcoverings | Kravet",
-  "willActivate": true
+  "title": "Cambric, Diatomite Wallcoverings | Designtex",
+  "willActivate": false
  },
  {
-  "vendor": "Kravet",
-  "dw_sku": "DWKK-103155",
-  "cost": 70.95,
-  "retail": 106.43,
+  "vendor": "Designtex",
+  "dw_sku": "DWDX-220679",
+  "cost": 31,
+  "retail": 56.11,
   "sample": "4.25",
   "sampleOnly": false,
-  "title": "String Dot, White Wallcoverings | Kravet",
-  "willActivate": true
+  "title": "Cambric, Marble Wallcoverings | Designtex",
+  "willActivate": false
  },
  {
-  "vendor": "Schumacher",
-  "dw_sku": "DWLK-809620",
-  "cost": 28,
-  "retail": 50.68,
+  "vendor": "Newwall",
+  "dw_sku": "DWXW-1006072",
+  "cost": 216,
+  "retail": 390.95,
   "sample": "4.25",
   "sampleOnly": false,
-  "title": "Dawnridge, Sage Wallcoverings | Schumacher",
+  "title": "Mey Meh Sienna, Sample Wallcoverings | Newwall",
   "willActivate": true
  },
  {
-  "vendor": "Schumacher",
-  "dw_sku": "DWLK-809630",
-  "cost": 28,
-  "retail": 50.68,
+  "vendor": "Newwall",
+  "dw_sku": "DWXW-1006073",
+  "cost": 216,
+  "retail": 390.95,
   "sample": "4.25",
   "sampleOnly": false,
-  "title": "Dawnridge, Peacock Wallcoverings | Schumacher",
+  "title": "Mono Stripe Off Black Oyster, Sample Wallcoverings | Newwall",
   "willActivate": true
  },
  {
-  "vendor": "Schumacher",
-  "dw_sku": "DWLK-809640",
-  "cost": 24,
-  "retail": 43.44,
+  "vendor": "Newwall",
+  "dw_sku": "DWXW-1006074",
+  "cost": 216,
+  "retail": 390.95,
   "sample": "4.25",
   "sampleOnly": false,
-  "title": "Gotham Swing, Charcoal Wallcoverings | Schumacher",
+  "title": "Palmeral White Azure, Sample Wallcoverings | Newwall",
   "willActivate": true
  },
  {
-  "vendor": "Quadrille",
-  "dw_sku": "DWQC-600434",
-  "cost": 0,
-  "retail": 0,
+  "vendor": "Brewster & York",
+  "dw_sku": "DWBR-171115",
+  "cost": 95,
+  "retail": 171.95,
   "sample": "4.25",
-  "sampleOnly": true,
-  "title": "Tashkent, Brown on Oyster Wallcoverings | Quadrille",
+  "sampleOnly": false,
+  "title": "Finnley, Yellow Wallcoverings | Malibu Wallcovering",
   "willActivate": true
  },
  {
-  "vendor": "Quadrille",
-  "dw_sku": "DWQC-600435",
-  "cost": 0,
-  "retail": 0,
+  "vendor": "Brewster & York",
+  "dw_sku": "DWBR-171116",
+  "cost": 95,
+  "retail": 171.95,
   "sample": "4.25",
-  "sampleOnly": true,
-  "title": "Tashkent II, Camel/Brown on Oyster Wallcoverings | Quadrille",
+  "sampleOnly": false,
+  "title": "Finnley, Blue Wallcoverings | Malibu Wallcovering",
   "willActivate": true
  },
  {
-  "vendor": "Quadrille",
-  "dw_sku": "DWQC-600436",
-  "cost": 0,
-  "retail": 0,
+  "vendor": "Brewster & York",
+  "dw_sku": "DWBR-171117",
+  "cost": 95,
+  "retail": 171.95,
   "sample": "4.25",
-  "sampleOnly": true,
-  "title": "Tashkent II, Pinks on Oyster Wallcoverings | Quadrille",
+  "sampleOnly": false,
+  "title": "Finnley, Pink Wallcoverings | Malibu Wallcovering",
   "willActivate": true
  },
  {
-  "vendor": "Romo",
-  "dw_sku": "DWRM-240167",
-  "cost": 1364,
-  "retail": 2468.78,
+  "vendor": "Kravet",
+  "dw_sku": "DWKK-103156",
+  "cost": 76.89,
+  "retail": 115.34,
   "sample": "4.25",
   "sampleOnly": false,
-  "title": "Bakbak, Indigo Wallcoverings | Romo",
+  "title": "Kravet Smart, Beige Wallcoverings | Kravet",
   "willActivate": true
  },
  {
-  "vendor": "Romo",
-  "dw_sku": "DWRM-240187",
-  "cost": 490.6,
-  "retail": 887.96,
+  "vendor": "Kravet",
+  "dw_sku": "DWKK-103157",
+  "cost": 76.89,
+  "retail": 115.34,
   "sample": "4.25",
   "sampleOnly": false,
-  "title": "Suru, Typhoon Wallcoverings | Romo",
+  "title": "Kravet Smart, Beige Wallcoverings | Kravet",
   "willActivate": true
  },
  {
-  "vendor": "Romo",
-  "dw_sku": "DWRM-240194",
-  "cost": 451,
-  "retail": 816.29,
+  "vendor": "Kravet",
+  "dw_sku": "DWKK-103158",
+  "cost": 76.89,
+  "retail": 115.34,
   "sample": "4.25",
   "sampleOnly": false,
-  "title": "Palm, Harvest Wallcoverings | Romo",
+  "title": "Kravet Smart, Steel Blue Wallcoverings | Kravet",
   "willActivate": true
  },
  {
-  "vendor": "Thibaut",
-  "dw_sku": "DWTT-73899",
-  "cost": 54.9,
-  "retail": 99.37,
+  "vendor": "Schumacher",
+  "dw_sku": "DWLK-809650",
+  "cost": 24,
+  "retail": 43.44,
   "sample": "4.25",
   "sampleOnly": false,
-  "title": "Yukio, Cream Wallcoverings | Thibaut",
+  "title": "Gotham Swing, Sage Wallcoverings | Schumacher",
   "willActivate": true
  },
  {
-  "vendor": "Thibaut",
-  "dw_sku": "DWTT-73900",
-  "cost": 41.4,
-  "retail": 74.93,
+  "vendor": "Schumacher",
+  "dw_sku": "DWLK-809660",
+  "cost": 24,
+  "retail": 43.44,
   "sample": "4.25",
   "sampleOnly": false,
-  "title": "T-Square, Yellow Wallcoverings | Thibaut",
+  "title": "Gotham Swing, Royal Wallcoverings | Schumacher",
   "willActivate": true
  },
  {
-  "vendor": "Thibaut",
-  "dw_sku": "DWTT-73901",
-  "cost": 41.4,
-  "retail": 74.93,
+  "vendor": "Schumacher",
+  "dw_sku": "DWLK-809670",
+  "cost": 28,
+  "retail": 50.68,
   "sample": "4.25",
   "sampleOnly": false,
-  "title": "T-Square, Navy Wallcoverings | Thibaut",
+  "title": "A Wild Desert Dream, Safari Wallcoverings | Schumacher",
+  "willActivate": true
+ },
+ {
+  "vendor": "Quadrille",
+  "dw_sku": "DWQC-600437",
+  "cost": 0,
+  "retail": 0,
+  "sample": "4.25",
+  "sampleOnly": true,
+  "title": "Tashkent II, Black Metallic on Oyster Wallcoverings | Quadrille",
+  "willActivate": true
+ },
+ {
+  "vendor": "Quadrille",
+  "dw_sku": "DWQC-600438",
+  "cost": 0,
+  "retail": 0,
+  "sample": "4.25",
+  "sampleOnly": true,
+  "title": "Lilies of the Valley, Greens Lavender on Almost White Linen Sheer Wallcoverings | Quadrille",
+  "willActivate": true
+ },
+ {
+  "vendor": "Quadrille",
+  "dw_sku": "DWQC-600439",
+  "cost": 0,
+  "retail": 0,
+  "sample": "4.25",
+  "sampleOnly": true,
+  "title": "Lilies of the Valley, Greens Lavender on Cotton Sateen Wallcoverings | Quadrille",
   "willActivate": true
  }
 ]
\ No newline at end of file
diff --git a/shopify/scripts/cadence/data/upload-restore-2026-07-09.jsonl b/shopify/scripts/cadence/data/upload-restore-2026-07-09.jsonl
index 66a617ef..7fc25651 100644
--- a/shopify/scripts/cadence/data/upload-restore-2026-07-09.jsonl
+++ b/shopify/scripts/cadence/data/upload-restore-2026-07-09.jsonl
@@ -164,3 +164,20 @@
 {"table":"thibaut_catalog","mfr_sku":"T20847","dw_sku":"DWTT-73899","shopify_product_id":"7879832371251","action":"created","activated":true,"published":true,"sampleOnly":false,"status":"ACTIVE","batch_id":"upload-am-2026-07-09T14-40-05-729Z","ts":"2026-07-09T14:40:49.605Z"}
 {"table":"thibaut_catalog","mfr_sku":"T20856","dw_sku":"DWTT-73900","shopify_product_id":"7879832469555","action":"created","activated":true,"published":true,"sampleOnly":false,"status":"ACTIVE","batch_id":"upload-am-2026-07-09T14-40-05-729Z","ts":"2026-07-09T14:40:53.211Z"}
 {"table":"thibaut_catalog","mfr_sku":"T20858","dw_sku":"DWTT-73901","shopify_product_id":"7879832502323","action":"created","activated":true,"published":true,"sampleOnly":false,"status":"ACTIVE","batch_id":"upload-am-2026-07-09T14-40-05-729Z","ts":"2026-07-09T14:40:56.822Z"}
+{"table":"designtex_catalog","mfr_sku":"6722101","dw_sku":"DWDX-220678","shopify_product_id":"7879841808435","action":"created","activated":false,"published":false,"sampleOnly":false,"status":"DRAFT","batch_id":"upload-am-2026-07-09T15-40-01-694Z","ts":"2026-07-09T15:40:05.239Z"}
+{"table":"designtex_catalog","mfr_sku":"6722103","dw_sku":"DWDX-220679","shopify_product_id":"7879841939507","action":"created","activated":false,"published":false,"sampleOnly":false,"status":"DRAFT","batch_id":"upload-am-2026-07-09T15-40-01-694Z","ts":"2026-07-09T15:40:07.322Z"}
+{"table":"newwall_catalog","mfr_sku":"1-WA-MEY-DI-MUL-XXX-004","dw_sku":"DWXW-1006072","shopify_product_id":"7879842136115","action":"created","activated":true,"published":true,"sampleOnly":false,"status":"ACTIVE","batch_id":"upload-am-2026-07-09T15-40-01-694Z","ts":"2026-07-09T15:40:11.699Z"}
+{"table":"newwall_catalog","mfr_sku":"1-WA-MON-DI-BLK-STR-004","dw_sku":"DWXW-1006073","shopify_product_id":"7879842365491","action":"created","activated":true,"published":true,"sampleOnly":false,"status":"ACTIVE","batch_id":"upload-am-2026-07-09T15-40-01-694Z","ts":"2026-07-09T15:40:15.113Z"}
+{"table":"newwall_catalog","mfr_sku":"1-WA-PAL-DI-W&A-XXX-004","dw_sku":"DWXW-1006074","shopify_product_id":"7879842594867","action":"created","activated":true,"published":true,"sampleOnly":false,"status":"ACTIVE","batch_id":"upload-am-2026-07-09T15-40-01-694Z","ts":"2026-07-09T15:40:18.472Z"}
+{"table":"brewster_catalog","mfr_sku":"2973-90504","dw_sku":"DWBR-171115","shopify_product_id":"7879842693171","action":"created","activated":true,"published":true,"sampleOnly":false,"status":"ACTIVE","batch_id":"upload-am-2026-07-09T15-40-01-694Z","ts":"2026-07-09T15:40:22.130Z"}
+{"table":"brewster_catalog","mfr_sku":"2973-90503","dw_sku":"DWBR-171116","shopify_product_id":"7879842725939","action":"created","activated":true,"published":true,"sampleOnly":false,"status":"ACTIVE","batch_id":"upload-am-2026-07-09T15-40-01-694Z","ts":"2026-07-09T15:40:25.686Z"}
+{"table":"brewster_catalog","mfr_sku":"2973-90502","dw_sku":"DWBR-171117","shopify_product_id":"7879842758707","action":"created","activated":true,"published":true,"sampleOnly":false,"status":"ACTIVE","batch_id":"upload-am-2026-07-09T15-40-01-694Z","ts":"2026-07-09T15:40:29.324Z"}
+{"table":"kravet_catalog","mfr_sku":"36981.106.0","dw_sku":"DWKK-103156","shopify_product_id":"7879842791475","action":"created","activated":true,"published":true,"sampleOnly":false,"status":"ACTIVE","batch_id":"upload-am-2026-07-09T15-40-01-694Z","ts":"2026-07-09T15:40:33.176Z"}
+{"table":"kravet_catalog","mfr_sku":"36981.1161.0","dw_sku":"DWKK-103157","shopify_product_id":"7879842824243","action":"created","activated":true,"published":true,"sampleOnly":false,"status":"ACTIVE","batch_id":"upload-am-2026-07-09T15-40-01-694Z","ts":"2026-07-09T15:40:36.749Z"}
+{"table":"kravet_catalog","mfr_sku":"36981.155.0","dw_sku":"DWKK-103158","shopify_product_id":"7879842857011","action":"created","activated":true,"published":true,"sampleOnly":false,"status":"ACTIVE","batch_id":"upload-am-2026-07-09T15-40-01-694Z","ts":"2026-07-09T15:40:40.157Z"}
+{"table":"schumacher_catalog","mfr_sku":"5012531","dw_sku":"DWLK-809650","shopify_product_id":"7879842889779","action":"created","activated":true,"published":true,"sampleOnly":false,"status":"ACTIVE","batch_id":"upload-am-2026-07-09T15-40-01-694Z","ts":"2026-07-09T15:40:43.703Z"}
+{"table":"schumacher_catalog","mfr_sku":"5012532","dw_sku":"DWLK-809660","shopify_product_id":"7879842922547","action":"created","activated":true,"published":true,"sampleOnly":false,"status":"ACTIVE","batch_id":"upload-am-2026-07-09T15-40-01-694Z","ts":"2026-07-09T15:40:47.399Z"}
+{"table":"schumacher_catalog","mfr_sku":"5012540","dw_sku":"DWLK-809670","shopify_product_id":"7879842955315","action":"created","activated":true,"published":true,"sampleOnly":false,"status":"ACTIVE","batch_id":"upload-am-2026-07-09T15-40-01-694Z","ts":"2026-07-09T15:40:51.138Z"}
+{"table":"quadrille_house_catalog","mfr_sku":"302609F","dw_sku":"DWQC-600437","shopify_product_id":"7879842988083","action":"created","activated":true,"published":true,"sampleOnly":true,"status":"ACTIVE","batch_id":"upload-am-2026-07-09T15-40-01-694Z","ts":"2026-07-09T15:40:54.565Z"}
+{"table":"quadrille_house_catalog","mfr_sku":"302760S-01","dw_sku":"DWQC-600438","shopify_product_id":"7879843053619","action":"created","activated":true,"published":true,"sampleOnly":true,"status":"ACTIVE","batch_id":"upload-am-2026-07-09T15-40-01-694Z","ts":"2026-07-09T15:40:57.829Z"}
+{"table":"quadrille_house_catalog","mfr_sku":"302760F-01CTS","dw_sku":"DWQC-600439","shopify_product_id":"7879843086387","action":"created","activated":true,"published":true,"sampleOnly":true,"status":"ACTIVE","batch_id":"upload-am-2026-07-09T15-40-01-694Z","ts":"2026-07-09T15:41:01.126Z"}

← 8a467c31 color-dot deep-link SHIPPED to live theme #144076931123; mem  ·  back to Designer Wallcoverings  ·  cadence: sample-only importer titles/describes Fabric lines 78f9bfbe →