← 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
A tk10978-coordonne/build-plan.mjsA tk10978-coordonne/data/excluded.jsonA tk10978-coordonne/data/plan.jsonA tk10978-coordonne/data/skips.jsonA tk10978-coordonne/repair.mjsA tk10978-coordonne/rollback-all.mjs
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 – 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 – 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 – 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 – 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 – 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 – 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 – 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 – 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 – 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 – 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 – 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 – 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 – 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 – 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 – 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 →