[object Object]

← back to Dw Unbuyable Recovery Pilot

TK-11041: portal-pull runbook + second draft restore point (B done, A staged)

6ca521c3e6900117901e15aced8bfdfdaef7f5c4 · 2026-09-11 08:47:24 -0700 · Steve Abrams

Steve chose A+B.

B (done): draft r-5469570474427181957 reduced to a short Whistler-only
follow-up, subject 'Re: Current trade price list request', opening by
acknowledging Hektor's Sep-2 answer so it does not read as ignoring his reply.
Verified: no provenance banner, no private-label names, labelIds=[DRAFT],
NOT SENT. Two restore points now exist (pre-merge, post-merge).

A (staged): the vendor told us pricing lives behind our own website login, so
the portal is the only path to net price. Registered INNOVATIONS_USERNAME /
_PASSWORD / _LOGIN_URL in secrets routes.json on the DEDAR_*/OSBORNE_*
trade-portal precedent, and verified the endpoint read-only: /login is 200
(stock Magento /customer/account/login/ 404s) and carries reCAPTCHA - so the
pull needs browserbase + 2captcha, not curl, with a cached session so we solve
one captcha rather than 39. Runbook includes the fail-loud rule: a logged-out
shell is a session failure, never a $0 price.

Also records the open discount conflict - registry 10% vs 'Net Less 20%' on
every sample request - which must be settled before any retail is computed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FXH75ac8BT9AFuzjiypPjU

Files touched

Diff

commit 6ca521c3e6900117901e15aced8bfdfdaef7f5c4
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Fri Sep 11 08:47:24 2026 -0700

    TK-11041: portal-pull runbook + second draft restore point (B done, A staged)
    
    Steve chose A+B.
    
    B (done): draft r-5469570474427181957 reduced to a short Whistler-only
    follow-up, subject 'Re: Current trade price list request', opening by
    acknowledging Hektor's Sep-2 answer so it does not read as ignoring his reply.
    Verified: no provenance banner, no private-label names, labelIds=[DRAFT],
    NOT SENT. Two restore points now exist (pre-merge, post-merge).
    
    A (staged): the vendor told us pricing lives behind our own website login, so
    the portal is the only path to net price. Registered INNOVATIONS_USERNAME /
    _PASSWORD / _LOGIN_URL in secrets routes.json on the DEDAR_*/OSBORNE_*
    trade-portal precedent, and verified the endpoint read-only: /login is 200
    (stock Magento /customer/account/login/ 404s) and carries reCAPTCHA - so the
    pull needs browserbase + 2captcha, not curl, with a cached session so we solve
    one captcha rather than 39. Runbook includes the fail-loud rule: a logged-out
    shell is a session failure, never a $0 price.
    
    Also records the open discount conflict - registry 10% vs 'Net Less 20%' on
    every sample request - which must be settled before any retail is computed.
    
    Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01FXH75ac8BT9AFuzjiypPjU
---
 .../rescrape/PORTAL-PULL-RUNBOOK.md                | 49 ++++++++++++++++++++++
 ...-5469570474427181957-PRESTATE-2-post-merge.json | 11 +++++
 2 files changed, 60 insertions(+)

diff --git a/tk11041-innovations-reconcile/rescrape/PORTAL-PULL-RUNBOOK.md b/tk11041-innovations-reconcile/rescrape/PORTAL-PULL-RUNBOOK.md
new file mode 100644
index 0000000..f4dfb8b
--- /dev/null
+++ b/tk11041-innovations-reconcile/rescrape/PORTAL-PULL-RUNBOOK.md
@@ -0,0 +1,49 @@
+# TK-11041 — Innovations portal price pull: ready-to-run the moment credentials land
+
+## Why this is the only path
+The price-list request was sent 2026-09-02 (`1a063182c1841f68`) and Hektor Martinez answered the same
+day (`1a0633c9451e4658`): *"Pricing is available through our website using your login information.
+Account # 58315."* There is no line sheet coming. Public pages carry **zero** price tokens (verified
+across all 371 pattern pages), and no pattern-sibling price exists locally. So net price for the 39
+live-pattern items comes from the logged-in portal or not at all.
+
+## Credentials — already routed, just needs the paste
+`routes.json` now carries `INNOVATIONS_USERNAME`, `INNOVATIONS_PASSWORD`, `INNOVATIONS_LOGIN_URL`
+(added TK-11041, backup alongside). Paste them and the `secrets` skill fans them to the master `.env`
+plus the shared import engine's `.env` / `.env.local`, matching the existing `DEDAR_*` / `OSBORNE_*`
+trade-portal precedent. **Do not hand-edit the env files.**
+
+## Verified recon (read-only, 2026-09-11)
+| Fact | Value |
+|---|---|
+| Login URL | `https://www.innovationsusa.com/login` → **200**, password field, "Sign In", "Trade" |
+| Stock Magento paths | `/customer/account/login/` and `/customer/account/` both **404** — not stock routing |
+| Bot defence | **reCAPTCHA present on the login page** |
+| Account | **58315**, and every DW sample request states **"Net Less 20%"** |
+
+## Consequence: this needs a real browser, not curl
+reCAPTCHA rules out a plain fetch login. Run it through the **`browserbase`** skill (cloud Chromium)
+with **`2captcha`** for the solve — both are already credentialed. Login is a **one-time session**;
+cache cookies and reuse them so we solve one captcha, not 39.
+
+**Estimated cost:** ~**$0.003** per captcha solve + one Browserbase session (a few cents). Call it
+**well under $0.10** for the whole pull if the session is cached. Actual will be logged to the cost
+ledger. Everything up to this point in the ticket has been **$0**.
+
+## The pull, in order
+1. `secrets` skill → confirm `INNOVATIONS_USERNAME` / `INNOVATIONS_PASSWORD` resolve (last-4 digest only).
+2. Browserbase session → `https://www.innovationsusa.com/login`, 2captcha solve, authenticate, **persist cookies**.
+3. For each of the **39 live-pattern** `mfr_sku` in `data/innovations-identity-map.json`
+   (`site_state=="live"` — i.e. everything except the 12 WHL), fetch its `product_url` **authenticated**
+   and extract the net price + unit. Throttle ~0.35s as the public sweep did.
+4. **Assert before trusting:** a price must be present and numeric, and the unit must be captured.
+   A page that returns the logged-out shell (no price) is a **session failure, not a $0 price** — fail
+   loud rather than recording zero. This is the rule the $0-orderable lineage exists to enforce.
+5. Reconcile the discount: registry says **10%**, every sample request says **Net Less 20%**. Do **not**
+   compute retail until that is settled — a 10-point cost-basis error propagates through `cost/0.65/0.85`.
+6. Stage results, then the **gated** add-yard recovery for the 39. Nothing goes to Shopify unprompted.
+
+## The 12 Whistler items are NOT in this pull
+They're discontinued and 404 on the vendor site; no logged-in page exists to price. Their answer comes
+from the Whistler follow-up draft (`r-5469570474427181957`), which Hektor will almost certainly answer —
+on 2026-09-10 he volunteered *"Chevron Cork has been discontinued. CRC-02 - 62LY in stock."* unprompted.
diff --git a/tk11041-innovations-reconcile/rescrape/undo/draft-r-5469570474427181957-PRESTATE-2-post-merge.json b/tk11041-innovations-reconcile/rescrape/undo/draft-r-5469570474427181957-PRESTATE-2-post-merge.json
new file mode 100644
index 0000000..c0cbf51
--- /dev/null
+++ b/tk11041-innovations-reconcile/rescrape/undo/draft-r-5469570474427181957-PRESTATE-2-post-merge.json
@@ -0,0 +1,11 @@
+{
+  "ticket": "TK-11041",
+  "captured_at": "2026-09-11T15:30Z",
+  "purpose": "Second restore point: the state AFTER the approved Whistler-paragraph merge and BEFORE the approved reduction to a Whistler-only follow-up. PRESTATE-1 (...-PRESTATE.json) is the original pre-merge letter. Either can be restored via gmail_update_draft.",
+  "account": "info",
+  "draftId": "r-5469570474427181957",
+  "messageId": "1a09110cd023f954",
+  "to": "hmartinez@innovationsusa.com",
+  "subject": "Current trade price list request",
+  "body": "<p>Hello,</p>\n<p>We carry your wallcoverings and are updating our pricing. Could you please send your <strong>current trade (net) price list / line sheet</strong> for your wallcovering line, including:</p>\n<ol>\n<li>net price per pattern/colorway,</li>\n<li>the <strong>unit</strong> each is sold by (per yard / per roll / per bolt) and the <strong>roll size / coverage</strong>,</li>\n<li><strong>current minimum order</strong> requirements, and</li>\n<li>any <strong>quantity or trade-discount tiers</strong> that apply to our account.</li>\n</ol>\n<p>One specific question as well: is <strong>Whistler</strong> still available in any form &mdash; current production, remaining inventory, or closeout? We show it in our records but can no longer find it on your site. If it has been discontinued, please let us know whether any stock remains and, if so, the quantity and pricing; if it has been renamed or replaced, we'd appreciate the current name.</p>\n<p>If it's easier to send the full current catalog pricing, that's perfect &mdash; we'll match it to our records on our end. Please let me know if you need our account number or any other detail to pull the correct pricing.</p>\n<p>Thank you for your help.</p>\n<p>Best regards,</p>\n<p><strong>Scott</strong><br>Purchasing<br>Designer Wallcoverings<br>info@designerwallcoverings.com</p>"
+}

← 02a2486 TK-11041: merge the Whistler/closeout paragraph into the ven  ·  back to Dw Unbuyable Recovery Pilot  ·  TK-11041: portal-pull script written + self-tested (7/7), wa 0e2141a →