[object Object]

← back to Dw Yolo Loop

Thibaut snapshot: 1903 products built + cleaned (-SAMPLE suffix), store_url prefers live handle

2f4b8ae0d9c4b832f71332265757e11bfe2c7ca4 · 2026-06-12 12:15:27 -0700 · Steve Abrams

- lines/thibaut.json (1903) + thibaut-handles.json; 0 vendor URLs leaked
- stripped -SAMPLE from 1031 sample-dominant mfr_skus (cosmetic Item code)
- build-line.js + server.js hardened for the same
- local smoke: house=DW, line=Thibaut, collection wired, 0 prices, 0 vendor refs

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

Files touched

Diff

commit 2f4b8ae0d9c4b832f71332265757e11bfe2c7ca4
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Fri Jun 12 12:15:27 2026 -0700

    Thibaut snapshot: 1903 products built + cleaned (-SAMPLE suffix), store_url prefers live handle
    
    - lines/thibaut.json (1903) + thibaut-handles.json; 0 vendor URLs leaked
    - stripped -SAMPLE from 1031 sample-dominant mfr_skus (cosmetic Item code)
    - build-line.js + server.js hardened for the same
    - local smoke: house=DW, line=Thibaut, collection wired, 0 prices, 0 vendor refs
    
    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---
 artmura-site/build-line.js | 2 +-
 artmura-site/server.js     | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/artmura-site/build-line.js b/artmura-site/build-line.js
index 808c06d..f7896c6 100644
--- a/artmura-site/build-line.js
+++ b/artmura-site/build-line.js
@@ -71,7 +71,7 @@ async function metafields(pid) {
     // main = highest-priced non-sample variant (never read the $4.25 sample as the price — see $4.25 policy)
     const nonSample = p.variants.filter(v => !isSample(v));
     const yard = nonSample.sort((a, b) => parseFloat(b.price) - parseFloat(a.price))[0] || p.variants[0];
-    const sku = (yard.sku || '').trim();
+    const sku = (yard.sku || '').trim().replace(/-sample$/i, '');   // sample-only products: drop the -SAMPLE suffix
     const tags = (p.tags || '').split(',').map(s => s.trim()).filter(Boolean);
     const baseTitle = p.title.replace(/\s*\|\s*[^|]+$/, '').replace(/\s+Wallcovering$/i, '');
     if (sku) handles[sku.toUpperCase()] = p.handle;
diff --git a/artmura-site/server.js b/artmura-site/server.js
index 0090b23..8a32001 100644
--- a/artmura-site/server.js
+++ b/artmura-site/server.js
@@ -41,7 +41,8 @@ function load() {
   CATALOG = d.products.map(r => {
     const imgs = localImages(r);
     const c = colors[r.mfr_sku] || {};
-    const liveHandle = handles[(r.mfr_sku || '').toUpperCase()] || null;
+    // build-line lines carry the live DW handle directly; Artmura maps newwall-sku → DW handle
+    const liveHandle = handles[(r.mfr_sku || '').toUpperCase()] || r.handle || null;
     return {
       store_url: liveHandle ? `${CFG.storeBase}/products/${liveHandle}` : CFG.storeBase,
       hex: c.hex || null, hue: c.hue ?? null, color_bucket: c.bucket || null,

← 584bf8a Vendor-landing template: generalize to any DW line + dw-vend  ·  back to Dw Yolo Loop  ·  clickthrough: data-agnostic count + optional book/color chec 9ab487d →