[object Object]

← back to Designer Wallcoverings

TK-10039: cadence-import (daily importer) writes specs to metafields + prose-only body; buildInput now migrates length+repeat metafields first (were body-only)

1fd642ef6b741ba5ebe6beff74a399738a1b6f51 · 2026-07-29 07:34:13 -0700 · Steve

Files touched

Diff

commit 1fd642ef6b741ba5ebe6beff74a399738a1b6f51
Author: Steve <steve@designerwallcoverings.com>
Date:   Wed Jul 29 07:34:13 2026 -0700

    TK-10039: cadence-import (daily importer) writes specs to metafields + prose-only body; buildInput now migrates length+repeat metafields first (were body-only)
---
 shopify/scripts/cadence/cadence-import.js | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/shopify/scripts/cadence/cadence-import.js b/shopify/scripts/cadence/cadence-import.js
index 4199afe2..ff31f3e1 100644
--- a/shopify/scripts/cadence/cadence-import.js
+++ b/shopify/scripts/cadence/cadence-import.js
@@ -507,7 +507,9 @@ function buildSampleOnlyInput(vendor, cfg, row, activate) {
   if (isFabric) intro = intro
     .replace(/Wallcoverings/g,'Fabrics').replace(/wallcoverings/g,'fabrics')
     .replace(/Wallcovering/g,'Fabric').replace(/wallcovering/g,'fabric');
-  const descriptionHtml = `<p>${intro}</p>${specs.length?`<ul>${specs.join('')}</ul>`:''}`;
+  // specs live in metafields (rendered by product-description-meta.liquid), NEVER a body list (TK-10039)
+  void specs;
+  const descriptionHtml = `<p>${intro}</p>`;
 
   // Metafields — NO cost (there is none). Width/specs where present, brand, sku, pattern, color.
   const mf=[]; const m=(ns,k,v,t)=>{ if(v!=null&&v!=='') mf.push({namespace:ns,key:k,type:t,value:String(v)}); };
@@ -655,6 +657,8 @@ function buildInput(vendor, cfg, row, retail, activate) {
   if (pattern){ m('global','pattern_name',pattern,SL); m('custom','pattern_name',pattern,SL); }
   if (color){ m('custom','color',color,SL); m('global','color',color,SL); m('dwc','color',color,SL); }
   if (row.material){ m('global','material',row.material,SL); m('custom','material',row.material,ML); }
+  if (row.roll_length){ m('global','length',row.roll_length,SL); }      // was only in the body <ul> — migrate to metafield (TK-10039)
+  if (row.pattern_repeat){ m('global','repeat',row.pattern_repeat,SL); } // was only in the body <ul> — migrate to metafield (TK-10039)
   if (row.collection) m('custom','collection_name',row.collection,SL);
   m('custom','cost',row.cost.toFixed(2),ND);                 // REAL cost
   m('custom','price_updated_at',TODAY,'date');                // 30-day refresh audit
@@ -677,7 +681,9 @@ function buildInput(vendor, cfg, row, retail, activate) {
   // banned-word/Unknown-clean title, and a sample variant. Anything incomplete
   // stays DRAFT and is TAGGED Needs-Specs / Needs-Description / Needs-Image so it's
   // fixable later — never a broken product on the storefront.
-  const descriptionHtml = `<p>${esc(intro)}</p><ul>${specs.join('')}</ul>`;
+  // specs live in metafields (rendered by product-description-meta.liquid), NEVER a body list (TK-10039)
+  void specs;
+  const descriptionHtml = `<p>${esc(intro)}</p>`;
   const gate = validateBeforeActivate({
     title, vendor, dwSku: row.dw_sku, descriptionHtml,   // vendor → INTERNAL guard (registry vendor never activates)
     specs:       { width: row.width, length: row.roll_length, repeat: row.pattern_repeat, material: row.material, unitOfMeasure: `Priced Per ${soldBy}` },

← c3c42f13 Coordinate by Color feature-launch CC draft: William Morris  ·  back to Designer Wallcoverings  ·  Coordinate by Color email: embed live how-to GIF (photo.desi 0fe5241f →