[object Object]

← back to Dw Unbuyable Recovery Pilot

TK-10978 Coordonné add-roll recovery tooling: 136 clean (mfr_sku join, sell at MSRP=price_retail, empirically matches live $169), dry-run

e430ce2e6ea4666cce0ace4496e42bc024db3cd7 · 2026-08-31 11:05:23 -0700 · Steve Abrams

Files touched

Diff

commit e430ce2e6ea4666cce0ace4496e42bc024db3cd7
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Mon Aug 31 11:05:23 2026 -0700

    TK-10978 Coordonné add-roll recovery tooling: 136 clean (mfr_sku join, sell at MSRP=price_retail, empirically matches live $169), dry-run
---
 tk10978-coordonne/build-plan.mjs     |   65 ++
 tk10978-coordonne/data/excluded.json |    1 +
 tk10978-coordonne/data/plan.json     | 1784 ++++++++++++++++++++++++++++++++++
 tk10978-coordonne/data/skips.json    |    1 +
 tk10978-coordonne/repair.mjs         |  124 +++
 tk10978-coordonne/rollback-all.mjs   |   27 +
 6 files changed, 2002 insertions(+)

diff --git a/tk10978-coordonne/build-plan.mjs b/tk10978-coordonne/build-plan.mjs
new file mode 100644
index 0000000..c89b0d4
--- /dev/null
+++ b/tk10978-coordonne/build-plan.mjs
@@ -0,0 +1,65 @@
+#!/usr/bin/env node
+// TK-10978 — Coordonné ADD-ROLL recovery plan builder (READ-ONLY).
+//
+// Coordonné "unbuyable" = ACTIVE product with a single $4.25 Sample variant and
+// no sellable variant. Recovery = ADD a "Sold Per Roll" variant priced by the
+// DW-STANDARD formula price_trade/0.65/0.85 (identical to the approved WG +
+// Scalamandre batches), keeping the $4.25 Sample untouched.
+//
+// IDENTITY: direct mfr_sku join to coordonne_catalog (price_trade>0). This is an
+// EXACT identity match (not Scalamandre's content-match), so matchOk=true by
+// construction. rollSku = variant_sku with the trailing '-Sample' stripped.
+//
+// HARD EXCLUSIONS: no price_trade>0 catalog row; missing/!-Sample variant_sku;
+// retail out of sane range (10 < r < 10000). No writes — psql read-only.
+import { writeFileSync, mkdirSync } from 'node:fs';
+import { execSync } from 'node:child_process';
+
+const HERE = new URL('.', import.meta.url).pathname;
+mkdirSync(`${HERE}data`, { recursive: true });
+
+const SQL = `
+BEGIN READ ONLY;
+SELECT json_agg(t) FROM (
+  SELECT DISTINCT ON (sp.shopify_id)
+    regexp_replace(sp.shopify_id, '.*/', '') AS pid,
+    sp.title, sp.variant_sku AS sample_sku, sp.mfr_sku,
+    c.dw_sku AS catalog_dw_sku, c.pattern_name, c.color_name,
+    
+    c.price_retail AS roll_retail
+  FROM shopify_products sp
+  JOIN coordonne_catalog c ON upper(c.mfr_sku)=upper(sp.mfr_sku)
+  WHERE sp.vendor='Coordonné' AND sp.status='ACTIVE'
+    AND NOT coalesce(sp.has_product_variant,false)
+    AND sp.variant_sku ILIKE '%-Sample'
+    AND c.price_retail > 0
+  ORDER BY sp.shopify_id, c.price_retail DESC
+) t;
+ROLLBACK;
+`;
+const out = execSync('psql -h /tmp -d dw_unified -tA -v ON_ERROR_STOP=1', { input: SQL, encoding: 'utf8', maxBuffer: 64*1024*1024 });
+const _s=out.slice(out.indexOf('['), out.lastIndexOf(']')+1); const rows = _s ? JSON.parse(_s) : [];
+
+const plan = [], excluded = [];
+for (const r of rows) {
+  const rollRetail = Number(r.roll_retail);
+  if (!(rollRetail > 10 && rollRetail < 10000)) { excluded.push({ pid:r.pid, title:r.title, reason:`retail_range ${rollRetail}` }); continue; }
+  const rollSku = String(r.sample_sku).replace(/-Sample$/i, '');
+  plan.push({
+    pid: r.pid, title: r.title,
+    sampleSku: r.sample_sku, rollSku,
+    catalog_dw_sku: r.catalog_dw_sku, mfr_sku: r.mfr_sku,
+    price_trade: null, rollRetail,
+    cat_pattern: r.pattern_name, cat_color: r.color_name,
+    matchOk: true,            // direct mfr_sku identity join
+  });
+}
+const report = { ticket:'TK-10978', vendor:'Coordonné', generated_at:new Date().toISOString(),
+  mode:'READ-ONLY plan builder', formula:'price_retail (sell at MSRP — empirically matches live buyable $169=max MSRP)',
+  raw_rows:rows.length, clean_actionable:plan.length, excluded:excluded.length,
+  retail_min: plan.length?Math.min(...plan.map(p=>p.rollRetail)):null,
+  retail_max: plan.length?Math.max(...plan.map(p=>p.rollRetail)):null };
+console.log(JSON.stringify(report,null,2));
+writeFileSync(`${HERE}data/plan.json`, JSON.stringify({ report, plan }, null, 2));
+writeFileSync(`${HERE}data/excluded.json`, JSON.stringify(excluded, null, 2));
+console.log(`\nplan.json: ${plan.length} products; excluded: ${excluded.length}`);
diff --git a/tk10978-coordonne/data/excluded.json b/tk10978-coordonne/data/excluded.json
new file mode 100644
index 0000000..0637a08
--- /dev/null
+++ b/tk10978-coordonne/data/excluded.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/tk10978-coordonne/data/plan.json b/tk10978-coordonne/data/plan.json
new file mode 100644
index 0000000..d28fd29
--- /dev/null
+++ b/tk10978-coordonne/data/plan.json
@@ -0,0 +1,1784 @@
+{
+  "report": {
+    "ticket": "TK-10978",
+    "vendor": "Coordonné",
+    "generated_at": "2026-08-31T18:04:24.956Z",
+    "mode": "READ-ONLY plan builder",
+    "formula": "price_retail (sell at MSRP — empirically matches live buyable $169=max MSRP)",
+    "raw_rows": 136,
+    "clean_actionable": 136,
+    "excluded": 0,
+    "retail_min": 74.82,
+    "retail_max": 169
+  },
+  "plan": [
+    {
+      "pid": "1502414012528",
+      "title": "Jungle Toile | Coordone Europe",
+      "sampleSku": "COR-23034-sample",
+      "rollSku": "COR-23034",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900076",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Tipsy love Azul",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502417748080",
+      "title": "Serenity Scenic Lake | Coordone Europe",
+      "sampleSku": "COR-23050-sample",
+      "rollSku": "COR-23050",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6300081",
+      "price_trade": null,
+      "rollRetail": 113.64,
+      "cat_pattern": "Tempo &#8211; Palazzo",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502417977456",
+      "title": "Serenity Scenic Lake | Coordone Europe",
+      "sampleSku": "COR-23051-sample",
+      "rollSku": "COR-23051",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6300081",
+      "price_trade": null,
+      "rollRetail": 113.64,
+      "cat_pattern": "Tempo &#8211; Palazzo",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502418468976",
+      "title": "Palm Paradise | Coordone Europe",
+      "sampleSku": "COR-23053-sample",
+      "rollSku": "COR-23053",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6300082",
+      "price_trade": null,
+      "rollRetail": 113.64,
+      "cat_pattern": "Tempo &#8211; Alma",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502418829424",
+      "title": "Dancers | Coordone Europe",
+      "sampleSku": "COR-23054-sample",
+      "rollSku": "COR-23054",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500019",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Ballerinas",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502419452016",
+      "title": "Swimmers | Coordone Europe",
+      "sampleSku": "COR-23056-sample",
+      "rollSku": "COR-23056",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500020",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Swimmers",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502420861040",
+      "title": "Aged Maps | Coordone Europe",
+      "sampleSku": "COR-23061-sample",
+      "rollSku": "COR-23061",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500108",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Newspaper map Black",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502421188720",
+      "title": "Arego Aspen Trees | Coordone Europe",
+      "sampleSku": "COR-23062-sample",
+      "rollSku": "COR-23062",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500201",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Broken forest Black",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502421516400",
+      "title": "Arego Aspen Trees | Coordone Europe",
+      "sampleSku": "COR-23063-sample",
+      "rollSku": "COR-23063",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500201",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Broken forest Black",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502421778544",
+      "title": "Manta Mountain Resort | Coordone Europe",
+      "sampleSku": "COR-23064-sample",
+      "rollSku": "COR-23064",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500203",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Old landscape",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502422237296",
+      "title": "Manta Mountain Resort | Coordone Europe",
+      "sampleSku": "COR-23065-sample",
+      "rollSku": "COR-23065",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500203",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Old landscape",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502422433904",
+      "title": "Under the Ocean | Coordone Europe",
+      "sampleSku": "COR-23066-sample",
+      "rollSku": "COR-23066",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500205",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Underwater",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502422761584",
+      "title": "Under the Ocean | Coordone Europe",
+      "sampleSku": "COR-23067-sample",
+      "rollSku": "COR-23067",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500205",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Underwater",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502423056496",
+      "title": "Misty Forest | Coordone Europe",
+      "sampleSku": "COR-23068-sample",
+      "rollSku": "COR-23068",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500208",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Woods summer path",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502423613552",
+      "title": "Brick on the Wall | Coordone Europe",
+      "sampleSku": "COR-23070-sample",
+      "rollSku": "COR-23070",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500212",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Skyscraper Window",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502423842928",
+      "title": "Window Watching in the City | Coordone Europe",
+      "sampleSku": "COR-23071-sample",
+      "rollSku": "COR-23071",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500212",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Skyscraper Window",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502424367216",
+      "title": "Subtle Branches | Coordone Europe",
+      "sampleSku": "COR-23073-sample",
+      "rollSku": "COR-23073",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500305",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Blossom almond tree Grey",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502424498288",
+      "title": "Subtle Branches | Coordone Europe",
+      "sampleSku": "COR-23074-sample",
+      "rollSku": "COR-23074",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500306",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Blossom almond tree Pink",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502424760432",
+      "title": "Subtle Branches | Coordone Europe",
+      "sampleSku": "COR-23075-sample",
+      "rollSku": "COR-23075",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500306",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Blossom almond tree Pink",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502425579632",
+      "title": "Arabian Rug | Coordone Europe",
+      "sampleSku": "COR-23078-sample",
+      "rollSku": "COR-23078",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500316",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Floral rug Blue",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502425809008",
+      "title": "Open Basket Weave | Coordone Europe",
+      "sampleSku": "COR-23079-sample",
+      "rollSku": "COR-23079",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500320",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Palm tree frame Grey",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502426038384",
+      "title": "Open Basket Weave | Coordone Europe",
+      "sampleSku": "COR-23080-sample",
+      "rollSku": "COR-23080",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500321",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Palm tree frame Sepia",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502426431600",
+      "title": "Arnot Aged Ceiling Detail | Coordone Europe",
+      "sampleSku": "COR-23081-sample",
+      "rollSku": "COR-23081",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500401",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Broken ceiling Grey",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502426693744",
+      "title": "Arnot Aged Ceiling Detail | Coordone Europe",
+      "sampleSku": "COR-23082-sample",
+      "rollSku": "COR-23082",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500401",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Broken ceiling Grey",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502426955888",
+      "title": "Biala Aging Walls | Coordone Europe",
+      "sampleSku": "COR-23083-sample",
+      "rollSku": "COR-23083",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500402",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Broken ceiling White",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502427185264",
+      "title": "Biala Aging Walls | Coordone Europe",
+      "sampleSku": "COR-23084-sample",
+      "rollSku": "COR-23084",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500402",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Broken ceiling White",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502427349104",
+      "title": "Barnyard Shutters | Coordone Europe",
+      "sampleSku": "COR-23085-sample",
+      "rollSku": "COR-23085",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500405",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Doors wall",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502427578480",
+      "title": "Barnyard Shutters | Coordone Europe",
+      "sampleSku": "COR-23086-sample",
+      "rollSku": "COR-23086",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500405",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Doors wall",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502428299376",
+      "title": "Aged Wood Walls | Coordone Europe",
+      "sampleSku": "COR-23089-sample",
+      "rollSku": "COR-23089",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500408",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Wooden wall Natural",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502428528752",
+      "title": "Elephants in the Jungle | Coordone Europe",
+      "sampleSku": "COR-23090-sample",
+      "rollSku": "COR-23090",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500506",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Elephants",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502428823664",
+      "title": "Elephants in the Jungle | Coordone Europe",
+      "sampleSku": "COR-23091-sample",
+      "rollSku": "COR-23091",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500506",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Elephants",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502429151344",
+      "title": "Misty Waters in East Asia | Coordone Europe",
+      "sampleSku": "COR-23092-sample",
+      "rollSku": "COR-23092",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500508",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Sumi",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502429413488",
+      "title": "Misty Waters in East Asia | Coordone Europe",
+      "sampleSku": "COR-23093-sample",
+      "rollSku": "COR-23093",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500508",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Sumi",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502429642864",
+      "title": "White Book Shelves | Coordone Europe",
+      "sampleSku": "COR-23094-sample",
+      "rollSku": "COR-23094",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500703",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Shelving",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502430462064",
+      "title": "Sacks of Coffee Beans | Coordone Europe",
+      "sampleSku": "COR-23097-sample",
+      "rollSku": "COR-23097",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500801",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Sacks",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502430855280",
+      "title": "Sacks of Coffee Beans | Coordone Europe",
+      "sampleSku": "COR-23098-sample",
+      "rollSku": "COR-23098",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500801",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Sacks",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502431117424",
+      "title": "Faux Burlap Coffee Sack | Coordone Europe",
+      "sampleSku": "COR-23099-sample",
+      "rollSku": "COR-23099",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500803",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Sacking White",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502431510640",
+      "title": "Faux Burlap Coffee Sack | Coordone Europe",
+      "sampleSku": "COR-23100-sample",
+      "rollSku": "COR-23100",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500803",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Sacking White",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502432034928",
+      "title": "Faux Burlap Coffee Sack | Coordone Europe",
+      "sampleSku": "COR-23101-sample",
+      "rollSku": "COR-23101",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6500804",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Sacking Natural",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502437343344",
+      "title": "Juko Japanese Waves | Coordone Europe",
+      "sampleSku": "COR-23106-sample",
+      "rollSku": "COR-23106",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6600002",
+      "price_trade": null,
+      "rollRetail": 74.82,
+      "cat_pattern": "Core &#8211; Auguste Aqua",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502437802096",
+      "title": "Juko Japanese Waves | Coordone Europe",
+      "sampleSku": "COR-23107-sample",
+      "rollSku": "COR-23107",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6600003",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Core &#8211; Auguste Gold",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502438293616",
+      "title": "Juko Japanese Waves | Coordone Europe",
+      "sampleSku": "COR-23108-sample",
+      "rollSku": "COR-23108",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6600004",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Core &#8211; Auguste Silver",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502438948976",
+      "title": "Juko Japanese Waves | Coordone Europe",
+      "sampleSku": "COR-23109-sample",
+      "rollSku": "COR-23109",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6600005",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Core &#8211; Auguste Forest",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502445240432",
+      "title": "Branches in the Wind | Coordone Europe",
+      "sampleSku": "COR-23123-sample",
+      "rollSku": "COR-23123",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6600085",
+      "price_trade": null,
+      "rollRetail": 113.62,
+      "cat_pattern": "Core &#8211; Eolia Winter",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502445633648",
+      "title": "Peony Pinstripes | Coordone Europe",
+      "sampleSku": "COR-23124-sample",
+      "rollSku": "COR-23124",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6600086",
+      "price_trade": null,
+      "rollRetail": 113.62,
+      "cat_pattern": "Core &#8211; Eolia Autumn",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502446125168",
+      "title": "Peony Pinstripes | Coordone Europe",
+      "sampleSku": "COR-23125-sample",
+      "rollSku": "COR-23125",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6600086",
+      "price_trade": null,
+      "rollRetail": 113.62,
+      "cat_pattern": "Core &#8211; Eolia Autumn",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502446551152",
+      "title": "Peony Pinstripes | Coordone Europe",
+      "sampleSku": "COR-23126-sample",
+      "rollSku": "COR-23126",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6600086",
+      "price_trade": null,
+      "rollRetail": 113.62,
+      "cat_pattern": "Core &#8211; Eolia Autumn",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502447009904",
+      "title": "Peony Pinstripes | Coordone Europe",
+      "sampleSku": "COR-23127-sample",
+      "rollSku": "COR-23127",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6600087",
+      "price_trade": null,
+      "rollRetail": 113.62,
+      "cat_pattern": "Core &#8211; Eolia Spring",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502447403120",
+      "title": "Peony Pinstripes | Coordone Europe",
+      "sampleSku": "COR-23128-sample",
+      "rollSku": "COR-23128",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6600087",
+      "price_trade": null,
+      "rollRetail": 113.62,
+      "cat_pattern": "Core &#8211; Eolia Spring",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502448550000",
+      "title": "Chinoiserie Garden | Coordone Europe",
+      "sampleSku": "COR-23131-sample",
+      "rollSku": "COR-23131",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6600091",
+      "price_trade": null,
+      "rollRetail": 113.62,
+      "cat_pattern": "Core &#8211; Edo Gold",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502448877680",
+      "title": "Floating Ombre | Coordone Europe",
+      "sampleSku": "COR-23132-sample",
+      "rollSku": "COR-23132",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800104",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Mark Sea",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502449107056",
+      "title": "Floating Ombre | Coordone Europe",
+      "sampleSku": "COR-23133-sample",
+      "rollSku": "COR-23133",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800104",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Mark Sea",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502449467504",
+      "title": "Painted Pollack Splatter | Coordone Europe",
+      "sampleSku": "COR-23134-sample",
+      "rollSku": "COR-23134",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800111",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Jackson Black",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502449762416",
+      "title": "Painted Pollack Splatter | Coordone Europe",
+      "sampleSku": "COR-23135-sample",
+      "rollSku": "COR-23135",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800111",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Jackson Black",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502450221168",
+      "title": "Amore Mondrian Geometric | Coordone Europe",
+      "sampleSku": "COR-23137-sample",
+      "rollSku": "COR-23137",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800113",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Pierre RGB 1",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502450516080",
+      "title": "Bella Mondrian Geometric | Coordone Europe",
+      "sampleSku": "COR-23138-sample",
+      "rollSku": "COR-23138",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800113",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Pierre RGB 1",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502450712688",
+      "title": "Bella Mondrian Geometric | Coordone Europe",
+      "sampleSku": "COR-23139-sample",
+      "rollSku": "COR-23139",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800114",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Pierre RGB 2",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502451826800",
+      "title": "Georgi Gold and Black Geometric | Coordone Europe",
+      "sampleSku": "COR-23143-sample",
+      "rollSku": "COR-23143",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800207",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "L Geometric Dark Blue",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502452187248",
+      "title": "Georgi Gold and Black Geometric | Coordone Europe",
+      "sampleSku": "COR-23144-sample",
+      "rollSku": "COR-23144",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800207",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "L Geometric Dark Blue",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502452318320",
+      "title": "Georgi Gold and Black Geometric | Coordone Europe",
+      "sampleSku": "COR-23145-sample",
+      "rollSku": "COR-23145",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800207",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "L Geometric Dark Blue",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502452580464",
+      "title": "Georgi Gold and Black Geometric | Coordone Europe",
+      "sampleSku": "COR-23146-sample",
+      "rollSku": "COR-23146",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800209",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "L Geometric Black",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502453366896",
+      "title": "Muted Maps | Coordone Europe",
+      "sampleSku": "COR-23149-sample",
+      "rollSku": "COR-23149",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800301",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Urban Map Black",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502453596272",
+      "title": "Muted Maps | Coordone Europe",
+      "sampleSku": "COR-23150-sample",
+      "rollSku": "COR-23150",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800301",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Urban Map Black",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502453923952",
+      "title": "Muted Maps | Coordone Europe",
+      "sampleSku": "COR-23151-sample",
+      "rollSku": "COR-23151",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800302",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Urban Map White",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502454120560",
+      "title": "Muted Maps | Coordone Europe",
+      "sampleSku": "COR-23152-sample",
+      "rollSku": "COR-23152",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800302",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Urban Map White",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502457036912",
+      "title": "Pia Pizante Palm Leaves | Coordone Europe",
+      "sampleSku": "COR-23163-sample",
+      "rollSku": "COR-23163",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800401",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Palms Gold",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502457200752",
+      "title": "Pia Pizante Palm Leaves | Coordone Europe",
+      "sampleSku": "COR-23164-sample",
+      "rollSku": "COR-23164",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800401",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Palms Gold",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502457593968",
+      "title": "Pia Pizante Palm Leaves | Coordone Europe",
+      "sampleSku": "COR-23165-sample",
+      "rollSku": "COR-23165",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800402",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Palms Fresh",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502458019952",
+      "title": "Pia Pizante Palm Leaves | Coordone Europe",
+      "sampleSku": "COR-23166-sample",
+      "rollSku": "COR-23166",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800402",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Palms Fresh",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502458347632",
+      "title": "Pia Pizante Palm Leaves | Coordone Europe",
+      "sampleSku": "COR-23167-sample",
+      "rollSku": "COR-23167",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800402",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Palms Fresh",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502458544240",
+      "title": "Pia Pizante Palm Leaves | Coordone Europe",
+      "sampleSku": "COR-23168-sample",
+      "rollSku": "COR-23168",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800403",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Palms Campo",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502459134064",
+      "title": "La Scalina Flowers | Coordone Europe",
+      "sampleSku": "COR-23170-sample",
+      "rollSku": "COR-23170",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800411",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Gigant Flora Light Blue",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502459363440",
+      "title": "La Scalina Flowers | Coordone Europe",
+      "sampleSku": "COR-23171-sample",
+      "rollSku": "COR-23171",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800411",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Gigant Flora Light Blue",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502459592816",
+      "title": "La Scalina Flowers | Coordone Europe",
+      "sampleSku": "COR-23172-sample",
+      "rollSku": "COR-23172",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800412",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Gigant Flora Rose",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502459822192",
+      "title": "La Scalina Flowers | Coordone Europe",
+      "sampleSku": "COR-23173-sample",
+      "rollSku": "COR-23173",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800412",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Gigant Flora Rose",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502460051568",
+      "title": "La Porta Paneling | Coordone Europe",
+      "sampleSku": "COR-23174-sample",
+      "rollSku": "COR-23174",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800501",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Moulding Original",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502460248176",
+      "title": "La Porta Paneling | Coordone Europe",
+      "sampleSku": "COR-23175-sample",
+      "rollSku": "COR-23175",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800501",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Moulding Original",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502460936304",
+      "title": "Liadante Files Drawers | Coordone Europe",
+      "sampleSku": "COR-23178-sample",
+      "rollSku": "COR-23178",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800508",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Drawers Wood",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502461100144",
+      "title": "Liadante Files Drawers | Coordone Europe",
+      "sampleSku": "COR-23179-sample",
+      "rollSku": "COR-23179",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800508",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Drawers Wood",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502461362288",
+      "title": "Liadante Files Drawers | Coordone Europe",
+      "sampleSku": "COR-23180-sample",
+      "rollSku": "COR-23180",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800509",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Drawers White",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502461591664",
+      "title": "Screens Watching the Mountains | Coordone Europe",
+      "sampleSku": "COR-23181-sample",
+      "rollSku": "COR-23181",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800510",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "New Japanese Window Sunrise",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502461853808",
+      "title": "Screens Watching the Mountains | Coordone Europe",
+      "sampleSku": "COR-23182-sample",
+      "rollSku": "COR-23182",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800510",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "New Japanese Window Sunrise",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502462148720",
+      "title": "Rigato Windows | Coordone Europe",
+      "sampleSku": "COR-23183-sample",
+      "rollSku": "COR-23183",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800511",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "New Japanese Window Twilight",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502463066224",
+      "title": "Ancient Chinese Village | Coordone Europe",
+      "sampleSku": "COR-23187-sample",
+      "rollSku": "COR-23187",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800607",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Illustration Tiles Indigo",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502463295600",
+      "title": "Lina Brick Walls | Coordone Europe",
+      "sampleSku": "COR-23188-sample",
+      "rollSku": "COR-23188",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800616",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Bricks Indigo",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502463459440",
+      "title": "Lina Brick Walls | Coordone Europe",
+      "sampleSku": "COR-23189-sample",
+      "rollSku": "COR-23189",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800616",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Bricks Indigo",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502463885424",
+      "title": "Lina Brick Walls | Coordone Europe",
+      "sampleSku": "COR-23190-sample",
+      "rollSku": "COR-23190",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800617",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Bricks Emerald",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502464147568",
+      "title": "Lina Brick Walls | Coordone Europe",
+      "sampleSku": "COR-23191-sample",
+      "rollSku": "COR-23191",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800618",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Bricks White",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502464409712",
+      "title": "Lina Brick Walls | Coordone Europe",
+      "sampleSku": "COR-23192-sample",
+      "rollSku": "COR-23192",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800619",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Bricks Brick",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502464737392",
+      "title": "Leonardo Aged Damask in Time | Coordone Europe",
+      "sampleSku": "COR-23193-sample",
+      "rollSku": "COR-23193",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800623",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Brocade Gold",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502464934000",
+      "title": "Leonardo Aged Damask in Time | Coordone Europe",
+      "sampleSku": "COR-23194-sample",
+      "rollSku": "COR-23194",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800623",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Brocade Gold",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502465523824",
+      "title": "Waves of the East | Coordone Europe",
+      "sampleSku": "COR-23196-sample",
+      "rollSku": "COR-23196",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800706",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Waves Papyrus",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502465785968",
+      "title": "Waves of the East | Coordone Europe",
+      "sampleSku": "COR-23197-sample",
+      "rollSku": "COR-23197",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800706",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Waves Papyrus",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502466080880",
+      "title": "Waves of the East | Coordone Europe",
+      "sampleSku": "COR-23198-sample",
+      "rollSku": "COR-23198",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800707",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Waves Dark Blue",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502466277488",
+      "title": "Florence Frames | Coordone Europe",
+      "sampleSku": "COR-23199-sample",
+      "rollSku": "COR-23199",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800709",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Frames White",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502466506864",
+      "title": "Florence Frames | Coordone Europe",
+      "sampleSku": "COR-23200-sample",
+      "rollSku": "COR-23200",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800709",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Frames White",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502466769008",
+      "title": "Florence Frames | Coordone Europe",
+      "sampleSku": "COR-23201-sample",
+      "rollSku": "COR-23201",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800710",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Frames Gold",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502468112496",
+      "title": "Under the Giving Tree | Coordone Europe",
+      "sampleSku": "COR-23207-sample",
+      "rollSku": "COR-23207",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800725",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Cora Fresh",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502468472944",
+      "title": "Under the Giving Tree | Coordone Europe",
+      "sampleSku": "COR-23208-sample",
+      "rollSku": "COR-23208",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800725",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Cora Fresh",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502469488752",
+      "title": "Under the Giving Tree | Coordone Europe",
+      "sampleSku": "COR-23212-sample",
+      "rollSku": "COR-23212",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800727",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Cora Dark Blue",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502469619824",
+      "title": "Arika Flower Garden | Coordone Europe",
+      "sampleSku": "COR-23213-sample",
+      "rollSku": "COR-23213",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800732",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Chinoiserie 2.0 Blue",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502469849200",
+      "title": "Arika Flower Garden | Coordone Europe",
+      "sampleSku": "COR-23214-sample",
+      "rollSku": "COR-23214",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800732",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Chinoiserie 2.0 Blue",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502470111344",
+      "title": "Arika Flower Garden | Coordone Europe",
+      "sampleSku": "COR-23215-sample",
+      "rollSku": "COR-23215",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800732",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Chinoiserie 2.0 Blue",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502472077424",
+      "title": "Arika Flower Garden | Coordone Europe",
+      "sampleSku": "COR-23216-sample",
+      "rollSku": "COR-23216",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800733",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Chinoiserie 2.0 Emerald",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502472634480",
+      "title": "Arika Flower Garden | Coordone Europe",
+      "sampleSku": "COR-23217-sample",
+      "rollSku": "COR-23217",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800734",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Chinoiserie 2.0 Wine",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502473027696",
+      "title": "Arika Flower Garden | Coordone Europe",
+      "sampleSku": "COR-23218-sample",
+      "rollSku": "COR-23218",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800734",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Chinoiserie 2.0 Wine",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502473322608",
+      "title": "Arika Flower Garden | Coordone Europe",
+      "sampleSku": "COR-23219-sample",
+      "rollSku": "COR-23219",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800735",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Chinoiserie 2.0 Wood",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502473617520",
+      "title": "Arika Flower Garden | Coordone Europe",
+      "sampleSku": "COR-23220-sample",
+      "rollSku": "COR-23220",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6800735",
+      "price_trade": null,
+      "rollRetail": 95,
+      "cat_pattern": "Chinoiserie 2.0 Wood",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502476632176",
+      "title": "Hula Time | Coordone Europe",
+      "sampleSku": "COR-23228-sample",
+      "rollSku": "COR-23228",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900073",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Calypso dancers Hueso",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502477222000",
+      "title": "Hula Time | Coordone Europe",
+      "sampleSku": "COR-23230-sample",
+      "rollSku": "COR-23230",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900074",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Calypso dancers Negro",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502477451376",
+      "title": "Hula Time | Coordone Europe",
+      "sampleSku": "COR-23231-sample",
+      "rollSku": "COR-23231",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900074",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Calypso dancers Negro",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502477680752",
+      "title": "Hula Time | Coordone Europe",
+      "sampleSku": "COR-23232-sample",
+      "rollSku": "COR-23232",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900078",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Calypso dancers Verde",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502477975664",
+      "title": "Hula Time | Coordone Europe",
+      "sampleSku": "COR-23233-sample",
+      "rollSku": "COR-23233",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900078",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Calypso dancers Verde",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502490984560",
+      "title": "Ducks in Flight  - El Baile | Coordone Europe",
+      "sampleSku": "COR-23267-sample",
+      "rollSku": "COR-23267",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900003",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "El baile del pato Beige",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502491312240",
+      "title": "Ducks in Flight  - El Baile | Coordone Europe",
+      "sampleSku": "COR-23268-sample",
+      "rollSku": "COR-23268",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900004",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "El baile del pato Azul",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502491705456",
+      "title": "Ducks in Flight  - El Baile | Coordone Europe",
+      "sampleSku": "COR-23269-sample",
+      "rollSku": "COR-23269",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900004",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "El baile del pato Azul",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502492033136",
+      "title": "Ducks in Flight  - El Baile | Coordone Europe",
+      "sampleSku": "COR-23270-sample",
+      "rollSku": "COR-23270",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900005",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "El baile del pato Piedra",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502492393584",
+      "title": "Ducks in Flight  - El Baile | Coordone Europe",
+      "sampleSku": "COR-23271-sample",
+      "rollSku": "COR-23271",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900005",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "El baile del pato Piedra",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502492983408",
+      "title": "Santa Bella Storks | Coordone Europe",
+      "sampleSku": "COR-23273-sample",
+      "rollSku": "COR-23273",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900000",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Grullas de papel Granate",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502493245552",
+      "title": "Santa Bella Storks | Coordone Europe",
+      "sampleSku": "COR-23274-sample",
+      "rollSku": "COR-23274",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900000",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Grullas de papel Granate",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502493507696",
+      "title": "Santa Bella Storks | Coordone Europe",
+      "sampleSku": "COR-23275-sample",
+      "rollSku": "COR-23275",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900001",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Grullas de papel Rojo",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502493999216",
+      "title": "Santa Bella Storks | Coordone Europe",
+      "sampleSku": "COR-23276-sample",
+      "rollSku": "COR-23276",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900001",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Grullas de papel Rojo",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502494720112",
+      "title": "Santa Bella Storks | Coordone Europe",
+      "sampleSku": "COR-23277-sample",
+      "rollSku": "COR-23277",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900002",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Grullas de papel Azul",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502495015024",
+      "title": "Santa Bella Storks | Coordone Europe",
+      "sampleSku": "COR-23278-sample",
+      "rollSku": "COR-23278",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900002",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Grullas de papel Azul",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502495965296",
+      "title": "Akaniko Geometric | Coordone Europe",
+      "sampleSku": "COR-23281-sample",
+      "rollSku": "COR-23281",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900065",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "IkeyaSeki Rosa",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502496227440",
+      "title": "Jelly Fish | Coordone Europe",
+      "sampleSku": "COR-23282-sample",
+      "rollSku": "COR-23282",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900065",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "IkeyaSeki Rosa",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502498291824",
+      "title": "Love Cherubs Kissing the Sky with Bows | Coordone Europe",
+      "sampleSku": "COR-23289-sample",
+      "rollSku": "COR-23289",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900070",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Kissing the sky Hueso",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502498521200",
+      "title": "Love Cherubs Kissing the Sky with Bows | Coordone Europe",
+      "sampleSku": "COR-23290-sample",
+      "rollSku": "COR-23290",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900070",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Kissing the sky Hueso",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502498848880",
+      "title": "Love Cherubs Kissing the Sky with Bows | Coordone Europe",
+      "sampleSku": "COR-23291-sample",
+      "rollSku": "COR-23291",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900071",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Kissing the sky Rosa",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502499143792",
+      "title": "Love Cherubs Kissing the Sky with Bows | Coordone Europe",
+      "sampleSku": "COR-23292-sample",
+      "rollSku": "COR-23292",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900071",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Kissing the sky Rosa",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502504681584",
+      "title": "Pastel Paraisos - Palm Leaves | Coordone Europe",
+      "sampleSku": "COR-23309-sample",
+      "rollSku": "COR-23309",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900009",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Paraísos artificiales Blanco",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502505107568",
+      "title": "Pastel Paraisos - Palm Leaves | Coordone Europe",
+      "sampleSku": "COR-23310-sample",
+      "rollSku": "COR-23310",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900009",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Paraísos artificiales Blanco",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502509990000",
+      "title": "Love Chid Toile | Coordone Europe",
+      "sampleSku": "COR-23324-sample",
+      "rollSku": "COR-23324",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900075",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Tipsy love Negro",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502510350448",
+      "title": "Love Chid Toile | Coordone Europe",
+      "sampleSku": "COR-23325-sample",
+      "rollSku": "COR-23325",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900075",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Tipsy love Negro",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502510776432",
+      "title": "Love Chid Toile | Coordone Europe",
+      "sampleSku": "COR-23326-sample",
+      "rollSku": "COR-23326",
+      "catalog_dw_sku": null,
+      "mfr_sku": "5900076",
+      "price_trade": null,
+      "rollRetail": 169,
+      "cat_pattern": "Tipsy love Azul",
+      "cat_color": null,
+      "matchOk": true
+    },
+    {
+      "pid": "1502511202416",
+      "title": "Cordonne Spain | Coordone Europe",
+      "sampleSku": "COR-23327-sample",
+      "rollSku": "COR-23327",
+      "catalog_dw_sku": null,
+      "mfr_sku": "6600091",
+      "price_trade": null,
+      "rollRetail": 113.62,
+      "cat_pattern": "Core &#8211; Edo Gold",
+      "cat_color": null,
+      "matchOk": true
+    }
+  ]
+}
\ No newline at end of file
diff --git a/tk10978-coordonne/data/skips.json b/tk10978-coordonne/data/skips.json
new file mode 100644
index 0000000..0637a08
--- /dev/null
+++ b/tk10978-coordonne/data/skips.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/tk10978-coordonne/repair.mjs b/tk10978-coordonne/repair.mjs
new file mode 100644
index 0000000..f27db5c
--- /dev/null
+++ b/tk10978-coordonne/repair.mjs
@@ -0,0 +1,124 @@
+#!/usr/bin/env node
+// TK-10978 — Scalamandre ADD-ROLL recovery (customer-facing Shopify write).
+//
+// Scalamandre "unbuyable" products are GENUINELY sample-only: a single variant
+// option1='Sample' @ $4.25 (live-confirmed 3/3, then again here per product).
+// Recovery = ADD a sellable "Sold Per Roll" variant at reconciled retail, and
+// LEAVE the $4.25 Sample untouched. (Distinct from the WG RR-defect, which
+// RELABELED a mispriced lone Sample. Here we ADD — we never touch the sample.)
+//
+// VERIFY-BEFORE-ACT (per product, live, at write time — never trust the plan):
+//   1. GET product live; must be exactly 1 variant.
+//   2. lone variant option1 == 'Sample' (case-insensitive).
+//   3. lone variant price <= 4.50 (genuine sample; NOT the RR-defect).
+//   4. lone variant SKU == expected sampleSku from the plan (right product).
+//   5. derived rollSku not already present as any variant SKU (idempotent / no double-add).
+//   6. match sanity: plan row's matchOk true (title pattern+color == catalog).
+//   7. SANITY-RANGE on retail: 10 < rollRetail < 10000 (guard NULL/decimal mispricing).
+// Any guard fail -> SKIP + log; never a partial/ambiguous write.
+//
+// Recovery action: POST a new variant {option1:'Sold Per Roll', price:rollRetail,
+//   sku:rollSku, inventory_policy:'deny', inventory_management:'shopify'}.
+// Reversibility FIRST: prestate.jsonl written BEFORE the write; undo = DELETE the
+//   added roll variant (the sample is untouched). Ledgered per product.
+//
+// Usage: node repair.mjs [--only=<pid>] [--limit=N] [--live]   default = dry-run.
+import { readFileSync, appendFileSync, writeFileSync, mkdirSync } from 'node:fs';
+import { execSync } from 'child_process';
+
+const TOKEN = execSync(`grep -E '^SHOPIFY_ADMIN_TOKEN=' ${process.env.HOME}/Projects/secrets-manager/.env|cut -d= -f2-`).toString().trim();
+const DOMAIN = 'designer-laboratory-sandbox.myshopify.com', API = '2024-10';
+const REST = `https://${DOMAIN}/admin/api/${API}`;
+const hdr = { 'X-Shopify-Access-Token': TOKEN, 'Content-Type': 'application/json' };
+const LIVE = process.argv.includes('--live');
+const ONLY = (process.argv.find(a => a.startsWith('--only=')) || '').split('=')[1];
+const LIMIT = Number((process.argv.find(a => a.startsWith('--limit=')) || '').split('=')[1] || 0);
+
+const dataDir = new URL('./data', import.meta.url).pathname; mkdirSync(dataDir, { recursive: true });
+const PRESTATE = `${dataDir}/prestate.jsonl`;
+const SKIPS = `${dataDir}/skips.json`;
+const LEDGER = `${process.env.HOME}/.claude/yolo-queue/executed-reversible/ledger.jsonl`;
+
+const { plan } = JSON.parse(readFileSync(`${dataDir}/plan.json`, 'utf8'));
+let list = plan;
+if (ONLY) list = list.filter(p => String(p.pid) === String(ONLY));
+if (LIMIT > 0) list = list.slice(0, LIMIT);
+
+const sleep = ms => new Promise(r => setTimeout(r, ms));
+async function api(path, opts = {}) {
+  for (let a = 0; a < 6; a++) {
+    const res = await fetch(`${REST}${path}`, { headers: hdr, ...opts });
+    if (res.status === 429) { await sleep(2500); continue; }
+    const t = await res.text(); let j; try { j = JSON.parse(t); } catch { j = { _raw: t }; }
+    return { status: res.status, json: j };
+  }
+  return { status: 429, json: {} };
+}
+
+let acted = 0, skipped = 0, failed = 0;
+const skips = [];
+for (const c of list) {
+  const pid = c.pid;
+
+  // GUARD 6 (from plan) + 7 (range) — cheap, before any network
+  if (!c.matchOk) { console.log('SKIP', pid, 'match-sanity false'); skips.push({ pid, reason: 'match_sanity_false', title: c.title }); skipped++; continue; }
+  if (!(c.rollRetail > 10 && c.rollRetail < 10000)) { console.log('SKIP', pid, `retail out of range ${c.rollRetail}`); skips.push({ pid, reason: `retail_range ${c.rollRetail}`, title: c.title }); skipped++; continue; }
+
+  // HARD re-read live + re-guard
+  const { status, json } = await api(`/products/${pid}.json`);
+  if (status !== 200 || !json.product) { console.log('SKIP', pid, 'fetch', status); skips.push({ pid, reason: `fetch ${status}` }); skipped++; continue; }
+  const p = json.product, vs = p.variants || [];
+
+  if (vs.length !== 1) { console.log('SKIP', pid, `nvars=${vs.length} (already restructured?)`); skips.push({ pid, reason: `nvars=${vs.length}`, title: p.title }); skipped++; continue; }
+  const v = vs[0];
+  const opt1 = (v.option1 || '').trim();
+  const sku = (v.sku || '').trim();
+  const price = parseFloat(v.price);
+  if (opt1.toLowerCase() !== 'sample') { console.log('SKIP', pid, `lone opt1='${opt1}' (not Sample)`); skips.push({ pid, reason: `opt1=${opt1}`, title: p.title }); skipped++; continue; }
+  if (!(price <= 4.5)) { console.log('SKIP', pid, `lone price=${price} (>4.50 = not genuine sample / RR-defect)`); skips.push({ pid, reason: `price=${price}`, title: p.title }); skipped++; continue; }
+  if (sku.toLowerCase() !== String(c.sampleSku).toLowerCase()) { console.log('SKIP', pid, `lone sku='${sku}' != expected '${c.sampleSku}'`); skips.push({ pid, reason: `sku_mismatch ${sku}`, title: p.title }); skipped++; continue; }
+  // GUARD 5: roll SKU must NOT already exist as a variant SKU (idempotent / no double-add)
+  if (vs.some(x => (x.sku || '').toLowerCase() === String(c.rollSku).toLowerCase())) { console.log('SKIP', pid, `roll sku ${c.rollSku} already present`); skips.push({ pid, reason: `roll_sku_present ${c.rollSku}`, title: p.title }); skipped++; continue; }
+
+  const rollSku = c.rollSku;
+  const rollPrice = c.rollRetail.toFixed(2);
+
+  if (!LIVE) {
+    console.log(`DRY ${pid} ${p.title}`);
+    console.log(`     keep Sample[${v.id}] sku ${sku} $${v.price} (untouched)`);
+    console.log(`     + ADD "Sold Per Roll" sku ${rollSku} $${rollPrice} (continue=buyable)  [catalog ${c.catalog_dw_sku}, trade $${c.price_trade}]`);
+    acted++; continue;
+  }
+
+  // reversibility FIRST
+  const preRec = { ts: new Date().toISOString(), pid, title: p.title, sampleVariantId: v.id, sampleSku: sku, rollSku, rollPrice, catalog_dw_sku: c.catalog_dw_sku };
+  appendFileSync(PRESTATE, JSON.stringify(preRec) + '\n');
+
+  // ADD the "Sold Per Roll" variant. Preserve the option name the product uses.
+  // inventory_policy:'continue' => made-to-order roll is ALWAYS buyable (matches the live
+  // Elitis "Sold Per Roll" config). 'deny' + qty0 would leave it UNBUYABLE — the exact
+  // defect caught + patched in the pilot.
+  const post = await api(`/products/${pid}/variants.json`, { method: 'POST', body: JSON.stringify({ variant: {
+    option1: 'Sold Per Roll', price: rollPrice, sku: rollSku,
+    inventory_policy: 'continue', inventory_management: 'shopify',
+    taxable: v.taxable !== undefined ? v.taxable : true } }) });
+  if (post.status !== 201 && post.status !== 200) {
+    console.log('ERR', pid, 'roll-add', post.status, JSON.stringify(post.json).slice(0, 200));
+    skips.push({ pid, reason: `roll-add ${post.status}`, detail: JSON.stringify(post.json).slice(0, 200), title: p.title }); failed++; continue;
+  }
+  const nv = post.json.variant;
+
+  const undo = `# delete the added Sold Per Roll variant (the $4.25 Sample was left untouched)\n` +
+    `curl -s -X DELETE "${REST}/products/${pid}/variants/${nv.id}.json" -H "X-Shopify-Access-Token: $SHOPIFY_ADMIN_TOKEN"`;
+  appendFileSync(LEDGER, JSON.stringify({
+    ts: new Date().toISOString(), agent: 'vp-dw-commerce', ticket: 'TK-10978',
+    action: `add-roll Coordonné ${pid} (${c.catalog_dw_sku}): ADD "Sold Per Roll" sku ${rollSku} $${rollPrice} (trade $${c.price_trade}); kept $4.25 Sample ${sku} untouched`,
+    product_id: pid, added_roll_variant_id: nv.id, sample_variant_id: v.id, blast_radius: 1,
+    undo_cmd: undo,
+    verify: `curl -s "${REST}/products/${pid}.json" -H "X-Shopify-Access-Token: $SHOPIFY_ADMIN_TOKEN"|jq '.product.variants[]|{sku,option1,price}'`,
+  }) + '\n');
+  acted++; console.log(`ACTED ${pid} + roll ${rollSku} $${rollPrice} (sample ${sku} kept)`);
+  await sleep(600); // ~2 req/sec (1 write/product + the GET)
+}
+writeFileSync(SKIPS, JSON.stringify(skips, null, 2));
+console.log(`\n${LIVE ? 'LIVE' : 'DRY'} — acted ${acted}, skipped ${skipped}, failed ${failed} (of ${list.length})`);
diff --git a/tk10978-coordonne/rollback-all.mjs b/tk10978-coordonne/rollback-all.mjs
new file mode 100644
index 0000000..6ee9b05
--- /dev/null
+++ b/tk10978-coordonne/rollback-all.mjs
@@ -0,0 +1,27 @@
+#!/usr/bin/env node
+// Reverse the TK-10978 Scalamandre ADD-ROLL recovery: for each acted product,
+// DELETE the added "Sold Per Roll" variant. The $4.25 Sample variant was never
+// touched, so nothing else needs restoring. Reads data/prestate.jsonl.
+// Usage: node rollback-all.mjs [--live]   default = dry-run (lists what it would delete).
+import { readFileSync } from 'node:fs';
+import { execSync } from 'child_process';
+const LIVE = process.argv.includes('--live');
+const T = execSync(`grep -E '^SHOPIFY_ADMIN_TOKEN=' ${process.env.HOME}/Projects/secrets-manager/.env|cut -d= -f2-`).toString().trim();
+const DOMAIN = 'designer-laboratory-sandbox.myshopify.com', API = '2024-10';
+const hdr = { 'X-Shopify-Access-Token': T, 'Content-Type': 'application/json' };
+const REST = `https://${DOMAIN}/admin/api/${API}`;
+const lines = readFileSync(new URL('./data/prestate.jsonl', import.meta.url).pathname, 'utf8').trim().split('\n').map(JSON.parse);
+const sleep = ms => new Promise(r => setTimeout(r, ms));
+async function api(path, opts) { const r = await fetch(`${REST}${path}`, { headers: hdr, ...opts }); return { status: r.status, json: await r.json().catch(() => ({})) }; }
+let n = 0;
+for (const l of lines) {
+  const { json } = await api(`/products/${l.pid}.json`, {});
+  const vs = json.product?.variants || [];
+  // the added roll variant: sku==rollSku, option1='Sold Per Roll', not the sample id
+  const added = vs.find(v => (v.sku || '').toLowerCase() === l.rollSku.toLowerCase() && v.id !== l.sampleVariantId);
+  if (!added) { console.log('skip', l.pid, 'no added roll variant found (already reverted?)'); continue; }
+  if (!LIVE) { console.log('WOULD DELETE', l.pid, 'variant', added.id, l.rollSku, '$' + added.price); continue; }
+  await api(`/products/${l.pid}/variants/${added.id}.json`, { method: 'DELETE' });
+  n++; console.log('deleted', l.pid, l.rollSku); await sleep(400);
+}
+console.log(LIVE ? `reverted ${n}` : 'dry-run complete');

← a12fffc TK-10978 Donghia add-roll recovery tooling: plan builder (15  ·  back to Dw Unbuyable Recovery Pilot  ·  auto-data-snapshot: 2026-08-31T11:17:15 (4 data files) — tk1 6f992ff →