← 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
A tk11041-innovations-reconcile/rescrape/tk11041-dryrun-reprice-plan.jsonA tk11041-innovations-reconcile/rescrape/tk11041-dryrun-reprice-plan.mdA tk11041-innovations-reconcile/rescrape/tk11041-dryrun-reprice-plan.mjs
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 →