{"slug":"dw-unbuyable-recovery-pilot","total":70,"limit":100,"offset":0,"since":null,"commits":[{"hash":"9f30b37","date":"2026-09-25 11:45:14 -0700","author":"Steve Abrams","subject":"TK-11042: repair.mjs writes a reversible-ledger row (with exact undo) after any live run","body":"Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01784gJRp1Re5s8HHMK5a86e"},{"hash":"a9bc366","date":"2026-09-25 11:24:31 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-25T11:23:40 (1 data files) — tk11042-quote-tag/data/plan.json","body":""},{"hash":"31a2a78","date":"2026-09-17 19:03:33 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-17T19:01:39 (1 data files) — tk11042-quote-tag/data/plan.json","body":""},{"hash":"e8277ec","date":"2026-09-15 10:17:45 -0700","author":"Steve Abrams","subject":"TK-11041 Innovations (Phillipe Romano) go-live: 39 repriced + made buyable + published; 18 width backfilled; Whistler dropped","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01EHBuQZQtbrc6yeNXFZfNLT"},{"hash":"d4fae99","date":"2026-09-15 09:35:22 -0700","author":"Steve","subject":"TK-11041: Innovations reprice — LIST basis, decimal-safe /0.65/0.85 markup, Skylark by-roll, current 2026-09-15 terms + auto-exclude disco rule","body":""},{"hash":"18ec8a3","date":"2026-09-14 14:20:17 -0700","author":"claude","subject":"TK-11252 fork-1: set 8 Hollywood/Versa dead-ends to DRAFT (Steve Option B), re-verify + undo scripts","body":""},{"hash":"0c20d0d","date":"2026-09-14 00:25:29 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-14T00:22:42 (1 data files) — tk11252-hollywood/unbuyable-live.json","body":""},{"hash":"9deb622","date":"2026-09-13 09:43:36 -0700","author":"Steve Abrams","subject":"TK-11252: complete live re-measure — 27 unbuyable, only 8 are real dead ends","body":"Adds enumerate-unbuyable.mjs (complete 72-page GraphQL walk, cross-checked\nagainst an independent REST count so a truncated walk cannot pass as complete;\nkeys on 'no NON-sample variant' rather than option1='Sample', which the original\n53-scan was blind to for 3 'Default Title' members), tags-probe.mjs, and\nverify-rendered.sh (fetches all 27 live PDPs following redirects and asserts\nwhether a customer actually gets a quote CTA).\n\nFinding: 19 of 27 render a working 'Request a Quote' CTA; 8 render nothing.\nThe 8 are all Versa Designed Surfaces (7 Aura A166-*, 1 Kibesillah A125).\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01EmWgsxVCLex9jdmmyzDTux"},{"hash":"995b159","date":"2026-09-12 08:32:27 -0700","author":"Steve Abrams","subject":"TK-11041: stage shopify_product_id backfill dry-run (39/39 clean 1:1 match, gated write + undo)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"a561f20","date":"2026-09-12 08:17:03 -0700","author":"Steve Abrams","subject":"TK-11041: disambiguate the two reprice tools before the wrong one gets run","body":"Two sessions independently built a reprice planner here hours apart. Same verified\nchain, but tk11041-dryrun-reprice-plan.mjs hardcodes basis=LIST (right for the portal,\nwhich does show list). The draft I merged asks Hektor for NET. Feed a net price to the\nLIST tool and it discounts an already-discounted number — ~10% under on 39\ncustomer-facing products, silently, because the arithmetic succeeds.\n\nThe email route makes that the LIKELY pairing, not an exotic one. This names which\ntool goes with which source, and records the Skylark MTO finding neither other path\nsurfaces.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>"},{"hash":"36062e5","date":"2026-09-12 08:16:01 -0700","author":"Steve Abrams","subject":"TK-11041: stage-reprice — 7 arriving numbers to a staged 39-SKU proposal in one command","body":"Formula VERIFIED, not assumed: across all 57 innovations_catalog rows carrying list,\ntrade and our_price together, trade/list = 0.9000 and our_price/trade = 1.8100\n(= 1/0.65/0.85) to 4dp. So list x0.90 = net, net x1.81 = retail.\n\n--basis is REQUIRED with no default. The vendor's own PDFs print LIST under a column\nheaded 'Net Price', so the label on the page cannot be trusted — a human says which\nnumber it is. Defaulting either way is a silent 10% error into customer-facing retail.\n\nShips 12 self-tests, the meaningful ones negative: missing basis throws, unknown basis\nthrows, a $0 or negative price throws rather than becoming $0 retail, and a sanity band\nagainst the Fall-2025 trend catches a quote that is 90% low (a wrong unit) instead of\npricing it. Unpriced SKUs are named, never silently dropped.\n\nFound while parsing the terms: Skylark (SKL-001..004) is MADE TO ORDER — no stock, no\ncut-fee code, MTO warehouse. My first parser silently dropped those 4 because its regex\nexpected 'Fee X'; fixed, and the tool now warns before they are made sellable.\n\nWrites nothing to dw_unified or Shopify.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>"},{"hash":"330f399","date":"2026-09-12 08:06:15 -0700","author":"Steve Abrams","subject":"TK-11041: dry-run reprice plan for 39 live PR-Innovations items (parameterized on portal LIST)","body":"39 items / 7 pattern pages, 0 priced. Wires net_cost=LIST*0.90 -> retail=net/0.65/0.85,\nrounded Math.round(x*100)/100 (matches stage-innov-reprice.mjs / cadence-import).\nREAD-ONLY: no dw_unified write, no Shopify write. Gated write fires only after portal\ncreds (acct 58315) land + per-pattern LIST verified.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KzajqT19xhuZnfZBBgLDr3"},{"hash":"334ea0d","date":"2026-09-12 08:00:26 -0700","author":"Steve Abrams","subject":"TK-11041: restore point before merging the 7-pattern price ask (merge done, NOT sent)","body":"Third restore point on this draft, so every version is one call from recovery:\noriginal letter, post-Whistler-merge, and now pre-price-ask.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>"},{"hash":"56bff11","date":"2026-09-12 07:34:38 -0700","author":"Steve Abrams","subject":"TK-11041: a 7-pattern price ask that could remove the portal blocker","body":"The email price lists showed Innovations prices at PATTERN level, so the 39 SKUs\nneed 7 numbers, not 39 — small enough to be answerable in one reply. A blanket\n'send your price list' was refused twice in 2026, but a narrow named ask has\nprecedent in this mailbox. The Whistler email is already going to Hektor; adding\nthis paragraph costs nothing and, if answered, makes the credential paste unnecessary.\n\nNot merged — the draft is agent_composed=false and Steve already chose send-as-is\nbefore this finding existed.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>"},{"hash":"9005ea5","date":"2026-09-12 07:32:28 -0700","author":"Steve Abrams","subject":"TK-11041: email price-list reconciliation for the 39 Innovations SKUs (read-only)","body":"Checked the two named Gmail attachments (Oct-2025 \"Fall 2025 Pricelist\", Jan-2025\n\"Pricelist-US\") plus widened search across info@ for fresher lists. Both PDFs cover\nall 7 target patterns (39/39 SKUs, priced at pattern level) but the newest is 11\nmonths stale (2025-10-01) and cross-pattern trend evidence proves it has since been\nsuperseded. Innovations has twice (2026-06-17, 2026-09-02) refused a fresh price-list\nrequest by email and redirected to the login-only portal, and DW's own reply\nyesterday (2026-09-11) already accepted that. Verdict: PARTIALLY -- coverage is\ncomplete but not current; portal remains the only channel with a live number.\nNo DB write, no Shopify write, no email sent."},{"hash":"0e76f2d","date":"2026-09-12 07:27:14 -0700","author":"Steve Abrams","subject":"TK-11041: make the auth-proof failure self-diagnosing instead of silently fatal","body":"Nobody here has seen innovationsusa.com logged in. The June 2026 crawl saved only\ncookies — no localStorage, no captured markup — so the 'Sign Out / My Account'\nmarkers the auth proof keys off are an INFORMED GUESS. If they are wrong, every\npage reports SESSION_FAILURE and the run looks exactly like bad credentials. That\nambiguity is the actual hazard, not the guess.\n\nOn auth-proof failure the script now dumps the identity-like lines the page really\ncarries, says plainly that this may be the marker guess rather than the login, and\nprints the one-line re-run with INNOVATIONS_AUTH_POSITIVE set. Markers are env-\noverridable so a fix needs no code edit. The diagnostic is also written into the\nstaged JSON.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>"},{"hash":"ecd3849","date":"2026-09-11 11:26:37 -0700","author":"Steve Abrams","subject":"TK-11041: the portal prices live per-colorway, not on the pattern page — add opt-in --deep","body":"Found by chasing the discount forensics' own lead: DW already ran an AUTHENTICATED\nInnovations crawl on 2026-06-17/18 (181 rows in innovations_catalog, price_source\n'innovationsusa authed crawl 2026-06-18; list x0.90; per-yd'). Its crawler\n(hollywood-import/innov-price.mjs) fetched /item/<pattern>/<sku> — per-COLORWAY URLs.\nMy script fetched only the 7 pattern pages, so a clean run could have returned\n7x NOT_MEASURED and read as 'the vendor has no prices'.\n\n--deep is opt-in, not a silent fallback, because robots Disallows /item/*/*. It prints\nthe conflict, throttles harder, and only fires for items whose pattern page had no price.\nDefault stays robots-clean.\n\nAlso settles the net-vs-list question with a hard artifact rather than the label heuristic:\nthe June crawl stored price_retail=134.95 (portal LIST) and price_trade=121.46 (list x 0.90),\nso the portal shows LIST and the 10% applies on top.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CGo6pAQho6w9xgqghMgNKh"},{"hash":"ba3e4f9","date":"2026-09-11 11:23:45 -0700","author":"Steve Abrams","subject":"TK-11041: one-line discount+basis question, ready to merge into the unsent Whistler draft","body":"There is already an unsent email to the one person who can end the 10%-vs-20% argument.\nAdding one sentence settles it for zero extra outbound, and also asks the net-vs-list\nquestion the portal pull structurally cannot answer from a page that just prints a number.\nOffered as a copy-paste block, NOT merged: the draft is agent_composed=false, so the next\naction on it is Steve clicking send.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CGo6pAQho6w9xgqghMgNKh"},{"hash":"b756810","date":"2026-09-11 11:23:40 -0700","author":"Steve Abrams","subject":"TK-11041: settle Innovations (acct 58315) discount conflict at 10% via vendor Sales Order O-111475 + Currier correction + DB corroboration","body":"Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CGo6pAQho6w9xgqghMgNKh"},{"hash":"00cbb25","date":"2026-09-11 11:23:00 -0700","author":"Steve Abrams","subject":"TK-11041: portal pull must capture WHICH price it read, not just the number","body":"A logged-in trade portal may show our NET price or the LIST price. Capturing the\nnumber without the basis is the same error class as the 10%-vs-20% discount conflict\nalready blocking this ticket: the number is real, it is just a number about a\ndifferent thing. If the portal shows LIST the discount applies on top; if NET it\ndoes not, and applying the wrong one is a silent cost-basis error that reaches\ncustomers through cost/0.65/0.85.\n\nextractPrice now reads the label around the number and records basis NET/LIST/UNKNOWN\nplus 120 chars of verbatim context so a human adjudicates in one glance. UNKNOWN is a\nlegitimate answer and is never guessed into NET. Four new negative tests, 11/11 PASS.\nOutput carries basis_unknown and the innovations_catalog target columns.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CGo6pAQho6w9xgqghMgNKh"},{"hash":"0e2141a","date":"2026-09-11 11:19:47 -0700","author":"Steve Abrams","subject":"TK-11041: portal-pull script written + self-tested (7/7), waiting only on the credential paste","body":"Converts the runbook from prose into a one-command run. Ships with negative tests:\nthe real captured logged-out /item/costine page must classify SESSION_FAILURE and yield\nno price, and a $0.00 token must be rejected — a positive-only test on a detector\nproves nothing. Credential-absent run exits 2 without opening a session ($0).\n\nCorrects the runbook: Browserbase solves the reCAPTCHA natively (solveCaptchas:true),\nno separate 2captcha call needed. 39 live items resolve to 7 pattern pages, one session.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CGo6pAQho6w9xgqghMgNKh"},{"hash":"6ca521c","date":"2026-09-11 08:47:24 -0700","author":"Steve Abrams","subject":"TK-11041: portal-pull runbook + second draft restore point (B done, A staged)","body":"Steve chose A+B.\n\nB (done): draft r-5469570474427181957 reduced to a short Whistler-only\nfollow-up, subject 'Re: Current trade price list request', opening by\nacknowledging Hektor's Sep-2 answer so it does not read as ignoring his reply.\nVerified: no provenance banner, no private-label names, labelIds=[DRAFT],\nNOT SENT. Two restore points now exist (pre-merge, post-merge).\n\nA (staged): the vendor told us pricing lives behind our own website login, so\nthe portal is the only path to net price. Registered INNOVATIONS_USERNAME /\n_PASSWORD / _LOGIN_URL in secrets routes.json on the DEDAR_*/OSBORNE_*\ntrade-portal precedent, and verified the endpoint read-only: /login is 200\n(stock Magento /customer/account/login/ 404s) and carries reCAPTCHA - so the\npull needs browserbase + 2captcha, not curl, with a cached session so we solve\none captcha rather than 39. Runbook includes the fail-loud rule: a logged-out\nshell is a session failure, never a $0 price.\n\nAlso records the open discount conflict - registry 10% vs 'Net Less 20%' on\nevery sample request - which must be settled before any retail is computed.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FXH75ac8BT9AFuzjiypPjU"},{"hash":"02a2486","date":"2026-09-11 08:23:44 -0700","author":"Steve Abrams","subject":"TK-11041: merge the Whistler/closeout paragraph into the vendor draft (approved; NOT sent)","body":"Steve approved the merge directly. Captured a verbatim pre-edit restore point\nfirst (undo/draft-r-5469570474427181957-PRESTATE.json) so a bad edit is a\none-call revert. Verified after the write: paragraph in the right position, no\n'From job: node' provenance banner injected, no DW or private-label names,\nsignature intact, one draft (updated in place, no duplicate).\n\nDraft remains UNSENT - awaiting_owner_send. The vendor has not been contacted,\nso the ticket stays blocked on Steve's send, not on the vendor.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FXH75ac8BT9AFuzjiypPjU"},{"hash":"02a570d","date":"2026-09-10 20:19:59 -0700","author":"Steve Abrams","subject":"Verify TK-11415 triage and resolve stale approval blocker","body":""},{"hash":"f0fd04b","date":"2026-09-10 18:22:34 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-10T18:07:04 (4 data files) — verification/TK-11415/README.md verification/TK-11415/client-tests.tap verification/TK-11415/dtd-verdict.md verification/TK-11415/e2e-proof.json","body":""},{"hash":"b85e3f9","date":"2026-09-10 17:59:38 -0700","author":"Steve Abrams","subject":"snapshot before TK-11415 verification evidence","body":""},{"hash":"109edc2","date":"2026-09-10 16:46:36 -0700","author":"Steve Abrams","subject":"TK-11041: the exact paragraph the (new, clean) Innovations draft still needs","body":"The Sep-4 agent draft is gone; a clean human draft r-5469570474427181957 replaced\nit today at 11:58 with the provenance banner and the bare signature both fixed.\nIt is still missing the one thing DTD verdict B required - naming Whistler and\nasking about closeout - without which the vendor's reply cannot answer Decision 2.\nParagraph supplied as a copy-paste block (prose + HTML) rather than written into\nthe draft: the next action on that object is Steve clicking send, so an\nagent-rewritten letter would read as unwitting approval.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FXH75ac8BT9AFuzjiypPjU"},{"hash":"8fcad7e","date":"2026-09-10 16:44:26 -0700","author":"Steve Abrams","subject":"TK-11041: recover the full Whistler spec block from the 2025 Wayback snapshot","body":"The prior lane read only the 2023-01-27 capture and concluded 'Wayback has no\nspec block', leaving the 12 WHL/La Orvito rows identity-only. There are 7\nWhistler snapshots; the newest (2025-10-17, HTTP 200) carries the complete\nSpecifications block. Recovered composition, backing, total weight, width,\nrepeat, full roll, fire rating and environmental, plus the full description.\n\nAlso sharpens the still-open Decision 2 on those 12 items with three new facts:\n  - Whistler was live on the vendor site as recently as 2025-10-17, so the\n    removal is RECENT (window 2025-10-17 .. 2026-09-10), not an old dead line\n  - the 'renamed?' branch is ruled out: no cork/Portugal pattern exists in the\n    live 371-page sitemap sweep (only VCO Vinyl Cork, a separate live pattern)\n  - the page dates it to a Fall 2022 introduction (~3-year lifecycle)\nA recent drop makes remaining/closeout stock MORE likely, which supports the\nDTD verdict-B 'hold and ask about closeout' rather than the archive-now dissent.\n\nCohort spec coverage 39/51 -> 51/51. Staging-table UPDATE only (12 rows,\nMac2-canonical), prestate + exact keyed undo in rescrape/undo/, ledgered.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FXH75ac8BT9AFuzjiypPjU"},{"hash":"850e06a","date":"2026-09-10 09:52:44 -0700","author":"Steve Abrams","subject":"TK-11041: final amended vendor letter + two defects found in the live draft","body":"Merged the Whistler/closeout paragraph into the REAL current draft body (read via\ngmail_get_message, not reconstructed). Flags two defects in the draft sitting in\nDrafts since Sep 4: a visible 'From job: node' provenance banner that would be sent\nto the vendor, and an unfilled 'Scott' signature.\n\nNot sent: George's externalSendGuard fail-closes on external recipients and requires\na human-approval token; did not self-approve past it.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>"},{"hash":"d609fc6","date":"2026-09-10 08:52:30 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-10T08:48:14 (1 data files) — tk11042-quote-tag/data/plan.json","body":""},{"hash":"ef59d38","date":"2026-09-10 07:50:43 -0700","author":"Steve Abrams","subject":"TK-11042: quote-CTA tag-normalization plan + gated executor + rollback","body":"Live audit shows the Track-B blocker premise was wrong: Koroseal 2449 and Maya\n620 are 100% correctly-configured quote-only (zero dead ends), while Marburg 112\nand Phillipe Romano 4,096 render as customer-facing dead ends purely because they\ncarry quote intent under a tag name the theme does not trigger on. No vendor cost\ndata is required to fix any of it.\n\nRead-only plan builder + verify-before-act executor + byte-for-byte rollback.\nNOTHING FIRED — live execution is Steve-gated.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01RzTjJ25kmRFTvTjgA28Pwa"},{"hash":"cf73947","date":"2026-09-10 07:45:31 -0700","author":"Steve Abrams","subject":"TK-11041: Innovations re-scrape recovers 51/51 identities (0 mismatches); WHL=Whistler discontinued","body":"Overturns the 2026-09-02 '0/51 recoverable' finding: CSO/ENS/FLN/PRO/SKL/TTM/VCO/WHL\nare real Innovations item-number prefixes, not DW-internal codes. Feed-first $0\nread-only sweep of innovationsusa.com sitemap (371 pattern pages, robots-compliant)\nresolves every one of the 51 to pattern + colorway + specs + image.\n43 exact colorway matches, 7 prefix, 1 DW-unnamed, 0 mismatches.\nWHL (12 items) = Innovations Whistler, DISCONTINUED — recovered via Wayback; those\n12 should be archived, not repriced. Price remains vendor-gated (no public prices).\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_018M72uDgM1SgEh3Ma4QgcCw"},{"hash":"b5b3182","date":"2026-09-04 15:01:47 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-04T14:52:10 (1 data files) — tk11252-hollywood/created-all.json","body":""},{"hash":"cf93e58","date":"2026-09-04 14:33:31 -0700","author":"Steve","subject":"TK-11252 Tier 2: make 7 more unbuyable Hollywood products buyable","body":"5 Sold-Per-Yard (DUR/XWH/XWJ) + 2 Single-Roll (Senza A200). Price, option name,\ninventory policy and tracked flag all read PER-LINE from live sellable siblings\nrather than hardcoded — the canary caught a wrong option-name mapping, a value\nnot reaching the mutation, and a wrong tracked flag before the batch. 7/7 verified.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_011rLMRd91EREgUHbEMQDNiy"},{"hash":"dc82409","date":"2026-09-04 12:25:53 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-04T12:10:54 (1 data files) — tk11252-hollywood/targets-tier2.tsv","body":""},{"hash":"109df2d","date":"2026-09-04 11:30:14 -0700","author":"Steve","subject":"TK-11252: add sellable Single Roll variants to 18 unbuyable Hollywood products","body":"18 ACTIVE Hollywood Wallcoverings products had only a $4.25 sample variant and\ncould not be bought. Price sourced per-product from its own pattern's live\nsellable siblings (8-36 identically-priced siblings each). Canary-first, then 17.\nVerified 18/18 live. Undo script + created.json variant ids included.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_011rLMRd91EREgUHbEMQDNiy"},{"hash":"1313e2e","date":"2026-09-02 16:28:42 -0700","author":"Steve Abrams","subject":"Correct TK-11133 proof timestamp","body":""},{"hash":"50bf192","date":"2026-09-02 16:26:53 -0700","author":"Steve Abrams","subject":"Extend TK-11133 boundary proof","body":""},{"hash":"e2d53f7","date":"2026-09-02 16:26:22 -0700","author":"Steve Abrams","subject":"Fail closed on Momentum search errors","body":""},{"hash":"c3a2933","date":"2026-09-02 16:19:38 -0700","author":"Steve Abrams","subject":"Record E2E proof for credential containment","body":""},{"hash":"e31ba08","date":"2026-09-02 16:19:12 -0700","author":"Steve Abrams","subject":"Remove hardcoded Meilisearch credential from Momentum audit","body":""},{"hash":"defc1cb","date":"2026-09-02 15:42:28 -0700","author":"Steve Abrams","subject":"TK-10978: Rebel Walls RS-orphan archive complete — 455/455 (215 batch-2 + 240 batch-1), 0 failed","body":"Steve-approved archive of stale RS-series duplicate products whose R-series\ntwin is already ACTIVE+buyable. Verified live: 4-sample spot-check confirms\norphans archived, twins remain active with buyable Sold Per Square Meter\nvariant + Sample preserved. Reversible via archive-rollback.mjs (restore\nprior status from prestate.jsonl).\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_019rsXQme52WNRYJAdh3MirZ"},{"hash":"3c3e915","date":"2026-09-02 15:33:04 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-02T15:21:07 (1 data files) — tk10978-rebelwalls/data/archive-prestate.jsonl","body":""},{"hash":"8085c23","date":"2026-09-02 13:56:29 -0700","author":"Steve Abrams","subject":"TK-11041: Innovations 51-cohort feed-first reconciliation — 0/51 locally recoverable + provenance guard","body":"Deterministic read-only recovery map for the 51 ACTIVE sample-only PR-Innovations\nproducts. All local recovery keys yield 0 (sku/dw_sku/mfr_sku joins + feed-first\npattern-token match): the cohort carries only DW-internal collection codes with no\nreal Innovations item#/price, and innovations_catalog describes the Innovations USA\n(DWIN-) line, not the PR private-label (236/341 no provenance URL, 81/341 fabricated\npattern-tail codes). Recovery correctly stays BLOCKED_ON_VENDOR_LINESHEET (gated email).\n\nShips lib/provenance.mjs guard (rejects no-URL / placeholder / lowercase-tail /\npattern-tail codes) encoding the TK-10981 fabrication caveat, with a 7/7 test incl. a\nLIVE assertion that 0 fabricated catalog rows are wrongly trusted. No canonical/Shopify\nwrites; reads via BEGIN READ ONLY..ROLLBACK.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GUmvA1WvsNnWhXfhLgz7q2"},{"hash":"e88e5d3","date":"2026-09-02 13:19:21 -0700","author":"Steve Abrams","subject":"TK-11124: add per-yard $359 sellable variant to 18 sample-only DWVE Velvet Walls (Phillipe Romano) — now buyable, samples intact","body":""},{"hash":"1af16b4","date":"2026-09-02 12:55:12 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-02T12:46:36 (1 data files) — tk10978-rebelwalls/data/archive-prestate.jsonl","body":""},{"hash":"fe0b011","date":"2026-09-02 12:18:11 -0700","author":"steve","subject":"TK-10978 RebelWalls: one-command archive rollback (restore prior status from prestate)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"cdd5b64","date":"2026-09-02 12:16:32 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-02T12:07:47 (8 data files) — tk10978-rebelwalls/data/archive-454-duplicates.csv tk10978-rebelwalls/data/archive-prestate.jsonl tk10978-rebelwalls/data/archive-skips.json tk10978-rebelwalls/data/investigate-39-no-twin.csv tk10978-rebelwalls/data/rescrape-39-summary.json","body":""},{"hash":"4101e6d","date":"2026-09-02 12:06:48 -0700","author":"steve","subject":"TK-10978 RebelWalls: focused 39-no-twin re-scrape — 31/39 vendor-404, 0 recoverable -> defer","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"ae3731d","date":"2026-09-02 11:59:14 -0700","author":"steve","subject":"TK-10978 RebelWalls: read-only recon + reversible archive executor (scope-inversion evidence; nothing fired)","body":"454/494 unbuyable RS-orphans are stale duplicates of already-buyable R-twins; archive (not make-buyable). Dry-run proven on 5.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"548c7af","date":"2026-09-02 09:50:53 -0700","author":"Steve Abrams","subject":"TK-10978 pre-approval audit: Coordonné 136 dry-run broken (dirty mfr_sku, join=0, content-match=0); Donghia moot (2 left); RW=280 only recoverable cohort. Read-only, no writes","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"e1bec63","date":"2026-09-02 09:48:13 -0700","author":"Steve Abrams","subject":"TK-10978 Rebel Walls RW-494 CORRECTED dry-run: RS-series absent from catalog (not identity join); content-match yields 280 safe / 10 ambiguous / 204 need re-scrape; pilot-gated, no writes","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"9a9548c","date":"2026-08-31 11:58:49 -0700","author":"Steve Abrams","subject":"TK-10978 PR-Momentum recovery complete: 547 acted + 20 pilot = 567 buyable (Sold Per Yard @ hw_price), 0 fail, 567 ledgered","body":""},{"hash":"7e09367","date":"2026-08-31 11:34:16 -0700","author":"Steve Abrams","subject":"TK-10978 PR-Momentum add-yard recovery tooling: 567 clean (momentum_colorways hw_price per-yard join), dry-run 20/0/0; awaiting explicit pilot consent","body":""},{"hash":"6f992ff","date":"2026-08-31 11:25:32 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-31T11:17:15 (4 data files) — tk10978-coordonne/data/prestate.jsonl tk10978-coordonne/data/skips.json tk10978-donghia/data/prestate.jsonl tk10978-donghia/data/skips.json","body":""},{"hash":"e430ce2","date":"2026-08-31 11:05:23 -0700","author":"Steve Abrams","subject":"TK-10978 Coordonné add-roll recovery tooling: 136 clean (mfr_sku join, sell at MSRP=price_retail, empirically matches live $169), dry-run","body":""},{"hash":"a12fffc","date":"2026-08-31 11:00:24 -0700","author":"Steve Abrams","subject":"TK-10978 Donghia add-roll recovery tooling: plan builder (152 clean, mfr_sku identity join, trade/0.65/0.85) + reused executor; dry-run 152/0/0 clean live-verified","body":""},{"hash":"c686975","date":"2026-08-30 23:55:52 -0700","author":"Steve","subject":"chore: lint + light refactor (session close)","body":""},{"hash":"5a24ba1","date":"2026-08-30 23:40:40 -0700","author":"Steve Abrams","subject":"TK-10978: VERIFY correction — Track 0 quote-only 'free prize' is a phantom (5271/5474 already correctly quote-tagged; PF is do_not_price=false; real gap ~203)","body":""},{"hash":"47d9d7f","date":"2026-08-30 23:37:13 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-30T23:23:51 (1 data files) — data/cost-sourcing-feasibility.md","body":""},{"hash":"7c8e401","date":"2026-08-30 18:15:55 -0700","author":"Steve","subject":"TK-10978 Scalamandre add-roll recovery complete: 124 acted + 20 skip + 0 fail, all buyable (inventory_policy=continue), sample $4.25 kept, 144 ledgered w/ undo","body":""},{"hash":"b379051","date":"2026-08-30 18:07:21 -0700","author":"Steve Abrams","subject":"TK-10978 Scalamandre pilot: 20 add-roll live+verified buyable; caught+fixed deny/qty0 unbuyable defect, executor now creates continue","body":""},{"hash":"039b070","date":"2026-08-30 18:04:06 -0700","author":"Steve Abrams","subject":"TK-10978 Scalamandre add-roll: plan builder (144 clean, 6 conflicts excluded) + repair + rollback tooling, dry-run pilot clean","body":""},{"hash":"8408ecf","date":"2026-08-30 17:56:19 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-30T17:49:20 (1 data files) — data/scalamandre-exact-recovery.csv","body":""},{"hash":"c815a74","date":"2026-08-30 16:54:30 -0700","author":"Steve Abrams","subject":"TK-10978: Scalamandre content-match reconciliation — 133 recoverable (dry-run)","body":"Bridged the DWA↔DWSC SKU-identity gap via pattern+color content-match. 133/474 unique\nhigh-precision matches (8/8 spot-verified exact); live-confirmed all sample-only =>\nadd-roll recovery. 38 ambiguous + 303 no-match held. Gated memo drafted to pending-approval.\nDry-run list: data/scalamandre-reconcile-dryrun.csv. No writes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"4f00877","date":"2026-08-30 15:47:20 -0700","author":"Steve Abrams","subject":"TK-10875: next-cohort scan — WG was the only bounded recoverable cohort","body":"Tested corrected join + cost-population across 12 top unbuyable vendors. All others:\neither empty staging cost columns (PR/China Seas/Arte/Malibu/PJ/Coordonné → cost-sourcing)\nor cost present but keys diverge (Scalamandre: 4,877 costed rows, DWA vs DWSC + mismatched\nmfr → identity-reconcile). No other quick-win cohort. Bounded recovery COMPLETE.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"6ee445d","date":"2026-08-30 10:10:30 -0700","author":"Steve Abrams","subject":"TK-10875: regenerate artifacts + broaden live RR-defect verification (16 products)","body":"Mirror lock cleared; regenerated classify + pilot artifacts (25,214 unbuyable; WG\n224 recoverable via restructure). Broadened live-Shopify verification to 12 more\ndistinct WG patterns ($54.75-$77.38) + the earlier 4 (up to $343.80) = 16 products,\nALL confirmed RR-defect (single option1=Sample variant @ roll retail). Evidence in\ndata/live-verification.txt. Still zero writes; restructure remains GATED.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"8fb27f0","date":"2026-08-30 09:54:21 -0700","author":"Steve Abrams","subject":"TK-10875: EMPIRICAL correction — WG 224 are RR-defect, recoverable via restructure","body":"Empirical test gate (yoloforever) drove the claim against LIVE Shopify and reversed\nthe conclusion again — the decisive finding:\n- The 224 WG 'unbuyable' products each have a SINGLE variant with option1='Sample'\n  priced at ROLL RETAIL ($54.75..$343.80), not $4.25. Verified on 4 products across\n  the price range. This is the RR-defect (TK-10875-130 class), NOT already-sellable\n  and NOT clean sample-only — both prior conclusions were wrong.\n- The mirror CANNOT classify this: it carries no variant option1 and is price-stale\n  (one product read $180.90 mirror vs $343.80 live; sync 13 days dead).\n- Recovery = variant restructure (relabel Sample->Sold Per Roll @ trade/0.65/0.85 +\n  add $4.25 Sample), reversible+ledgered per TK-10875-130 — GATED customer-facing write.\n- Fixed shopify_id vs internal-id bug; executor must read live + recompute from staging.\n\nArtifacts marked REGEN_PENDING: a live mirror lock pileup (ALTER TABLE shopify_products\nqueued behind a 35-min analytical query) is blocking shopify_products reads. Code is\ncorrect; regenerate data/ when the lock clears.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"af9c3e5","date":"2026-08-30 09:36:09 -0700","author":"Steve Abrams","subject":"TK-10875: harden pilot after contrarian + Kimi red-team — stale-flag guard","body":"Contrarian caught the decisive flaw: the 224 Wolf Gordon 'recoverable' products\nalready have a correctly-priced single roll variant in Shopify — has_product_variant\nis a STALE mirror flag (dead sync job), so 'recovery' would double-add.\n\n- Add stale-flag guard (variant_count=1 + non-null non-sample SKU + price>$4.50):\n  classify + pilot now split already-sellable(224) vs genuinely-sample-only(24990)\n- Pilot yields 0 truly-buildable; conclusion = fix sync + confirm live Shopify first\n- Relabel the pricing cross-check honestly (tautological, not price validation)\n- Note Coordonné DWCO2<->DWDC prefix reconcile path (not a dead end)\n- db.mjs: ON_ERROR_STOP=1 so bad SQL fails loud instead of empty result\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"b634b70","date":"2026-08-30 09:24:39 -0700","author":"Steve Abrams","subject":"TK-10875: unbuyable classification + Wolf Gordon dry-run recovery pilot (read-only)","body":"- classify.mjs: 25,214 ACTIVE unbuyable; row-level cost drained; vendor breakdown\n- pilot.mjs: Wolf Gordon 224/269 recoverable via corrected join, pricing 224/224 cross-checked\n- Documents the join-key column-swap (shopify.sku = catalog.dw_sku) that made prior\n  table-total estimates overcount ~10x\n- lib/db.mjs: BEGIN READ ONLY via stdin (two psql traps found+fixed), zero writes\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n"}]}