[object Object]

← back to Dw Unbuyable Recovery Pilot

TK-11041: dry-run reprice plan for 39 live PR-Innovations items (parameterized on portal LIST)

330f399b8e5698f6a7fadde48f2464bd843bbf66 · 2026-09-12 08:06:15 -0700 · Steve Abrams

39 items / 7 pattern pages, 0 priced. Wires net_cost=LIST*0.90 -> retail=net/0.65/0.85,
rounded Math.round(x*100)/100 (matches stage-innov-reprice.mjs / cadence-import).
READ-ONLY: no dw_unified write, no Shopify write. Gated write fires only after portal
creds (acct 58315) land + per-pattern LIST verified.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KzajqT19xhuZnfZBBgLDr3

Files touched

Diff

commit 330f399b8e5698f6a7fadde48f2464bd843bbf66
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Sat Sep 12 08:06:15 2026 -0700

    TK-11041: dry-run reprice plan for 39 live PR-Innovations items (parameterized on portal LIST)
    
    39 items / 7 pattern pages, 0 priced. Wires net_cost=LIST*0.90 -> retail=net/0.65/0.85,
    rounded Math.round(x*100)/100 (matches stage-innov-reprice.mjs / cadence-import).
    READ-ONLY: no dw_unified write, no Shopify write. Gated write fires only after portal
    creds (acct 58315) land + per-pattern LIST verified.
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01KzajqT19xhuZnfZBBgLDr3
---
 .../rescrape/tk11041-dryrun-reprice-plan.json      | 888 +++++++++++++++++++++
 .../rescrape/tk11041-dryrun-reprice-plan.md        |  94 +++
 .../rescrape/tk11041-dryrun-reprice-plan.mjs       | 213 +++++
 3 files changed, 1195 insertions(+)

diff --git a/tk11041-innovations-reconcile/rescrape/tk11041-dryrun-reprice-plan.json b/tk11041-innovations-reconcile/rescrape/tk11041-dryrun-reprice-plan.json
new file mode 100644
index 0000000..c8ffbb1
--- /dev/null
+++ b/tk11041-innovations-reconcile/rescrape/tk11041-dryrun-reprice-plan.json
@@ -0,0 +1,888 @@
+{
+  "ticket": "TK-11041",
+  "kind": "dry-run-reprice-plan",
+  "generated_at": "2026-09-12T15:06:00.367Z",
+  "read_only": true,
+  "no_db_write": true,
+  "no_shopify_write": true,
+  "no_email": true,
+  "no_deploy": true,
+  "source_of_truth": "Mac2-local dw_unified.innovations_catalog (host=/tmp socket)",
+  "cohort": {
+    "n": 39,
+    "expected": 39,
+    "pattern_pages": 7,
+    "priced_now": 0,
+    "prefixes": [
+      "CSO",
+      "ENS",
+      "FLN",
+      "PRO",
+      "SKL",
+      "TTM",
+      "VCO"
+    ],
+    "excluded": "12 WHL/Whistler items (404, no portal page, priced separately)"
+  },
+  "integrity_flags": [
+    "NONE — 39 items, 7 pages, 0 priced (matches brief)"
+  ],
+  "formula": {
+    "settled_inputs": {
+      "discount_pct": 10,
+      "discount_confidence": "HIGH — Sales Order O-111475",
+      "portal_basis": "LIST (portal shows list price; discount applies on top)"
+    },
+    "chain": "net_cost = LIST * 0.90 ; retail = net_cost / 0.65 / 0.85",
+    "rounding": "Math.round(x * 100) / 100 (nearest cent, 2 decimals)",
+    "rounding_source": "scripts/innovations-reprice/stage-innov-reprice.mjs RETAIL() — \"same formula as cadence-import\"",
+    "free_variable": "LIST — per-pattern list price, per linear yard, from innovationsusa.com trade portal (acct 58315)",
+    "price_unit": "yard  (Innovations sold PER LINEAR YARD)"
+  },
+  "one_remaining_input": "per-pattern LIST price from the innovationsusa.com trade portal (acct 58315). Creds NOT yet pasted, so LIST is unknown — this plan is fully parameterized on it.",
+  "gated_write_fires_only_after": [
+    "portal creds land (Steve pastes innovationsusa.com acct 58315 login)",
+    "per-pattern LIST verified on the authenticated page (basis=LIST confirmed, not NET)",
+    "then: stage price cols, then run the add-yard/reprice (stage-innov-reprice.mjs) — Steve-gated (customer-facing money op)"
+  ],
+  "target_columns": {
+    "price_trade": "net_cost = round(LIST * 0.90, 2)",
+    "price_unit": "'yard'",
+    "our_price": "retail = round(price_trade / 0.65 / 0.85, 2)",
+    "price_source": "'innovations portal <YYYY-MM-DD>'",
+    "price_updated_at": "now()"
+  },
+  "retail_computed": false,
+  "retail_blocked_reason": "Per-pattern LIST price not yet available (portal creds unpasted). The two unknowns the pull script guards (DISCOUNT + BASIS) are SETTLED for this plan — discount 10% (O-111475), basis LIST — so the ONLY remaining input is the LIST number itself. Once LIST lands per pattern: price_trade = round(LIST*0.90,2); our_price = round(price_trade/0.65/0.85,2).",
+  "worked_example": {
+    "label": "PLACEHOLDER — arithmetic demonstration only; NOT a real Innovations price",
+    "applies_to": "e.g. CSO-001 Radiant (Costine) — any of the 39, formula is identical",
+    "LIST_per_yard": 84.5,
+    "step1_net_cost": {
+      "formula": "round(LIST * 0.90, 2)",
+      "value": 76.05,
+      "writes_to": "price_trade"
+    },
+    "step2_retail": {
+      "formula": "round(net_cost / 0.65 / 0.85, 2)",
+      "value": 137.65,
+      "writes_to": "our_price"
+    },
+    "price_unit": "yard"
+  },
+  "pattern_pages": [
+    {
+      "product_url": "https://www.innovationsusa.com/item/costine",
+      "pattern_name": "Costine",
+      "prefix": "CSO",
+      "width": "52\" (132 cm)",
+      "roll_length": "25 YDs",
+      "item_count": 3,
+      "colorways": [
+        {
+          "mfr_sku": "CSO-001",
+          "color_name": "Radiant"
+        },
+        {
+          "mfr_sku": "CSO-002",
+          "color_name": "Pearl"
+        },
+        {
+          "mfr_sku": "CSO-003",
+          "color_name": "Filigree"
+        }
+      ]
+    },
+    {
+      "product_url": "https://www.innovationsusa.com/item/enchase",
+      "pattern_name": "Enchase",
+      "prefix": "ENS",
+      "width": "35\" (90 cm)",
+      "roll_length": "27 YDs",
+      "item_count": 6,
+      "colorways": [
+        {
+          "mfr_sku": "ENS-01",
+          "color_name": "Bone"
+        },
+        {
+          "mfr_sku": "ENS-02",
+          "color_name": "Frost"
+        },
+        {
+          "mfr_sku": "ENS-03",
+          "color_name": "Calcite"
+        },
+        {
+          "mfr_sku": "ENS-04",
+          "color_name": "Basalt"
+        },
+        {
+          "mfr_sku": "ENS-05",
+          "color_name": "Black Emerald"
+        },
+        {
+          "mfr_sku": "ENS-06",
+          "color_name": "Sapphire"
+        }
+      ]
+    },
+    {
+      "product_url": "https://www.innovationsusa.com/item/flanders",
+      "pattern_name": "Flanders",
+      "prefix": "FLN",
+      "width": "54\" (137 cm)",
+      "roll_length": "55 YDs",
+      "item_count": 5,
+      "colorways": [
+        {
+          "mfr_sku": "FLN-01",
+          "color_name": "Heather"
+        },
+        {
+          "mfr_sku": "FLN-02",
+          "color_name": "Bobbin"
+        },
+        {
+          "mfr_sku": "FLN-03",
+          "color_name": "Pepper"
+        },
+        {
+          "mfr_sku": "FLN-04",
+          "color_name": "Cocoa"
+        },
+        {
+          "mfr_sku": "FLN-05",
+          "color_name": "Jet"
+        }
+      ]
+    },
+    {
+      "product_url": "https://www.innovationsusa.com/item/province",
+      "pattern_name": "Province",
+      "prefix": "PRO",
+      "width": "52\" (132 cm)",
+      "roll_length": "30 YDs",
+      "item_count": 1,
+      "colorways": [
+        {
+          "mfr_sku": "PRO-012",
+          "color_name": "Uva"
+        }
+      ]
+    },
+    {
+      "product_url": "https://www.innovationsusa.com/item/skylark",
+      "pattern_name": "Skylark",
+      "prefix": "SKL",
+      "width": "54\" (137 cm)",
+      "roll_length": "10 YDs",
+      "item_count": 4,
+      "colorways": [
+        {
+          "mfr_sku": "SKL-001",
+          "color_name": "Ash"
+        },
+        {
+          "mfr_sku": "SKL-002",
+          "color_name": "Grove"
+        },
+        {
+          "mfr_sku": "SKL-003",
+          "color_name": "Moss"
+        },
+        {
+          "mfr_sku": "SKL-004",
+          "color_name": "Azure"
+        }
+      ]
+    },
+    {
+      "product_url": "https://www.innovationsusa.com/item/tatami",
+      "pattern_name": "Tatami",
+      "prefix": "TTM",
+      "width": "36\" (91 cm)",
+      "roll_length": "30 YDs",
+      "item_count": 7,
+      "colorways": [
+        {
+          "mfr_sku": "TTM-01",
+          "color_name": "Fuji"
+        },
+        {
+          "mfr_sku": "TTM-02",
+          "color_name": "Hasu"
+        },
+        {
+          "mfr_sku": "TTM-03",
+          "color_name": "Bara"
+        },
+        {
+          "mfr_sku": "TTM-04",
+          "color_name": "Poppi"
+        },
+        {
+          "mfr_sku": "TTM-05",
+          "color_name": "Ajisai"
+        },
+        {
+          "mfr_sku": "TTM-06",
+          "color_name": "Daria"
+        },
+        {
+          "mfr_sku": "TTM-07",
+          "color_name": "Rabenda"
+        }
+      ]
+    },
+    {
+      "product_url": "https://www.innovationsusa.com/item/vinyl%20cork",
+      "pattern_name": "Vinyl Cork",
+      "prefix": "VCO",
+      "width": "54\" (137 cm)",
+      "roll_length": "30 YDs",
+      "item_count": 13,
+      "colorways": [
+        {
+          "mfr_sku": "VCO-001",
+          "color_name": "Platinum"
+        },
+        {
+          "mfr_sku": "VCO-002",
+          "color_name": "Ivory Frost"
+        },
+        {
+          "mfr_sku": "VCO-003",
+          "color_name": "Moonlight"
+        },
+        {
+          "mfr_sku": "VCO-004",
+          "color_name": "Champagne"
+        },
+        {
+          "mfr_sku": "VCO-005",
+          "color_name": "Gilded Taupe"
+        },
+        {
+          "mfr_sku": "VCO-006",
+          "color_name": "Argent"
+        },
+        {
+          "mfr_sku": "VCO-007",
+          "color_name": "Silver Sky"
+        },
+        {
+          "mfr_sku": "VCO-008",
+          "color_name": "Burnished Copper"
+        },
+        {
+          "mfr_sku": "VCO-009",
+          "color_name": "Bronze Mist"
+        },
+        {
+          "mfr_sku": "VCO-010",
+          "color_name": "Blue Opal"
+        },
+        {
+          "mfr_sku": "VCO-011",
+          "color_name": "Misty Steel"
+        },
+        {
+          "mfr_sku": "VCO-012",
+          "color_name": "Gold Espresso"
+        },
+        {
+          "mfr_sku": "VCO-013",
+          "color_name": "Emerald Moon"
+        }
+      ]
+    }
+  ],
+  "items": [
+    {
+      "mfr_sku": "CSO-001",
+      "pattern_name": "Costine",
+      "color_name": "Radiant",
+      "product_url": "https://www.innovationsusa.com/item/costine",
+      "dw_sku": null,
+      "width": "52\" (132 cm)",
+      "roll_length": "25 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "CSO-002",
+      "pattern_name": "Costine",
+      "color_name": "Pearl",
+      "product_url": "https://www.innovationsusa.com/item/costine",
+      "dw_sku": null,
+      "width": "52\" (132 cm)",
+      "roll_length": "25 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "CSO-003",
+      "pattern_name": "Costine",
+      "color_name": "Filigree",
+      "product_url": "https://www.innovationsusa.com/item/costine",
+      "dw_sku": null,
+      "width": "52\" (132 cm)",
+      "roll_length": "25 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "ENS-01",
+      "pattern_name": "Enchase",
+      "color_name": "Bone",
+      "product_url": "https://www.innovationsusa.com/item/enchase",
+      "dw_sku": null,
+      "width": "35\" (90 cm)",
+      "roll_length": "27 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "ENS-02",
+      "pattern_name": "Enchase",
+      "color_name": "Frost",
+      "product_url": "https://www.innovationsusa.com/item/enchase",
+      "dw_sku": null,
+      "width": "35\" (90 cm)",
+      "roll_length": "27 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "ENS-03",
+      "pattern_name": "Enchase",
+      "color_name": "Calcite",
+      "product_url": "https://www.innovationsusa.com/item/enchase",
+      "dw_sku": null,
+      "width": "35\" (90 cm)",
+      "roll_length": "27 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "ENS-04",
+      "pattern_name": "Enchase",
+      "color_name": "Basalt",
+      "product_url": "https://www.innovationsusa.com/item/enchase",
+      "dw_sku": null,
+      "width": "35\" (90 cm)",
+      "roll_length": "27 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "ENS-05",
+      "pattern_name": "Enchase",
+      "color_name": "Black Emerald",
+      "product_url": "https://www.innovationsusa.com/item/enchase",
+      "dw_sku": null,
+      "width": "35\" (90 cm)",
+      "roll_length": "27 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "ENS-06",
+      "pattern_name": "Enchase",
+      "color_name": "Sapphire",
+      "product_url": "https://www.innovationsusa.com/item/enchase",
+      "dw_sku": null,
+      "width": "35\" (90 cm)",
+      "roll_length": "27 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "FLN-01",
+      "pattern_name": "Flanders",
+      "color_name": "Heather",
+      "product_url": "https://www.innovationsusa.com/item/flanders",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "55 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "FLN-02",
+      "pattern_name": "Flanders",
+      "color_name": "Bobbin",
+      "product_url": "https://www.innovationsusa.com/item/flanders",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "55 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "FLN-03",
+      "pattern_name": "Flanders",
+      "color_name": "Pepper",
+      "product_url": "https://www.innovationsusa.com/item/flanders",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "55 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "FLN-04",
+      "pattern_name": "Flanders",
+      "color_name": "Cocoa",
+      "product_url": "https://www.innovationsusa.com/item/flanders",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "55 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "FLN-05",
+      "pattern_name": "Flanders",
+      "color_name": "Jet",
+      "product_url": "https://www.innovationsusa.com/item/flanders",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "55 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "PRO-012",
+      "pattern_name": "Province",
+      "color_name": "Uva",
+      "product_url": "https://www.innovationsusa.com/item/province",
+      "dw_sku": null,
+      "width": "52\" (132 cm)",
+      "roll_length": "30 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "SKL-001",
+      "pattern_name": "Skylark",
+      "color_name": "Ash",
+      "product_url": "https://www.innovationsusa.com/item/skylark",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "10 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "SKL-002",
+      "pattern_name": "Skylark",
+      "color_name": "Grove",
+      "product_url": "https://www.innovationsusa.com/item/skylark",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "10 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "SKL-003",
+      "pattern_name": "Skylark",
+      "color_name": "Moss",
+      "product_url": "https://www.innovationsusa.com/item/skylark",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "10 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "SKL-004",
+      "pattern_name": "Skylark",
+      "color_name": "Azure",
+      "product_url": "https://www.innovationsusa.com/item/skylark",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "10 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "TTM-01",
+      "pattern_name": "Tatami",
+      "color_name": "Fuji",
+      "product_url": "https://www.innovationsusa.com/item/tatami",
+      "dw_sku": null,
+      "width": "36\" (91 cm)",
+      "roll_length": "30 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "TTM-02",
+      "pattern_name": "Tatami",
+      "color_name": "Hasu",
+      "product_url": "https://www.innovationsusa.com/item/tatami",
+      "dw_sku": null,
+      "width": "36\" (91 cm)",
+      "roll_length": "30 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "TTM-03",
+      "pattern_name": "Tatami",
+      "color_name": "Bara",
+      "product_url": "https://www.innovationsusa.com/item/tatami",
+      "dw_sku": null,
+      "width": "36\" (91 cm)",
+      "roll_length": "30 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "TTM-04",
+      "pattern_name": "Tatami",
+      "color_name": "Poppi",
+      "product_url": "https://www.innovationsusa.com/item/tatami",
+      "dw_sku": null,
+      "width": "36\" (91 cm)",
+      "roll_length": "30 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "TTM-05",
+      "pattern_name": "Tatami",
+      "color_name": "Ajisai",
+      "product_url": "https://www.innovationsusa.com/item/tatami",
+      "dw_sku": null,
+      "width": "36\" (91 cm)",
+      "roll_length": "30 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "TTM-06",
+      "pattern_name": "Tatami",
+      "color_name": "Daria",
+      "product_url": "https://www.innovationsusa.com/item/tatami",
+      "dw_sku": null,
+      "width": "36\" (91 cm)",
+      "roll_length": "30 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "TTM-07",
+      "pattern_name": "Tatami",
+      "color_name": "Rabenda",
+      "product_url": "https://www.innovationsusa.com/item/tatami",
+      "dw_sku": null,
+      "width": "36\" (91 cm)",
+      "roll_length": "30 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "VCO-001",
+      "pattern_name": "Vinyl Cork",
+      "color_name": "Platinum",
+      "product_url": "https://www.innovationsusa.com/item/vinyl%20cork",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "30 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "VCO-002",
+      "pattern_name": "Vinyl Cork",
+      "color_name": "Ivory Frost",
+      "product_url": "https://www.innovationsusa.com/item/vinyl%20cork",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "30 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "VCO-003",
+      "pattern_name": "Vinyl Cork",
+      "color_name": "Moonlight",
+      "product_url": "https://www.innovationsusa.com/item/vinyl%20cork",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "30 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "VCO-004",
+      "pattern_name": "Vinyl Cork",
+      "color_name": "Champagne",
+      "product_url": "https://www.innovationsusa.com/item/vinyl%20cork",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "30 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "VCO-005",
+      "pattern_name": "Vinyl Cork",
+      "color_name": "Gilded Taupe",
+      "product_url": "https://www.innovationsusa.com/item/vinyl%20cork",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "30 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "VCO-006",
+      "pattern_name": "Vinyl Cork",
+      "color_name": "Argent",
+      "product_url": "https://www.innovationsusa.com/item/vinyl%20cork",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "30 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "VCO-007",
+      "pattern_name": "Vinyl Cork",
+      "color_name": "Silver Sky",
+      "product_url": "https://www.innovationsusa.com/item/vinyl%20cork",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "30 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "VCO-008",
+      "pattern_name": "Vinyl Cork",
+      "color_name": "Burnished Copper",
+      "product_url": "https://www.innovationsusa.com/item/vinyl%20cork",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "30 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "VCO-009",
+      "pattern_name": "Vinyl Cork",
+      "color_name": "Bronze Mist",
+      "product_url": "https://www.innovationsusa.com/item/vinyl%20cork",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "30 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "VCO-010",
+      "pattern_name": "Vinyl Cork",
+      "color_name": "Blue Opal",
+      "product_url": "https://www.innovationsusa.com/item/vinyl%20cork",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "30 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "VCO-011",
+      "pattern_name": "Vinyl Cork",
+      "color_name": "Misty Steel",
+      "product_url": "https://www.innovationsusa.com/item/vinyl%20cork",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "30 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "VCO-012",
+      "pattern_name": "Vinyl Cork",
+      "color_name": "Gold Espresso",
+      "product_url": "https://www.innovationsusa.com/item/vinyl%20cork",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "30 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    },
+    {
+      "mfr_sku": "VCO-013",
+      "pattern_name": "Vinyl Cork",
+      "color_name": "Emerald Moon",
+      "product_url": "https://www.innovationsusa.com/item/vinyl%20cork",
+      "dw_sku": null,
+      "width": "54\" (137 cm)",
+      "roll_length": "30 YDs",
+      "price_unit_now": null,
+      "LIST_per_yard": null,
+      "net_cost_formula": "round(LIST * 0.90, 2)  -> price_trade",
+      "retail_formula": "round(net_cost / 0.65 / 0.85, 2)  -> our_price",
+      "retail_computed": false,
+      "retail_blocked_reason": "awaiting per-pattern LIST from portal (creds unpasted)"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/tk11041-innovations-reconcile/rescrape/tk11041-dryrun-reprice-plan.md b/tk11041-innovations-reconcile/rescrape/tk11041-dryrun-reprice-plan.md
new file mode 100644
index 0000000..b102962
--- /dev/null
+++ b/tk11041-innovations-reconcile/rescrape/tk11041-dryrun-reprice-plan.md
@@ -0,0 +1,94 @@
+# TK-11041 — Innovations dry-run reprice plan (READ-ONLY)
+
+_Generated 2026-09-12T15:06:00.367Z · Mac2-local dw_unified.innovations_catalog · NO db write · NO Shopify write · NO email · NO deploy_
+
+## Cohort
+- **39 items** across **7 unique pattern pages** (prefixes CSO/ENS/FLN/PRO/SKL/TTM/VCO).
+- **0/39 currently carry a price** (price_trade / our_price / price_retail all NULL).
+- Excluded: 12 WHL/Whistler items (404, no portal page, priced separately).
+- Integrity: NONE — 39 items, 7 pages, 0 priced (matches brief).
+
+## Formula (LIST is the one free variable)
+```
+net_cost = LIST * 0.90               # discount SETTLED 10%, HIGH conf — Sales Order O-111475
+retail   = net_cost / 0.65 / 0.85    # DW standard markup
+round    = Math.round(x*100)/100     # nearest cent (2dp) — matches stage-innov-reprice.mjs / cadence-import
+```
+- Portal basis = **LIST** (discount applies on top). Price unit = **yard** (sold per linear yard).
+- Rounding source: `scripts/innovations-reprice/stage-innov-reprice.mjs` → `RETAIL = c => Math.round((c/0.65/0.85)*100)/100`.
+
+## The ONE remaining input
+**Per-pattern LIST price** from the innovationsusa.com trade portal (acct 58315). Creds not yet pasted.
+The gated write (stage price cols → then the add-yard/reprice) fires **only after** creds land **and** LIST is verified per pattern.
+
+## Worked EXAMPLE (PLACEHOLDER — not a real Innovations price)
+LIST = $84.50/yard →
+net_cost = round($84.50 × 0.90) = **$76.05** (→ price_trade) →
+retail = round($76.05 / 0.65 / 0.85) = **$137.65** (→ our_price)
+
+## Target columns (staged only after LIST verified — GATED)
+| column | value |
+|---|---|
+| price_trade | round(LIST × 0.90, 2) |
+| price_unit | 'yard' |
+| our_price | round(price_trade / 0.65 / 0.85, 2) |
+| price_source | 'innovations portal <YYYY-MM-DD>' |
+| price_updated_at | now() |
+
+`retail_computed: false` carried on every row until LIST lands (matches the pull script's safety contract).
+
+## The 7 pattern pages
+| # | pattern | prefix | items | width | roll_length | product_url |
+|---|---|---|---|---|---|---|
+| 1 | Costine | CSO | 3 | 52" (132 cm) | 25 YDs | https://www.innovationsusa.com/item/costine |
+| 2 | Enchase | ENS | 6 | 35" (90 cm) | 27 YDs | https://www.innovationsusa.com/item/enchase |
+| 3 | Flanders | FLN | 5 | 54" (137 cm) | 55 YDs | https://www.innovationsusa.com/item/flanders |
+| 4 | Province | PRO | 1 | 52" (132 cm) | 30 YDs | https://www.innovationsusa.com/item/province |
+| 5 | Skylark | SKL | 4 | 54" (137 cm) | 10 YDs | https://www.innovationsusa.com/item/skylark |
+| 6 | Tatami | TTM | 7 | 36" (91 cm) | 30 YDs | https://www.innovationsusa.com/item/tatami |
+| 7 | Vinyl Cork | VCO | 13 | 54" (137 cm) | 30 YDs | https://www.innovationsusa.com/item/vinyl%20cork |
+
+## All 39 items (LIST column blank — filled only after the portal pull)
+| mfr_sku | pattern | colorway | width | roll_length | LIST | net_cost=LIST×0.90 | retail=net/0.65/0.85 |
+|---|---|---|---|---|---|---|---|
+| CSO-001 | Costine | Radiant | 52" (132 cm) | 25 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| CSO-002 | Costine | Pearl | 52" (132 cm) | 25 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| CSO-003 | Costine | Filigree | 52" (132 cm) | 25 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| ENS-01 | Enchase | Bone | 35" (90 cm) | 27 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| ENS-02 | Enchase | Frost | 35" (90 cm) | 27 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| ENS-03 | Enchase | Calcite | 35" (90 cm) | 27 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| ENS-04 | Enchase | Basalt | 35" (90 cm) | 27 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| ENS-05 | Enchase | Black Emerald | 35" (90 cm) | 27 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| ENS-06 | Enchase | Sapphire | 35" (90 cm) | 27 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| FLN-01 | Flanders | Heather | 54" (137 cm) | 55 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| FLN-02 | Flanders | Bobbin | 54" (137 cm) | 55 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| FLN-03 | Flanders | Pepper | 54" (137 cm) | 55 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| FLN-04 | Flanders | Cocoa | 54" (137 cm) | 55 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| FLN-05 | Flanders | Jet | 54" (137 cm) | 55 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| PRO-012 | Province | Uva | 52" (132 cm) | 30 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| SKL-001 | Skylark | Ash | 54" (137 cm) | 10 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| SKL-002 | Skylark | Grove | 54" (137 cm) | 10 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| SKL-003 | Skylark | Moss | 54" (137 cm) | 10 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| SKL-004 | Skylark | Azure | 54" (137 cm) | 10 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| TTM-01 | Tatami | Fuji | 36" (91 cm) | 30 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| TTM-02 | Tatami | Hasu | 36" (91 cm) | 30 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| TTM-03 | Tatami | Bara | 36" (91 cm) | 30 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| TTM-04 | Tatami | Poppi | 36" (91 cm) | 30 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| TTM-05 | Tatami | Ajisai | 36" (91 cm) | 30 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| TTM-06 | Tatami | Daria | 36" (91 cm) | 30 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| TTM-07 | Tatami | Rabenda | 36" (91 cm) | 30 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| VCO-001 | Vinyl Cork | Platinum | 54" (137 cm) | 30 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| VCO-002 | Vinyl Cork | Ivory Frost | 54" (137 cm) | 30 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| VCO-003 | Vinyl Cork | Moonlight | 54" (137 cm) | 30 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| VCO-004 | Vinyl Cork | Champagne | 54" (137 cm) | 30 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| VCO-005 | Vinyl Cork | Gilded Taupe | 54" (137 cm) | 30 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| VCO-006 | Vinyl Cork | Argent | 54" (137 cm) | 30 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| VCO-007 | Vinyl Cork | Silver Sky | 54" (137 cm) | 30 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| VCO-008 | Vinyl Cork | Burnished Copper | 54" (137 cm) | 30 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| VCO-009 | Vinyl Cork | Bronze Mist | 54" (137 cm) | 30 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| VCO-010 | Vinyl Cork | Blue Opal | 54" (137 cm) | 30 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| VCO-011 | Vinyl Cork | Misty Steel | 54" (137 cm) | 30 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| VCO-012 | Vinyl Cork | Gold Espresso | 54" (137 cm) | 30 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+| VCO-013 | Vinyl Cork | Emerald Moon | 54" (137 cm) | 30 YDs | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |
+
+_39 rows. dw_sku is NULL in the local mirror for all 39 (identity/spec present; dw_sku not yet stamped here) — noted, not blocking the reprice math._
diff --git a/tk11041-innovations-reconcile/rescrape/tk11041-dryrun-reprice-plan.mjs b/tk11041-innovations-reconcile/rescrape/tk11041-dryrun-reprice-plan.mjs
new file mode 100644
index 0000000..ae4c5d6
--- /dev/null
+++ b/tk11041-innovations-reconcile/rescrape/tk11041-dryrun-reprice-plan.mjs
@@ -0,0 +1,213 @@
+#!/usr/bin/env node
+/**
+ * tk11041-dryrun-reprice-plan.mjs — READ-ONLY dry-run reprice PLAN for the 39 live
+ * PR-Innovations items (prefixes CSO/ENS/FLN/PRO/SKL/TTM/VCO). WHL/Whistler EXCLUDED.
+ *
+ * Emits a JSON + human-readable .md that wire the DW reprice formula end-to-end with the
+ * per-pattern LIST price as the ONE free variable. Writes NOTHING to dw_unified or Shopify.
+ *
+ *   net_cost = LIST * 0.90            (discount SETTLED 10%, HIGH conf — Sales Order O-111475)
+ *   retail   = net_cost / 0.65 / 0.85 (DW standard markup)
+ *   round    = Math.round(x*100)/100  (nearest cent) — the SAME convention as the existing
+ *              add-yard/reprice script scripts/innovations-reprice/stage-innov-reprice.mjs
+ *              (RETAIL = c => Math.round((c/0.65/0.85)*100)/100; "same formula as cadence-import").
+ *
+ * The gated staging write (price_trade / price_unit / our_price / price_source / price_updated_at)
+ * fires ONLY after portal creds land (innovationsusa.com acct 58315) AND per-pattern LIST verified.
+ */
+import { execFileSync } from 'node:child_process';
+import fs from 'node:fs';
+import path from 'node:path';
+
+const OUTDIR = path.dirname(new URL(import.meta.url).pathname);
+const PREFIXES = ['CSO', 'ENS', 'FLN', 'PRO', 'SKL', 'TTM', 'VCO'];
+
+// ---- settled inputs (from prior TK-11041 sessions; not re-litigated here) -------------------
+const DISCOUNT = 0.90;                 // net_cost = LIST * 0.90  (10% off)
+const M1 = 0.65, M2 = 0.85;            // retail = net_cost / 0.65 / 0.85
+const round2 = x => Math.round(x * 100) / 100;   // DW convention (nearest cent)
+const netCost = list => round2(list * DISCOUNT);
+const retail  = list => round2(netCost(list) / M1 / M2);
+
+// ---- read the cohort from the Mac2-local mirror (READ-ONLY) ---------------------------------
+const psql = sql => execFileSync('psql',
+  ['-h', '/tmp', '-At', '-F', '\t', '-d', 'dw_unified', '-c', sql], { encoding: 'utf8' }).trim();
+
+const rows = psql(`
+  SELECT product_url, pattern_name, mfr_sku, color_name,
+         coalesce(dw_sku,'') , coalesce(width,'') , coalesce(roll_length,'') ,
+         coalesce(price_unit,'') ,
+         (price_trade IS NOT NULL OR our_price IS NOT NULL OR price_retail IS NOT NULL) AS has_price
+  FROM innovations_catalog
+  WHERE substring(mfr_sku from '^[A-Za-z]+') IN (${PREFIXES.map(p => `'${p}'`).join(',')})
+  ORDER BY product_url, mfr_sku;`)
+  .split('\n').filter(Boolean).map(l => {
+    const [product_url, pattern_name, mfr_sku, color_name, dw_sku, width, roll_length, price_unit, has_price] = l.split('\t');
+    return { product_url, pattern_name, mfr_sku, color_name, dw_sku, width, roll_length, price_unit,
+             has_price: has_price === 't' };
+  });
+
+// ---- integrity checks (flag anything that contradicts the brief) ----------------------------
+const flags = [];
+if (rows.length !== 39) flags.push(`COHORT COUNT IS ${rows.length}, EXPECTED 39`);
+const priced = rows.filter(r => r.has_price);
+if (priced.length !== 0) flags.push(`${priced.length}/39 ALREADY CARRY A PRICE: ${priced.map(r => r.mfr_sku).join(', ')}`);
+
+// ---- group by the unique pattern page -------------------------------------------------------
+const pagesMap = new Map();
+for (const r of rows) {
+  if (!pagesMap.has(r.product_url)) pagesMap.set(r.product_url, []);
+  pagesMap.get(r.product_url).push(r);
+}
+const pages = [...pagesMap.entries()].map(([product_url, items]) => ({
+  product_url,
+  pattern_name: items[0].pattern_name,
+  prefix: items[0].mfr_sku.match(/^[A-Za-z]+/)[0],
+  width: [...new Set(items.map(i => i.width))].join(' | '),
+  roll_length: [...new Set(items.map(i => i.roll_length))].join(' | '),
+  item_count: items.length,
+  colorways: items.map(i => ({ mfr_sku: i.mfr_sku, color_name: i.color_name })),
+}));
+
+// ---- worked PLACEHOLDER example -------------------------------------------------------------
+const PLACEHOLDER_LIST = 84.50;   // NOT a real Innovations price — illustrative only
+const example = {
+  label: 'PLACEHOLDER — arithmetic demonstration only; NOT a real Innovations price',
+  applies_to: 'e.g. CSO-001 Radiant (Costine) — any of the 39, formula is identical',
+  LIST_per_yard: PLACEHOLDER_LIST,
+  step1_net_cost: { formula: 'round(LIST * 0.90, 2)', value: netCost(PLACEHOLDER_LIST), writes_to: 'price_trade' },
+  step2_retail:   { formula: 'round(net_cost / 0.65 / 0.85, 2)', value: retail(PLACEHOLDER_LIST), writes_to: 'our_price' },
+  price_unit: 'yard',
+};
+
+// ---- assemble the plan ----------------------------------------------------------------------
+const now = new Date().toISOString();
+const plan = {
+  ticket: 'TK-11041',
+  kind: 'dry-run-reprice-plan',
+  generated_at: now,
+  read_only: true, no_db_write: true, no_shopify_write: true, no_email: true, no_deploy: true,
+  source_of_truth: 'Mac2-local dw_unified.innovations_catalog (host=/tmp socket)',
+  cohort: {
+    n: rows.length, expected: 39, pattern_pages: pages.length, priced_now: priced.length,
+    prefixes: PREFIXES,
+    excluded: '12 WHL/Whistler items (404, no portal page, priced separately)',
+  },
+  integrity_flags: flags.length ? flags : ['NONE — 39 items, 7 pages, 0 priced (matches brief)'],
+  formula: {
+    settled_inputs: {
+      discount_pct: 10,
+      discount_confidence: 'HIGH — Sales Order O-111475',
+      portal_basis: 'LIST (portal shows list price; discount applies on top)',
+    },
+    chain: 'net_cost = LIST * 0.90 ; retail = net_cost / 0.65 / 0.85',
+    rounding: 'Math.round(x * 100) / 100 (nearest cent, 2 decimals)',
+    rounding_source: 'scripts/innovations-reprice/stage-innov-reprice.mjs RETAIL() — "same formula as cadence-import"',
+    free_variable: 'LIST — per-pattern list price, per linear yard, from innovationsusa.com trade portal (acct 58315)',
+    price_unit: 'yard  (Innovations sold PER LINEAR YARD)',
+  },
+  one_remaining_input: 'per-pattern LIST price from the innovationsusa.com trade portal (acct 58315). '
+    + 'Creds NOT yet pasted, so LIST is unknown — this plan is fully parameterized on it.',
+  gated_write_fires_only_after: [
+    'portal creds land (Steve pastes innovationsusa.com acct 58315 login)',
+    'per-pattern LIST verified on the authenticated page (basis=LIST confirmed, not NET)',
+    'then: stage price cols, then run the add-yard/reprice (stage-innov-reprice.mjs) — Steve-gated (customer-facing money op)',
+  ],
+  target_columns: {
+    price_trade:      'net_cost = round(LIST * 0.90, 2)',
+    price_unit:       "'yard'",
+    our_price:        'retail = round(price_trade / 0.65 / 0.85, 2)',
+    price_source:     "'innovations portal <YYYY-MM-DD>'",
+    price_updated_at: 'now()',
+  },
+  retail_computed: false,
+  retail_blocked_reason:
+    'Per-pattern LIST price not yet available (portal creds unpasted). The two unknowns the pull '
+    + 'script guards (DISCOUNT + BASIS) are SETTLED for this plan — discount 10% (O-111475), basis LIST '
+    + '— so the ONLY remaining input is the LIST number itself. Once LIST lands per pattern: '
+    + 'price_trade = round(LIST*0.90,2); our_price = round(price_trade/0.65/0.85,2).',
+  worked_example: example,
+  pattern_pages: pages,
+  items: rows.map(r => ({
+    mfr_sku: r.mfr_sku,
+    pattern_name: r.pattern_name,
+    color_name: r.color_name,
+    product_url: r.product_url,
+    dw_sku: r.dw_sku || null,
+    width: r.width,
+    roll_length: r.roll_length,
+    price_unit_now: r.price_unit || null,
+    // formula wired symbolically — LIST is the free variable, filled in only after the portal pull
+    LIST_per_yard: null,
+    net_cost_formula: 'round(LIST * 0.90, 2)  -> price_trade',
+    retail_formula:  'round(net_cost / 0.65 / 0.85, 2)  -> our_price',
+    retail_computed: false,
+    retail_blocked_reason: 'awaiting per-pattern LIST from portal (creds unpasted)',
+  })),
+};
+
+fs.writeFileSync(path.join(OUTDIR, 'tk11041-dryrun-reprice-plan.json'), JSON.stringify(plan, null, 2));
+
+// ---- human-readable .md ---------------------------------------------------------------------
+const money = v => '$' + v.toFixed(2);
+let md = `# TK-11041 — Innovations dry-run reprice plan (READ-ONLY)
+
+_Generated ${now} · Mac2-local dw_unified.innovations_catalog · NO db write · NO Shopify write · NO email · NO deploy_
+
+## Cohort
+- **${plan.cohort.n} items** across **${plan.cohort.pattern_pages} unique pattern pages** (prefixes ${PREFIXES.join('/')}).
+- **${plan.cohort.priced_now}/39 currently carry a price** (price_trade / our_price / price_retail all NULL).
+- Excluded: ${plan.cohort.excluded}.
+- Integrity: ${plan.integrity_flags.join('; ')}.
+
+## Formula (LIST is the one free variable)
+\`\`\`
+net_cost = LIST * 0.90               # discount SETTLED 10%, HIGH conf — Sales Order O-111475
+retail   = net_cost / 0.65 / 0.85    # DW standard markup
+round    = Math.round(x*100)/100     # nearest cent (2dp) — matches stage-innov-reprice.mjs / cadence-import
+\`\`\`
+- Portal basis = **LIST** (discount applies on top). Price unit = **yard** (sold per linear yard).
+- Rounding source: \`scripts/innovations-reprice/stage-innov-reprice.mjs\` → \`RETAIL = c => Math.round((c/0.65/0.85)*100)/100\`.
+
+## The ONE remaining input
+**Per-pattern LIST price** from the innovationsusa.com trade portal (acct 58315). Creds not yet pasted.
+The gated write (stage price cols → then the add-yard/reprice) fires **only after** creds land **and** LIST is verified per pattern.
+
+## Worked EXAMPLE (PLACEHOLDER — not a real Innovations price)
+LIST = ${money(PLACEHOLDER_LIST)}/yard →
+net_cost = round(${money(PLACEHOLDER_LIST)} × 0.90) = **${money(example.step1_net_cost.value)}** (→ price_trade) →
+retail = round(${money(example.step1_net_cost.value)} / 0.65 / 0.85) = **${money(example.step2_retail.value)}** (→ our_price)
+
+## Target columns (staged only after LIST verified — GATED)
+| column | value |
+|---|---|
+| price_trade | round(LIST × 0.90, 2) |
+| price_unit | 'yard' |
+| our_price | round(price_trade / 0.65 / 0.85, 2) |
+| price_source | 'innovations portal <YYYY-MM-DD>' |
+| price_updated_at | now() |
+
+\`retail_computed: false\` carried on every row until LIST lands (matches the pull script's safety contract).
+
+## The 7 pattern pages
+| # | pattern | prefix | items | width | roll_length | product_url |
+|---|---|---|---|---|---|---|
+`;
+pages.forEach((p, i) => {
+  md += `| ${i + 1} | ${p.pattern_name} | ${p.prefix} | ${p.item_count} | ${p.width} | ${p.roll_length} | ${p.product_url} |\n`;
+});
+
+md += `\n## All 39 items (LIST column blank — filled only after the portal pull)\n`;
+md += `| mfr_sku | pattern | colorway | width | roll_length | LIST | net_cost=LIST×0.90 | retail=net/0.65/0.85 |\n`;
+md += `|---|---|---|---|---|---|---|---|\n`;
+for (const r of rows) {
+  md += `| ${r.mfr_sku} | ${r.pattern_name} | ${r.color_name} | ${r.width} | ${r.roll_length} | _(pending)_ | round(LIST×0.90) | round(net/0.65/0.85) |\n`;
+}
+md += `\n_39 rows. dw_sku is NULL in the local mirror for all 39 (identity/spec present; dw_sku not yet stamped here) — noted, not blocking the reprice math._\n`;
+
+fs.writeFileSync(path.join(OUTDIR, 'tk11041-dryrun-reprice-plan.md'), md);
+
+console.log(`cohort=${rows.length} pages=${pages.length} priced=${priced.length}`);
+console.log(`flags: ${plan.integrity_flags.join('; ')}`);
+console.log(`example: LIST ${money(PLACEHOLDER_LIST)} -> net ${money(example.step1_net_cost.value)} -> retail ${money(example.step2_retail.value)}`);
+console.log(`wrote tk11041-dryrun-reprice-plan.json + .md`);

← 334ea0d TK-11041: restore point before merging the 7-pattern price a  ·  back to Dw Unbuyable Recovery Pilot  ·  TK-11041: stage-reprice — 7 arriving numbers to a staged 39- 36062e5 →