{"slug":"gmc-titlefix","total":189,"limit":100,"offset":0,"since":null,"commits":[{"hash":"8734481","date":"2026-09-26 09:16:40 -0700","author":"Steve Abrams","subject":"TK-11897: durable Google-only exclusion prepared (supplemental ds10677010255 excludedDestinations) - 0 prior rows recorded, dry-run would_insert 99, rollback dry-run 99; NOT fired","body":"Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GtefE2GDYpR1uuZZiqNVjV"},{"hash":"4f273ef","date":"2026-09-26 08:48:08 -0700","author":"Steve","subject":"TK-11897: Option B FIRED by Steve's direction — 99/99 Gravel Path offers withdrawn from ds 180695450 (canary 1 + 98, 0 failed); post-fire census matched 0","body":"Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GtefE2GDYpR1uuZZiqNVjV"},{"hash":"b8cafe3","date":"2026-09-26 08:28:43 -0700","author":"Steve Abrams","subject":"TK-11897: Option B withdraw prep (HELD) - live re-measure 99/99 on ds180695450, preimages sha effbef2d, double-gated withdraw + rollback, dry-run 99 would_delete","body":"Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GtefE2GDYpR1uuZZiqNVjV"},{"hash":"2a68674","date":"2026-09-25 11:49:39 -0700","author":"Steve","subject":"TK-11450: APPLIED v2 CA restore — 41 inputs re-inserted, 0 failed (Steve-approved)","body":"Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_015SYWczdX19LZ3mPb7fz2iF"},{"hash":"82f2f09","date":"2026-09-25 11:42:46 -0700","author":"Steve","subject":"TK-11450: hardened v2 CA restore (variant-pinned en-ca links, PJ/archived/drift exclusions, samples held, honest NOT_MEASURED) + parity preflight; dry-run 41/27/8/0","body":"Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_015SYWczdX19LZ3mPb7fz2iF"},{"hash":"3e29ec4","date":"2026-09-25 11:36:52 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-25T11:35:27 (5 data files) — data/tk11450-ca-restore-map-2026-09-25T18-25-39.json data/tk11450-ca-restore-preflight-parity-2026-09-25T18-27-27.json data/tk11450-ca-restore-v2-cohorts.json data/tk11450-ca-restore-v2-map-2026-09-25T18-31-09.json data/tk11450-ca-restore-v2-map-2026-09-25T18-32-58.json","body":""},{"hash":"259f3af","date":"2026-09-24 13:20:56 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-24T13:20:22 (1 data files) — data/tk11847-colorway-override-dryrun-2026-09-24T19-58-51.json","body":""},{"hash":"2164b4c","date":"2026-09-24 13:18:03 -0700","author":"Steve","subject":"chore: lint, refactor (session close) + track TK-11847 APPLY rollback artifact","body":"Behavior-preserving: saveState/fmtOffer helpers in merge-recheck; drop dead\nlastResultArtifact var in override script. node --check + dry-run clean.\nNo version field in repo (no bump).\n\nCo-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Sb592So8iWsxtsmVsiTMfq"},{"hash":"c36bba2","date":"2026-09-24 13:10:58 -0700","author":"Steve","subject":"TK-11847 add merge-recheck script; verified PASS — all 6 overrides merged, no longer legal_restrictions-disapproved","body":"Confirms the --apply run cleared all 6 offers within ~10 minutes: color+material\nattributes merged and none still legal_restrictions_policy_violation-disapproved.\nLaunchd durable-cron memo superseded (no longer needed) — moved to _done/.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Sb592So8iWsxtsmVsiTMfq"},{"hash":"7b93cd7","date":"2026-09-24 12:59:03 -0700","author":"Steve","subject":"TK-11847 fix double Response-body read in APPLY path","body":"d9f83a8 called resp.json() then resp.text() on the same Response; on a\nsuccessful insert the second read throws 'Body is unusable' (a TypeError\nthe transport guard does not match), crashing after the first live write\nbefore its result/realName was flushed. Read the body once, JSON.parse it.\nVerified: node --check, mock-Response repro of old vs new, DRY-RUN clean\n(6/6 LR, zero writes).\n\nCo-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Sb592So8iWsxtsmVsiTMfq"},{"hash":"d9f83a8","date":"2026-09-24 12:56:33 -0700","author":"Steve","subject":"TK-11847 Fix Option B: incremental result persistence, transport-error handling, and --from-artifact rollback path","body":"- Move result persistence inside the loop (after each write) so a transport failure mid-loop leaves an audit trail\n- Wrap fetch in try/catch to detect and exit loudly on transport errors (network/DNS/TLS failures)\n- Parse the real resource 'name' from successful insert responses and store it for rollback use\n- Require --from-artifact <path> on rollback to read the prior APPLY artifact\n- If --from-artifact is missing on rollback, fail with exit code 1 and print usage\n- Rollback now deletes by the real resource names (avoiding 404s on legacy-feed products)\n- Fall back to guessed names if realName is absent (backward compat with old APPLY artifacts)\n\nAll three findings from the code review are now addressed:\n(1a) Incremental persistence prevents loss of the audit trail on transport failure\n(1b) Rollback now uses the actual created names from the APPLY artifact\n(2) --from-artifact enforces correct rollback behavior and prevents silent 404s\n\nDry-run behavior is unchanged (zero writes before line 92).\n\nCo-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Sb592So8iWsxtsmVsiTMfq"},{"hash":"b01c159","date":"2026-09-24 12:50:20 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-24T12:49:23 (1 data files) — tk11847-colorway-override.PATCH.md","body":""},{"hash":"c2e8ed1","date":"2026-09-23 12:00:07 -0700","author":"Steve","subject":"TK-11847 Option B script: fold in Kimi review (front-load wallcovering/material in description, productTypes list sent as exact sibling value, post-insert merge readback, 72h-then-appeal rule). Still dry-run only.","body":"Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01PP5PN6yC4vLgDAvFqpS1qJ"},{"hash":"fa224f8","date":"2026-09-23 11:53:07 -0700","author":"Steve","subject":"TK-11847 09-23 re-measure (7/29 still LR, parity 28/1 unchanged, no appeal fired) + feed-side root-cause read (desc==title on 6/7, zero color/material attrs) + staged DRY-RUN colorway/material/description supplemental override for the 6 (Option B, gated, rollback via productInputs.delete). Zero writes fired.","body":"Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01PP5PN6yC4vLgDAvFqpS1qJ"},{"hash":"16e8078","date":"2026-09-22 14:51:06 -0700","author":"Steve","subject":"TK-11731: --apply fires the dry-run cohort snapshot with a canary_ts drift guard, not a fresh live-canary read","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01DP24DdLpG6PHXgmjr47TVb"},{"hash":"10a3116","date":"2026-09-18 11:06:52 -0700","author":"Steve Abrams","subject":"TK-11898 Option B EXECUTED (Steve-approved): 30/30 dead-vid GMC offers deleted via productInputs.delete on ds180695450, final readback 30/30 GONE (404). Removed the 2 mis-priced ads (Bold Dahlia $191, Latigo $43.76) + 28 dead-vid sample offers. 22/30 were product's only offer (measured, all sample-only). $0.","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_012Xkg7MT5FYYmJF5ovKBsko"},{"hash":"5ee7b7a","date":"2026-09-18 11:02:15 -0700","author":"Steve Abrams","subject":"TK-11898 Option B executor: productInputs.delete for the 30 dead-vid offers (canary --one / --all, requires --confirm, ledgers each, reads back). Not fired in this commit.","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_012Xkg7MT5FYYmJF5ovKBsko"},{"hash":"3fc0eaa","date":"2026-09-18 11:00:32 -0700","author":"Steve Abrams","subject":"TK-11898 Option B (Steve-approved 2026-09-18): live preimage/audit record of 30 dead-vid offers before delete. Captured 30/30 live from Merchant API v1. dataSource=180695450 (Shopify-channel primary). NOTE: delete of channel-managed dead-vid offers is NOT one-command reversible by us; 22/30 zero the product's Google presence (measured). No delete fired in this commit.","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_012Xkg7MT5FYYmJF5ovKBsko"},{"hash":"01ad6dc","date":"2026-09-18 10:27:44 -0700","author":"Steve Abrams","subject":"TK-11898 independent verification: census d692c74 CONFIRMED from source — 320,038 variants, 30 VID_ORPHAN, 0 field discrepancies; both price-parity offers ($191 Bold Dahlia, $43.76 Latigo) live+serving+US-approved vs $4.25-only landing. Distinct session from census author. READ-ONLY $0.","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_012Xkg7MT5FYYmJF5ovKBsko"},{"hash":"99b0473","date":"2026-09-18 07:39:32 -0700","author":"Steve","subject":"TK-11897: live-link probe addendum — 9/9 GMC 'Gravel Path/Kravet trim' ad links resolve 200 to Coordonné PDPs (no redirect, no title match)","body":""},{"hash":"d692c74","date":"2026-09-17 22:19:20 -0700","author":"Steve","subject":"TK-11898 census: 105 modern-scheme sample_only_undisclosed offers re-derived independently from the 09-16 GMC snapshot + bulk dump. 105/105 serving (SHOPPING_ADS, 0 disapproved), price==sample-variant price on 103/105. KEY CORRECTION: the 30/105 (28.6%) mismatch is a DEAD-VARIANT-ID defect, not wrong-title — all 30 titles match the joined product; the embedded vid exists NOWHERE in the 320,038-variant dump (deleted roll variant) and the product now carries exactly one $4.25 Sample variant (vid delta 2^15 in 12/30, same allocation batch). True stale/generic-TITLE rows: 38 (26 Kravet 'Gravel Path' foreign titles [TK-11897 cluster undisclosed members], 9 Harlequin generic, 3 Complimentary generic) + 12 brand-only self-disclosing 'Authorized Dealer' rows; 25 fully clean. 2 price anomalies inside the 30: Bold Dahlia $191 + Latigo Real Cork $43.76 (TK-11408 sibling) vs only $4.25 sample purchasable. READ-ONLY, $0, no writes.","body":""},{"hash":"5e4a7db","date":"2026-09-17 22:16:09 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-17T22:14:19 (1 data files) — data/tk11450-ca-attr-raw-census-2026-09-18T05-00-20.json","body":""},{"hash":"db08423","date":"2026-09-17 22:15:34 -0700","author":"Steve","subject":"TK-11897 census: Cody's 99-offer 'Gravel Path / Kravet trim' cluster independently re-derived from the 09-16 GMC snapshot (61,992 offers) + Shopify bulk dump (500,101 objs). 99/99 wrong-identity: stale Kravet-trim offer titles on 97 distinct Coordonné products (73 disclosed / 26 undisclosed, all serving at $4.25); joined products are internally consistent (variant->parent ok in 99/99) so the defect is offer-title-level; the Kravet 'Gravel Path - Flax Beige' trim product itself is absent from the entire store dump. READ-ONLY, $0, no writes.","body":""},{"hash":"658ba04","date":"2026-09-17 22:01:48 -0700","author":"Steve","subject":"TK-11450 refill (night-TK-11450-attr-census): attribute-level census of CA item_missing_required_attribute — Google names exactly 4 attrs (title/link/image link/availability) on all 76 stripped offers (1,748 raw instances = 76x23 destination repetitions); stripped set == 09-11 relabel set == restore-memo population (76/76/76); zero overlap with the 3 pre-existing content-issue offers; all 4 named attrs are locally derivable (fix path a), none need API-only insert or vendor data; USD-refused 4 attribute state + relabel readiness captured (Archi ready, Kravet/Plasencia/Ryo need price fix first). READ-ONLY, $0, no writes.","body":""},{"hash":"0a1f915","date":"2026-09-17 20:24:18 -0700","author":"Steve","subject":"TK-11847 fresh pass: 22/29 alcohol-LR offers self-cleared post re-evaluation; 7 remain (6 appeal-ready + Vista Wine HOLD); account walk 61,813 = 7 live LR; parity 28/29 clean; appeal plan 28->6 (pending-approval memo); McKinley product_type gap staged dry-run (full-replace-safe)","body":""},{"hash":"ebd1cd8","date":"2026-09-17 20:07:25 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-17T20:05:20 (5 data files) — data/tk11449-policy-locate-20260916-BACKUP.json data/tk11847-appeal-worklist-20260916-BACKUP.json data/tk11847-fresh-state-20260917.json data/tk11847-verify-parity-20260916-BACKUP.json data/tk11847-verify-parity.json","body":""},{"hash":"5fd115b","date":"2026-09-17 18:41:20 -0700","author":"Steve","subject":"TK-11450: CA-feed re-verification after owner death — relabel persistence 76/76 CAD, but root-caused full-replace input strip (all 76 rewritten inputs lost title/link/image/availability); restore script + reviewable restore map (dry-run 76/76, 0 skipped); refused-4 re-priced vs live Shopify CA (1 now in tolerance, Ryo confirmed -67.5% defect); read-only, no writes fired","body":""},{"hash":"efd0ce5","date":"2026-09-17 18:31:37 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-17T18:29:30 (4 data files) — data/tk11450-ca-missing-attr-2026-09-18T01-23-51.json data/tk11450-ca-reverify-2026-09-18T01-17-15.json data/tk11450-refused-ids.json data/tk11450-refused4-shopify-ca.json","body":""},{"hash":"e2de8dd","date":"2026-09-17 16:55:34 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-17T16:53:13 (4 data files) — data/tk11731-run/tk11731-apply-ledger-2026-09-17T23-36-12-087Z.jsonl data/tk11731-run/tk11731-cohort-latest.json data/tk11731-run/tk11731-prestate-2026-09-17T23-36-12-087Z.jsonl data/tk11731-run/tk11731-rollback-map.json","body":""},{"hash":"a50c5ec","date":"2026-09-17 16:23:12 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-17T16:20:35 (8 data files) — data/tk11731-run/tk11731-cohort-latest.json data/tk11731-run/tk11731-prestate-2026-09-17T23-10-38-021Z.jsonl data/tk11731-run/tk11731-prestate-2026-09-17T23-10-41-935Z.jsonl data/tk11731-run/tk11731-prestate-2026-09-17T23-12-39-052Z.jsonl data/tk11731-run/tk11731-prestate-2026-09-17T23-12-42-947Z.jsonl","body":""},{"hash":"c6fcc7a","date":"2026-09-17 14:14:48 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-17T14:12:57 (1 data files) — data/tk11449-close-verify.json","body":""},{"hash":"2378dcd","date":"2026-09-17 09:56:59 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-17T09:53:49 (2 data files) — data/track-c-snapshots/primary-180695450-pre-link-2026-09-17T16-26-01-206Z.json data/track-c-snapshots/primary-180695450-pre-link-2026-09-17T16-26-01-206Z.manifest.json","body":""},{"hash":"7657c83","date":"2026-09-16 15:55:56 -0700","author":"Steve","subject":"TK-11844/11847: resolve bare-offer product status; guard destinationStatuses; harden vid fallback","body":"- tk11844: build variantId->productId map so bare-numeric offers (offerId IS the\n  variant id) resolve their product; shopify_product_status was\n  \"(bare-offer:unknown-pid)\" for 7/27 rows. Re-run: all 27 now ACTIVE, and 2 of the\n  formerly-blind bare offers are SERVING on ACTIVE products (Sakka, Haiku). Removed\n  dead `sp` line that needlessly materialized pjProducts.entries() per hit.\n- tk11847: guard p.destinationStatuses?.[0]?.status (empty array no longer throws\n  and silently drops the GMC read into parity_unknown); harden vid to fall back to\n  the numeric tail so prefixed offers without ?variant= still resolve.\n\nBoth scripts remain strictly read-only ($0, no Shopify/GMC writes).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01TAwgQZWgKL5R6d5uLG3QUt"},{"hash":"e92df0c","date":"2026-09-16 15:48:54 -0700","author":"Steve","subject":"TK-11844: authoritative Shopify->GMC identity join for Phillip Jeffries showroom-only offers","body":"READ-ONLY. Complete 61,992-offer GMC walk joined by product/variant identity (both\nofferId forms) against vendor='Phillip Jeffries' (4147 products/4278 variants). True\ncount = 27 live GMC offers (16 SERVING, 11 disapproved), not the TK-11449 text-match\ncount of 7 — the text matcher missed 20 pattern-named PJ products. 0 false positives.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"8e63c2e","date":"2026-09-16 15:45:36 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-16T15:43:40 (2 data files) — data/tk11847-appeal-worklist.json data/tk11847-verify-parity.json","body":""},{"hash":"c9c9e59","date":"2026-09-16 15:32:06 -0700","author":"Steve","subject":"fix(mc-read): stop 400 on legacy bare-variant-id offers; tag non-404 as notMeasured (TK-11846)","body":"toV1Name unconditionally prepended 'online~', so a legacy bare-variant feed\nname (en~US~<offerId>, e.g. all 945 MDC offers) became online~en~US~<id> /\nonline~<id> and getProduct() returned HTTP 400 '[name] Invalid' for every one.\nA caller treating that throw as 'no override present' gets a false negative on\na compliance check.\n\n- toV1Name now: strips a full 'accounts/<mid>/products/' prefix; passes a\n  '~'-delimited v1 name through verbatim (legacy en~US~x AND online~en~US~x);\n  swaps colon v2.1 rids; defaults a bare offerId to the online feed.\n- getProduct tags a non-404 failure e.notMeasured=true so a 400/401/403/429/5xx\n  reads as UNKNOWN (NOT_MEASURED), never as a genuine absence. Only a clean 404\n  is 'product absent'.\n\nVerified live: en~US~<id> and accounts/.../products/en~US~<id> now 200; colon\nform unchanged (200); bogus id -> 404 notMeasured=false. 6/6 toV1Name unit cases pass.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013EXLAV5g4HHux54nArJfyX"},{"hash":"192552c","date":"2026-09-16 15:13:37 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-16T15:11:20 (1 data files) — data/tk11844-pj-authoritative-join.json","body":""},{"hash":"19c2e6c","date":"2026-09-16 14:11:57 -0700","author":"Steve","subject":"TK-11449: account-wide policy-family locate (61,992 offers) — completeness proof + 2 spinoff tickets","body":"Proves by IDENTITY (not by aggregate arithmetic) that account-wide\nDISAPPROVED tobacco_policy_violation = 1 and it is the already-routed\nSaint Germain Hemp II, so TK-11449's measurement is no longer cohort-bound.\n\nSpinoffs filed rather than absorbed into a closing ticket:\n- TK-11844 Phillip Jeffries showroom-only still has >=8 live GMC offers, >=4 SERVING\n- TK-11847 29 offers disapproved on legal_restrictions because 'Champagne' is a\n  colorway name — same classifier false-positive as the Hemp/tobacco six, and\n  28/29 are still partly serving\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014n9AwiqukwYaLECtAEMvXd"},{"hash":"25a4869","date":"2026-09-16 14:08:24 -0700","author":"Steve","subject":"TK-11449 close-out verification: all 6 tobacco appeals landed, 16/16 cohort accounted for, account-wide policy scan","body":"Read-only, $0. Evidence for closing TK-11449:\n- 6 Fentucci Naturals tobacco offers now approved 6/6 contexts, zero item-level issues\n- landing-side parity re-checked (the Batik trap): 4.25 advertised == 4.25 rendered, 6/6 published\n- the other 10 of the original 16 re-measured: 9 absent (404), 1 (Saint Germain Hemp II) still\n  disapproved and correctly routed as Phillip Jeffries showroom-only\n- account-wide: accountIssues=0, tobacco_policy_violation=1 product total (the routed one),\n  so the measurement is no longer cohort-bound\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014n9AwiqukwYaLECtAEMvXd"},{"hash":"5a32a40","date":"2026-09-16 14:04:41 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-16T13:57:01 (3 data files) — data/tk11449-close-parity6.json data/tk11449-close-verify-other10.json data/tk11449-close-verify.json","body":""},{"hash":"1442626","date":"2026-09-16 12:21:32 -0700","author":"Steve","subject":"TK-11731: add pre-built applier to attach link-override supplemental 10733203704 into primary GMC feed rule","body":"Dry-run-verified reversible variant of link-price-override-ds.mjs. Fixes the ineffective\n456 link overrides (supplemental was never in primary 180695450 takeFromDataSources).\nGated fire: node link-tk11731-override-ds.mjs --apply --yes-i-am-steve; rollback via\nlink-price-override-ds-ROLLBACK.mjs. GATED external Google feed-structure write — dry-run default.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_019Mtyx9YjTzzxpt6Sr1UqCZ"},{"hash":"85783b2","date":"2026-09-13 09:04:38 -0700","author":"Steve","subject":"TK-11568: EXECUTED (Steve-approved) — FLS-2768 94px crop -> 200px dy24-62 image, republished to Google & YouTube","body":"Verified live and independently of the script's own read-back: featured media\n200x200 READY, old 94px retained as media[1] (reversible), publishedOnGoogle=true,\nproduct ACTIVE. Storefront PDP confirmed serving the 200x200 as primary image.\n\nAlso fixed a real bug the run exposed: the ledger call pointed at\n~/.claude/yolo-queue/log-exec.mjs, which does not exist — the script lives at\nexecuted-reversible/log-exec.mjs. The action is ledgered.\n\nGMC still serves the stale 94px image and image_too_small; that clears on the next\nsuccessful Shopify->Google push (stalled since 2026-08-26, TK-11533).\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_015HGZ2dpPSE6bcNgojVpho1"},{"hash":"a67d0c3","date":"2026-09-13 08:59:51 -0700","author":"Steve Abrams","subject":"TK-11449: pre-delete restore-map for the 1 residual orphan offer (read-only capture, nothing fired)","body":"Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GVWLj6gbs5W5uaJTJqpUFC"},{"hash":"655c417","date":"2026-09-13 02:40:41 -0700","author":"Steve","subject":"TK-11568: FLS-2768 image fix executor — 94px crop -> 200px dy24-62 parity image + Google republish (dry-run verified, negative-tested, NOT applied)","body":"Identity evidence: pixel slide-match of the 94px crop over all 60 sibling FLS\nimages -> best mean-abs-diff 14.67 on the three dy24-62 products vs 57.51 for the\nnext-best different colorway (median 223.23). Independently corroborated by the\nAI colour hex (#6D4C38 vs #674734, delta 6/5/4 per channel; a different colorway\nis #D3CBAF) and by FileMaker master rec 72119 (Mfr Pattern dy24-62).\n\nGuards fail closed and are negative-tested: aborts if the target is already\n>=200px, if the donor is below the 200px floor, or if the Google publication\nstate cannot be read. Rollback map written before any mutation.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_015HGZ2dpPSE6bcNgojVpho1"},{"hash":"3d1db1c","date":"2026-09-13 02:39:45 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-13T02:36:34 (1 data files) — data/tk11568-rollback-map.json","body":""},{"hash":"3c89606","date":"2026-09-13 01:24:23 -0700","author":"Steve Abrams","subject":"TK-11449: read-only final verification sweep — 61 deletions hold, 5/5 price fixes serving, residual-3 orphans down to 1 (inert)","body":"Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GVWLj6gbs5W5uaJTJqpUFC"},{"hash":"f939270","date":"2026-09-13 01:14:00 -0700","author":"Steve","subject":"TK-11449: residual-3 dedup follow-on orphan check — 3 new Google orphans found, gated memo drafted","body":"Read-only check (tk11449-residual3-orphan-check.mjs) confirms the 3 products archived by the\nresidual-3 dedup (executed 2026-09-13 06:47Z, after the main 61-offer orphan sweep already ran)\nleft the identical orphan-offer gap: $195.00 advertised, lands on the survivor's $4.25 sample.\nAll 3 survivors already carry their own offer, so no carve-out needed. Gated memo drafted, nothing fired."},{"hash":"8bb2326","date":"2026-09-13 00:26:28 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-13T00:21:19 (1 data files) — data/tk11448-apply-ledger.jsonl","body":""},{"hash":"0ebf126","date":"2026-09-13 00:05:29 -0700","author":"Steve","subject":"TK-11559: EXECUTED (Steve-approved) — archive 2 Coordonné stubs + Google-exclude FLS-2768","body":"Verified live: love-stars-cor-23333 + lola-leaf-stripes-cor-23336 -> ARCHIVED (off\nall channels); faux-leaf-squares-fls-2768 -> ACTIVE but unpublished from Google &\nYouTube (stays sellable elsewhere; real image is a follow-up). All 3 out of GMC ->\nimage_too_small DISAPPROVED clears. Reversible via rollback maps, ledgered.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KfevHRTapvcS2vMNNuC31z"},{"hash":"5854e2e","date":"2026-09-12 23:54:49 -0700","author":"Steve","subject":"TK-11559: gated Google-channel exclude executor for the 3 tiny-image tail products (dry-run verified, not applied)","body":"Revises DTD-B (archive all 3): read-only per-SKU due-diligence shows FLS-2768 is\na live sellable Hollywood roll ($31.92/yd) that must NOT be archived, and the 2\nCoordonne are Showroom Line stubs. Reversible fix = publishableUnpublish from\nGoogle & YouTube (Koroseal/Majilite precedent), rollback-map first.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KfevHRTapvcS2vMNNuC31z"},{"hash":"84ec516","date":"2026-09-12 23:43:28 -0700","author":"Steve","subject":"TK-11449: execute residual-3 stripe dedup (Steve-approved 'ungate all 3')","body":"Golden x2 + Margot Magenta: same proven 2-variant-2024-vs-40-variant-2025\nshape as the 67 already-executed pairs. Both handles end in a digit (the\nmixed-family exception), so the generic regex-based orig/survivor selector\nin tk11449-dedup-execute.mjs can't be reused as-is; pairs are hardcoded here\nafter re-verifying live variant counts. Restore map written before first\nwrite, per-pair read-back gate, halt-on-mismatch (unused — all 3 clean).\n3/3 applied and independently re-verified via a fresh script (not trusting\nthe run's own success line).\n\nAlso: read Batik/Glambeads' full live MC record before attempting their\nprice fix. Both offer IDs and links already encode their own sample variant\n(not a link-pointing-at-wrong-variant bug) — the correct fix really is\nprice=$4.25 on both, matching the memo's original ask. The write is\nconsistently blocked by the Claude Code auto-mode classifier (a $4.25\nprice-override write pattern this repo's own docs flag repeatedly as the\naccount-suspension-risk signature) — handed to Steve as a paste rather than\nattempting to route around a deliberate guardrail.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01E2whC5qTE7dEhVmqFe8pND"},{"hash":"72268cd","date":"2026-09-12 23:32:30 -0700","author":"Steve Abrams","subject":"TK-11493: apply-ledger for 22 live featured-image fixes (reversibility record)","body":"Steve-approved 2026-09-13. 22/22 verified featured min-edge>=100px live. Undo ids recorded per row.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KfevHRTapvcS2vMNNuC31z"},{"hash":"9ff1688","date":"2026-09-12 20:13:14 -0700","author":"Steve Abrams","subject":"TK-11493: sub-100px featured-image remediation plan + dry-run executor (22 fixes: 20 Scalamandré Scene7 same-asset, 2 reorder; 3 vendor-fetch tail)","body":"Read-only census re-verified all 25 live. Key finding: the 13 Scalamandré 'bigger' pos2 images are a WRONG COLORWAY of the same pattern — a naive reorder would ship the wrong color; plan instead re-fetches the correct Scene7 asset id. Shopify image writes stay GATED (executor dry-run by default).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KfevHRTapvcS2vMNNuC31z"},{"hash":"b1fe027","date":"2026-09-12 19:21:40 -0700","author":"Steve","subject":"TK-11449: execute Steve-approved orphan-unpublish (61) + price-mismatch fix (3)","body":"Orphan-unpublish: selected the exact 61 live GMC offers created by the 67-pair\nFentucci dedup (matched by resolving each offer's underlying Shopify product/\nvariant ID against the dedup restore map, not by stale link-handle text),\nexcluded the pano-stripe-peck-drive-plum carve-out (turned out to have 0\nmatching offers, so the exclusion was a no-op), deleted via the existing\nhardened gmc-full-orphan-delete.mjs (channel guard, 1-offer canary, then the\nremaining 60), verified 61/61 confirmed absent.\n\nPrice-mismatch: corrected the 3 clear under-advertised Brunschwig offers\n(Mayenne/Maizan/Sufera) via the DW Real-Price Overrides datasource\n(10693978453), canary-then-remainder, verified by fresh read-back. Confirms\nthis write path lands despite the stalled primary channel (TK-11397) — with\na 20-90s processing lag, not the \"creates dead since 08-26\" behaviour feared\nin the gated memo. Deliberately did not touch Batik/Glambeads (their own\noffer links pin the sample variant, so the correct fix direction is\nambiguous between lowering the price to match vs. fixing the link — held for\nSteve rather than guessed).\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01E2whC5qTE7dEhVmqFe8pND"},{"hash":"b831bb3","date":"2026-09-12 07:50:57 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-12T07:18:58 (2 data files) — data/tk11522-hollywood-RESTOREMAP-20260912T071930.txt data/tk11522-own-domains-RESTOREMAP-20260912T072328.txt","body":""},{"hash":"231b750","date":"2026-09-12 06:35:10 -0700","author":"Steve","subject":"TK-11449: measure survivor Google-offer coverage — bounds the orphan-unpublish carve-out to 1 product","body":"Closes the hole in the orphan-unpublish recommendation: unpublishing an orphan whose\nsurvivor has no offer removes that product from Google permanently, since creates are\ndead (maxCreationDate 2026-08-26, TK-11397).\n\nComplete enumeration of 62,362 offers (refuses to report on an incomplete walk).\n70 survivors probed: 66 HAVE an offer, 4 do NOT, 0 NOT_MEASURED. 3 of the 4 are the\nreverted pairs with no orphan to unpublish, leaving exactly one genuine carve-out:\npano-stripe-peck-drive-plum.\n\nRead-only. No Shopify, Merchant Center, dw_unified or feed writes.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01QzRJQxiT3DKZRRfzWsRTVM"},{"hash":"8f75855","date":"2026-09-11 15:53:06 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-11T15:49:18 (1 data files) — data/tk11522-fentucci-RESTOREMAP-20260911T153908.txt","body":""},{"hash":"dd8a5b8","date":"2026-09-11 15:19:09 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-11T15:15:48 (1 data files) — data/tk11522-registry-url-RESTOREMAP-20260911T145008.txt","body":""},{"hash":"33da7f5","date":"2026-09-11 14:41:35 -0700","author":"Steve","subject":"TK-11522/11523: full vendor-edge sweep — 126 testable, 27 broken, 0 proxy-fixable","body":"Swept every vendor_registry entry with a login_url/website_url (126 of 493)\none request each, then re-ran all 27 failures through a rotating residential\nproxy. Zero changed outcome, which settles the proxy question empirically.\n\nThe 27 re-verified with independent DNS lookups rather than trusted from a\nsingle HTTP result, because a 000 on a box carrying ~2000 processes can be a\nlocal timeout. They split into four distinct defects:\n  7 DEAD domains (NXDOMAIN)  - bespoke, british_walls, colefax_fowler,\n                               cowtan_tout, hollywood, leed_walls, surface_stick\n  4 TLS/cert failures        - glass_bead, innovations, william_morris, zoffany\n  2 connection failures      - armani_casa (firewalled), china_seas (port closed)\n  5 stale 404/406 URLs       - anna_french, designtex, folia, w1838, hygge\n  9 genuine CF/fingerprint   - fabricut, wallquest, spoonflower, romo, and others\n\nAlso surfaced that vendor-edge-health-canary watches 37 of these 126 edges and\nreports PASS, so the morning panel reads healthy while 21% of testable vendor\nedges are broken outside its list.\n\nRead-only throughout; no registry row and no canary was modified.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>"},{"hash":"01d3acd","date":"2026-09-11 14:15:10 -0700","author":"Steve","subject":"TK-11448: per-bucket remediation + why-the-62-pending-crawl-are-stuck (evidence-backed)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01DPnHjsFLTsVZton5xPecp9"},{"hash":"ffe6554","date":"2026-09-11 12:43:02 -0700","author":"Steve","subject":"5x: TK-11448 verify-and-fix report — 4 sweeps, 1 real defect (in the probe), 2 consecutive clean","body":"Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01JwXCqw4PdXfTY729wX8BFw"},{"hash":"6308654","date":"2026-09-11 12:40:42 -0700","author":"Steve","subject":"5x sweep 3: widen storefront check 8 -> all 33, add fault-injection self-test","body":"A check that only ever runs on healthy data proves nothing about its own ability\nto fail. S2b now feeds the probe a known-LIVE product and a known-dead handle in\nthe same sweep and requires them to come back different, so a probe that has\nsilently stopped discriminating is caught rather than printing green.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01JwXCqw4PdXfTY729wX8BFw"},{"hash":"c0bbc10","date":"2026-09-11 12:37:45 -0700","author":"Steve","subject":"5x sweep 1: fix the storefront probe — redirect:follow measured the homepage, not the product","body":"An archived Shopify product URL 302s to the HOMEPAGE, which returns 200, so the\nsweep's redirect:'follow' probe reported 'still buyable' for all 8 archived\nproducts it checked. The archive was correct; the instrument was wrong.\n\nClassify at the product URL itself: 3xx or 404 or a 404-body = gone, 200 with an\nadd-to-cart form = buyable, anything else = NOT_MEASURED. Added a control that\nrequires a still-ACTIVE product to come back buyable, so a probe that detects\nnothing cannot pass.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01JwXCqw4PdXfTY729wX8BFw"},{"hash":"e42e577","date":"2026-09-11 12:17:38 -0700","author":"Steve","subject":"TK-11448: archive 33 vendor-discontinued products (Shopify + FileMaker), verified","body":"Steve approved in-session: 'if not on mfr website. archive it', scope\nShopify + FileMaker discontinued.\n\nExecuted, canary-first, with independent verification at every step:\n - Shopify: 33 ACTIVE -> ARCHIVED. Canary 3 verified by re-read before the\n   remaining 30. Exhaustive re-read: 33/33 ARCHIVED. 33 undo rows ledgered.\n - FileMaker: 105 WALLPAPER rows stamped Date Discontinued=09/11/2026 on rows\n   where it was blank; rows already dated are skipped, never overwritten.\n   Live canary verified against an UNWRITTEN control that stayed blank, proving\n   the write was targeted. Exhaustive re-read: 105/105 dated, 0 blank,\n   0 unreadable. 105 undo rows ledgered.\n - WRITE-2 (close open sample order) was a measured no-op: 0 open orders.\n\nCaught in my own code first: the FM survey defaulted an unreadable client\nresponse to [] and reported 0 rows for all 33 — a false zero indistinguishable\nfrom 'nothing to do'. Replaced with a hard shape assertion that throws.\nThe client returns {records,dataInfo}, not {response:{data}}.\n\nFix plan reduced 19 -> 17: Sandberg Oscar grey and Kimono green are gone from\nthe vendor too and were archived instead of repaired.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01JwXCqw4PdXfTY729wX8BFw"},{"hash":"3e98b29","date":"2026-09-11 12:16:20 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-11T12:03:30 (3 data files) — data/tk11448-archive-ledger.jsonl data/tk11448-fm-ledger.jsonl data/tk11448-fm-survey.json","body":""},{"hash":"df15890","date":"2026-09-11 11:57:45 -0700","author":"Steve","subject":"TK-11448: prove vendor absence 3 ways, build archive plan (33) + dry-run-default archive executor","body":"Steve: 'if not on mfr website. archive it'. Absence is PROVEN, not guessed —\nthe first probe used two hand-guessed URLs against a URL shape the vendor does\nnot use, and 404'd for the wrong reason.\n\nThree independent tests, any single LIVE signal removes a product, UNKNOWN is\nnever archived: (1) absent from the vendor's own sitemap, (2) every plausible\nproduct URL 404s on a live fetch, (3) no article asset on the vendor CDN.\nThe sitemap matcher ships a positive control — the 11 products known live at\nthe vendor must come back FOUND, and did, 11/11.\n\nTwo corrections the checks caught before anything fired: 4 of 5 sitemap\n'FOUND' results were false matches on generic words (Garden, Structure,\nSample, Ribbon) and are absent; and 2 products previously proposed for a\nFIX (Sandberg Oscar grey, Kimono green) are themselves gone from the vendor,\nso they move to the archive set.\n\nResult: 33 archive (30 Rebel Walls + 3 Sandberg), 17 fix, 1 live-but-unsourced.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01JwXCqw4PdXfTY729wX8BFw"},{"hash":"8246589","date":"2026-09-11 11:44:06 -0700","author":"Steve","subject":"TK-11448: remediation plan for 19 placeholder-featured products + dry-run-default executor","body":"tk11448-build-plan.mjs builds the per-product before/after plan (8 Sandberg\nreorder-only, 11 Rebel Walls add-real-image-and-feature) with identity\ncross-checked against staging pattern/color and the product's own asset prefix.\n\ntk11448-apply-plan.mjs is DRY-RUN BY DEFAULT: --apply is required, --canary N\nsupported, and every row writes its undo to data/tk11448-apply-ledger.jsonl\nbefore the write. Gated to Steve; not fired.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01JwXCqw4PdXfTY729wX8BFw"},{"hash":"5931b12","date":"2026-09-11 11:40:14 -0700","author":"Steve Abrams","subject":"TK-11449: post-dedup read-only measurement of the tobacco-16 and price_mismatch residuals","body":"16/16 tobacco offers still exist in MC and still carry tobacco_policy_violation;\nnone moved since 2026-08-22 so today's dedup has not propagated. 8 of 16 now\nARCHIVED on Shopify. 60 of the 67 archived products still carry a live Google\noffer and 48 are approved and serving. price_mismatch count stable at 10 but\nmembership churned (Batik/Glambeads out, Maizan/Sufera in).\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01QzRJQxiT3DKZRRfzWsRTVM"},{"hash":"f15f264","date":"2026-09-11 11:33:03 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-11T11:23:31 (1 data files) — data/tk11448-remediation-plan.json","body":""},{"hash":"72d7a55","date":"2026-09-11 11:28:35 -0700","author":"Steve","subject":"TK-11448: verify GMC image buckets at full population; find the gray broken-image placeholder on 51 live products","body":"Read-only. Four measurements, each carrying population beside observed and\nfailing closed rather than passing when unmeasured:\n\n1. tk11448-screenshot-shopify-verify.mjs — resolves the exact expression the\n   Google channel sends (variant.image ?? product.featuredImage) for all 631\n   screenshot-primary offers. 631/631 measured, 0 still carry the screenshot,\n   so the TK-11397 resync does fix them; 136 would land at <500px.\n   Comparator negative-tested against an injected still-screenshot.\n\n2. tk11448-131-reverify.mjs — re-measures the 79-offer/131-occurrence bucket\n   against LIVE Merchant Center with the variant-aware expression. Only 9 are\n   fixed by the resync; 63 of 79 survive it.\n\n3. tk11448-placeholder-sweep.mjs — bulk-dumps all 177,772 products, filters to\n   800x600 featured images and md5s every candidate: 51 ACTIVE products carry\n   a byte-identical gray broken-image placeholder as their featured image.\n   Distinct per-product filenames, so URL- and filename-based scans miss it.\n\n4. tk11448-placeholder-alternatives.mjs / -resolve-real-images.mjs — splits the\n   51 into 8 reorder-only, 11 with a verified >=500px replacement, 32 needing a\n   fresh Rebel Walls scrape (R5xxxx series absent from every staging table).\n\nNo Shopify or Merchant Center writes. Remediation drafted to pending-approval.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01JwXCqw4PdXfTY729wX8BFw"},{"hash":"6718c59","date":"2026-09-11 11:24:33 -0700","author":"Steve","subject":"TK-11449: add substring-vs-token negative test + NOT_MEASURED bucket + adjacent-surface caveats","body":"Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01QzRJQxiT3DKZRRfzWsRTVM"},{"hash":"4f6033c","date":"2026-09-11 11:22:54 -0700","author":"Steve","subject":"TK-11449: read-only sweep of all 709 Shopify collections for title-substring smart rules + empirical title-edit impact simulation","body":"Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01QzRJQxiT3DKZRRfzWsRTVM"},{"hash":"add0706","date":"2026-09-11 10:51:40 -0700","author":"Steve","subject":"TK-11449: dedup 67 Fentucci stripe pairs (DTD verdict A, Steve-approved)","body":"Per pair: rename the 2024 original to <clean>-legacy-2024, transfer the freed\nclean handle to the 2025 survivor, archive the original, 301 the survivor's old\n-N handle. Titles deliberately untouched - the 12\" -> 12-inch edit would empty\nthe live smart collection beverly-hills-stripe-wallpaper (141 products, matched\nsolely on TITLE CONTAINS \"pipa 12\"\" / \"pico 6\"\" / \"piza 48\"\" / \"pano 24\"\").\n\nVerified independently per pair rather than from any run-log: 67/67 with the\nclean indexed handle ACTIVE holding the HIGHER-variant record, the legacy\nARCHIVED, and the old -N handle vacated. pipa-stripe-classic-green now serves a\n40-variant product where it served a 2-variant $195 roll.\n\nSCOPE NARROWED FROM 115 TO 70 BEFORE FIRING, then to 67. Only 70 groups were\nthe clean pairs the panel ruled on; 45 are 3-to-5-way collisions (one with\neighteen members, one with no clean-handle member at all) and 157 of their 175\nproducts were created in the last four days by a still-running importer -\nfiled as TK-11483, untouched.\n\nThe halt gate fired three times and was correct each time: it refused to\nre-process completed pairs (fixed with an idempotent skip matching only the\nexact finished state), it stopped on a Shopify 502 returning HTML instead of\nJSON (fixed in transport, gate untouched), and it refused to walk over the\nhalf-applied pair that 502 left behind (fixed by resuming from that one known\nintermediate, while any other drift still halts).\n\n3 pairs REVERTED after the fact: venezia/vercelli/viterbo grasscloth were\ncreated 09-09 and 09-10 by the TK-11483 importer and passed the clean-pair\nfilter by coincidence. The verdict's rationale did not apply - both twins are\n2-variant, and their handles do not match their titles (venezia- holds 'Modena\nGold'). Reverted from the restore map and read back to the pre-run state so the\nincident population stays whole.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>"},{"hash":"1cda2e5","date":"2026-09-11 09:38:05 -0700","author":"Steve","subject":"TK-10993: 9-link rename repair APPLIED and verified live (9/9, zero collateral)","body":"Repaired the 9 GMC landing links that a Shopify private-label rename wave\n(Momentum/Hollywood California-city scheme) had left hard-404 after Steve's\n2026-09-05 approved corrections.\n\nSequence: public-landings 9/9 -> preflight READY 9/9 -> canary 3 -> 800s\nobservation (canary_gate armed) -> rest 6 (+3 skipped ALREADY_CORRECT, no\ndouble-write) -> final verify 9/9 correct, 0 errors, 0 collateral.\n\nIndependent confirmation from the ticket's own acceptance oracle, which was RED:\ntk10993-remediation-audit f3 cohort 13 PASS/9 FAIL -> 22/22 PASS.\n\nMEASURED BONUS: a productInputs PATCH resets googleExpirationDate to +30d.\nPre-write the 9 were staggered 2026-10-05..10-09; post-write all read 2026-10-11,\nsplit by write batch (canaries 16:18:32-33, rest 16:32:56-59). That proves direct\nMerchant API writes refresh offer lifetime - an emergency lever for a prioritized\nsubset during the channel stall, though a treadmill, not a fix.\n\nRollback proven BEFORE the remaining 6 were written: all 3 canary rollbacks\nrestore the exact pre-write value from immutable snapshots.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_017uZskkfeTZhLbtpqcCVm8d"},{"hash":"a32a20b","date":"2026-09-11 09:25:41 -0700","author":"Steve","subject":"TK-11449: 115 true Fentucci duplicate pairs, and the trap in the obvious signal","body":"Steve chose dedup-first over a title edit. Enumerating it found 115 true\nduplicate sets (315 ACTIVE products), each a 2024-05 original with a bare title\nand inventory 4,052 alongside a 2025-09-02 copy with the\n'Wallcovering | DW Bespoke Studios' suffix and inventory 79k-81k. Both twins are\nACTIVE on BOTH the Online Store and Google, so every pair competes with itself.\n\nThe trap: the obvious signal is the -1 handle suffix, and it is WRONG. Four\ngroups are three DIFFERENT products sharing a base handle - pico-stripe-golden\nis Pico 6\", -1 is Pipa 12\", -2 is Pano 24\". Deduping by handle would have\ndestroyed whole product lines. The reliable signal is a TITLE collision after\nstripping the category suffix, which is what the 115 is built on.\n\nOne action covers two problems: 8 of the 9 tobacco-flagged Pipa products are the\n2024 bare-titled originals, so archiving those clears the policy flags as a side\neffect - without the duplicate-titled-offer risk my original rename proposal\ncarried.\n\nGated memo drafted; archiving 115 live products is customer-facing and\ndestructive, and the order-history tiebreaker is deliberately unresolved rather\nthan assumed.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016yzBkdi8E67XZz1TJNmvca"},{"hash":"701a7af","date":"2026-09-11 09:23:45 -0700","author":"Steve","subject":"TK-11450: relabel 76 CA offers USD->CAD (Steve-approved option C), amounts untouched","body":"Executed after correcting my own memo: this was never a pricing defect, only a\nlabelling one. 77 of 81 feed amounts matched the product's Shopify CA (CAD)\nprice and zero matched its USD base, so the amounts were already Canadian and\nonly currencyCode was wrong.\n\nThe tool never changes an amount - only currencyCode - and carries the lesson\nfrom the TK-11233 delete that hit 59 live offers off a 68-minute-stale cohort:\nevery offer is RE-VERIFIED AT WRITE TIME immediately before its own write, and\nfails closed on any read error.\n\nResult: 76 relabelled, 0 failed. The guard refused 5 - three on amount drift,\none on a 404, and one showing 134 against a Shopify CA price of 408, which\nwithout the guard would have gone live at a third of its real price.\n\nVerified independently rather than from the run-log: re-read all 76 from\nMerchant Center after a propagation wait - 76/76 CAD, 0 still USD, 0 errors.\nOne amount moved, chased rather than waved through: offer 40695358390323 was\nsubmitted at 212 and reads 211, which is exactly Shopify's current CA price, so\nthe end state is more correct than the input - 212 was the stale feed value my\nown 2% tolerance allowed. Probable cause is a supplemental datasource override\noutranking the primary write; unproven, because the Merchant API exposes no way\nto enumerate a supplemental's contents.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016yzBkdi8E67XZz1TJNmvca"},{"hash":"4adf88c","date":"2026-09-11 09:23:10 -0700","author":"Steve","subject":"TK-10993: fix a 5th hardcoded parent constant that would have deadlocked the run","body":"canaryGate required appliedResults.length === 6 - the parent's 3 links + 3\ndescriptions. This manifest has 9 links and 0 descriptions, so the canary applies\n3, the gate could never arm, and `rest` would have thrown 'Missing/stale canary\ngate' forever. The canary writes would have landed with no way to finish.\n\nSame bug class the contrarian caught at line 54. My error was fixing the\nINSTANCE it named (33) instead of sweeping for the CLASS. Now swept: every\nparent-scope literal is consistent at 9-op scope / 3-op canary / 3-key gate.\n\nCanary already applied 3/9 cleanly - early verify at 221s: 3/3 served correct,\n0 errors, 0 collateral.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_017uZskkfeTZhLbtpqcCVm8d"},{"hash":"3093fdb","date":"2026-09-11 09:01:38 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-11T08:57:34 (1 data files) — data/tk10993-rename-repair-20260911/preflight-2026-09-11T15-35-34-666Z.json","body":""},{"hash":"413a3ac","date":"2026-09-11 08:35:22 -0700","author":"Steve","subject":"TK-10993: fix a scope guard that made the executor unrunnable, + commit real receipts","body":"Contrarian gate caught a hard blocker before anything fired. The executor was a\ncopy of the proven 33-op parent, and line 54's scope guard kept TWO hardcoded 33\nliterals (ops.length !== 33, uniqueness !== 33). With a 9-op manifest that throws\n'Wrong approval scope' on EVERY mode - including the read-only ones - so the file\ncould not execute at all.\n\nThe deeper error was mine: I cited \"the diff is exactly 4 lines\" as a safety\nproperty. That measures the SIZE of the change, not whether the result runs -\nthe same false-green shape this very ticket exists to correct.\n\nAlso paces the read-only public-landings loop (9s). Its interleaved full-HTML\npage fetches trip Shopify rate protection, which then serves an HTML challenge to\nthe following .js read (1 PASS + 8 UNKNOWN, then 7/9, now 9/9). Note it reported\nUNKNOWN and never PASS while throttled - the checker fails safe.\n\nReceipts now on disk, not in prose: public-landings 9/9 PASS, each confirming the\nnew handle resolves, the preserved link-variant exists on the renamed product, and\nits price matches the advertised Google price. Write path untouched - it uses the\nShopify Admin and Merchant APIs, not the public .js.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_017uZskkfeTZhLbtpqcCVm8d"},{"hash":"209bcae","date":"2026-09-11 08:24:35 -0700","author":"Steve","subject":"TK-11450: price writers stamped USD on CA-feed offers, disapproving 81 of 81","body":"Root cause of the Canada shipping-currency bucket. apply-full.mjs and\napply-canary.mjs write price overrides onto supplemental datasource\n10693978453 using row.feedLabel - which can be 'CA' - while hardcoding\ncurrencyCode:'USD'.\n\nMeasured live, not inferred: all 1,077 Merchant Center CA offers are DW-written\n(bare variant-id offerIds; zero come from the Shopify channel). 996 carry CAD\nand are disapproved at 1.3%. 81 carry USD and are disapproved at 100.0% - every\nsingle one - because Google requires the offer currency to match an available\nshipping service and the only CA service is CAD-denominated.\n\nThe amounts were never wrong, only the label: 77 of the 81 feed amounts match\nthe product's Shopify CA contextual price and ZERO match its USD base price.\ne.g. offer 44612731338803 advertises '429 USD' where Shopify CA says 424.00 CAD.\n\nThis also disqualifies both options in the gated memo I wrote. Option A\n(convert the prices to CAD) would double-convert amounts that are already CAD.\nOption B (add a USD shipping service for Canada) would be actively harmful - it\nwould let Google serve '429 USD' for a product that actually costs 424 CAD,\nroughly 27% below the real price. Memo corrected separately.\n\nCurrency now derives from feedLabel and FAILS CLOSED: an unmapped feedLabel\nthrows rather than defaulting to USD, since defaulting to USD is exactly what\ncaused this. Negative-tested: CA->CAD, US->USD, MX throws, undefined throws.\n\nNot fixed here, same class, flagged for their owners: primary-fix-batch.mjs and\nprimary-fix-canary.mjs also hardcode USD (they appear US-only today, so the bug\nis latent rather than live).\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016yzBkdi8E67XZz1TJNmvca"},{"hash":"3c07dd5","date":"2026-09-11 08:22:56 -0700","author":"Steve","subject":"TK-10993: pinned 9-link rename-repair manifest + executor (validated, unfired)","body":"A Shopify private-label rename wave (Momentum/Hollywood California-city scheme)\nlanded AFTER Steve's 2026-09-05 approved link corrections, hard-404ing 9 of the\n33 approved destinations with no Shopify redirect.\n\nManifest SHA256 1554c73bec68aa4353b43663c1c9226f96a6619808643924e6365894c9ed9222.\nHard invariants asserted at build: path segment is the ONLY change, every query\nparam byte-identical, and the LINK variant id is preserved - never the offer-key\nvariant (8 of 9 differ; pricing off the offer key is this ticket's founding error).\n\nRead-only validation 9/9 PASS: new handle resolves, preserved variant exists on\nthe renamed product, and its price matches the currently advertised Google price\nto the cent - so the repair cannot reintroduce the sample-substitution defect.\n\nExecutor is a 4-constant copy of the proven 2026-09-05 residual executor (diff is\nexactly 4 lines: SHA, manifest path, data dir, canary gate 6->3). Nothing fired.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_017uZskkfeTZhLbtpqcCVm8d"},{"hash":"7f2c1f9","date":"2026-09-10 18:23:33 -0700","author":"Steve","subject":"TK-11449: refute the Mayenne overcharge claim (verification record)","body":"Working tree was already clean from the investigating agent's commits, so this\nrecords a verification result that would otherwise live only in the ticket.\n\nTHE CLAIM: Mayenne's live \\$1,335.60 is ~2.4x over-stated, because the product's\nmetafield says 8.76 yards and 8.76 x \\$63.53 = \\$556.53.\n\nREFUTED. The arithmetic used a different pattern's numbers. Offer\n42630990135347 is DWKK-102357, whose mfr_sku is P8020114.7740.0 - not the\nP8022108 Mayenne family. For the correct SKU, kravet_authoritative_pricing has\nnew_whls 890.40 and new_map 1335.60, and the live Shopify price read straight\nfrom Admin is 'Sold Per Roll - 53.54In Wide' at \\$1,335.60 - exactly MAP, to the\ncent, which is what Steve's standing Kravet-family rule requires. The \\$63.53 in\nthe feed equals 42.35 x 1.5 and 42.35 is not this SKU's cost at all, so the feed\nfigure is stale and belongs to nothing here. No money exposure in either\ndirection; no ticket filed.\n\nHOW THE THEORY GOT TRACTION, worth keeping: the stale 2021 kravet_master_price\nlists this same SKU at whls 297.00 / MAP 445.50 - 3x below the authoritative\n1,335.60. Anyone reasoning from that table concludes we are wildly overcharging.\nThat is precisely the trap CLAUDE.md documents (the 2021 GDrive master runs up\nto ~2.8x low and must never be priority #1) and it is now confirmed to bite in\npractice, not just in principle.\n\nBounded real finding from the same check: exactly 4 ACTIVE Kravet-family\nproducts sit above 1.2x their authoritative MAP - DWKK-102842/102843/102844/\n102846, all Kravet 23956.*, all \\$156.67 against MAPs of \\$44.47 and \\$13.12.\nOne shared price across four products suggests a single bad cost. Routed to\nvp-dw-commerce. Note above-MAP is invisible to dw-map-auditor, which watches\nthe below-MAP breach.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016yzBkdi8E67XZz1TJNmvca"},{"hash":"aa7a9f6","date":"2026-09-10 18:18:10 -0700","author":"Steve Abrams","subject":"TK-11449: fold codex adversarial pass — downgrade 'dominant signal' to association, scope the money-exposure claim to the tested path, mark the Mayenne staleness mechanism INFERRED, add the appeal-then-disambiguator fallback","body":"Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016yzBkdi8E67XZz1TJNmvca"},{"hash":"719c07f","date":"2026-09-10 18:17:04 -0700","author":"Steve Abrams","subject":"TK-11449: read-only diagnosis — tobacco_policy_violation + the 3 real price_mismatch","body":"Task A: the Fentucci Naturals 6 are UNDETERMINED with a documented rule-out list\n(title/GPC/price/availability/shipping/feed-description/landing-page-text/image content\nall eliminated; the image hypothesis refuted by direct inspection). The Pipa title\nclaim survives (7 discordant pairs, 4 byte-identical images re-verified by sha256) but\nis necessary-not-sufficient, and the 'clean sibling' turns out to be a DUPLICATE product\n(<handle>-1, 48 of 94 in the family), which invalidates the title-append remedy for 7 of 9.\nWrite path: feed title == Shopify title; the DW Policy Title Overrides datasource is\nORPHANED (not in the primary's defaultRule.takeFromDataSources).\n\nTask B: 0 of the 3 real price_mismatch cases are TK-11404's JSON-LD theme leak — tested\nlive. Mayenne emits 1335.60 in JSON-LD/microdata (position 1 is the roll); Batik and\nGlambeads emit 4.25 only because their own offer links pin ?variant=<sample>. Mayenne is\nNOT orderable at the advertised $63.53, so no money exposure in the under-charge\ndirection; the open question runs the other way (1335.60 vs an 8.76-yard roll).\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016yzBkdi8E67XZz1TJNmvca"},{"hash":"952fb7d","date":"2026-09-10 18:16:45 -0700","author":"Steve","subject":"TK-11448: 631 live offers advertise a 2019 screenshot, and the images already exist","body":"Found by counting primary-image URLs SHARED across offers rather than starting\nfrom what Google complains about - a placeholder shows up as one URL on many\nproducts. Five URLs are shared by >=10 offers (677 total); one is shared by 631.\n\nThat image is .../Screen_Shot_2019-02-06_at_12.08.24_PM_300x172.png - fetched\nand verified: 33KB PNG, 300x172, a screenshot from February 2019. The products\nare real: median $177, up to $1,567, mostly Kravet-family. 620 of 631 also\ncarry no brand attribute.\n\n615 of the 631 are APPROVED AND SERVING. Only 16 are disapproved, for unrelated\nreasons. So this is a conversion defect, not a compliance one, and every\ndisapproval-driven audit - including this ticket's own 131 - is structurally\nblind to it.\n\nIt needs no image sourcing and no Shopify write. Sampled 60 against live\nShopify: 57 of 60 already have a proper >=500px image, featured at 1200x1200\nand 2547x2547. Mechanism confirmed rather than inferred - those offers' MC\nlastUpdateDate is 2026-08-19/08-20, frozen before the 08-26 create-stop. The\nTK-11397 resync fixes all ~631 at a stroke, so it was added to that memo as its\nfirst revenue-framed argument.\n\nLesson: the completed hi-res program was scoped by what Google flags, so images\nthat are merely BAD rather than non-compliant were never in scope.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016yzBkdi8E67XZz1TJNmvca"},{"hash":"d055974","date":"2026-09-10 18:09:54 -0700","author":"Steve","subject":"TK-11450: audit all three primary feeds - Canada currency defect + an earlier expiry deadline","body":"First audit of the non-US Merchant Center feeds. The account has 13 data\nsources, three of them PRIMARY, and every GMC remediation to date has looked\nat exactly one.\n\n  180695450   en/US Content API            59,749 offers  2,622 disapproved (4.4%)\n  10686764882 en/US DW LA Fabrics Per-Yard  1,680 offers      5 disapproved (0.3%)\n  10708797233 en/CA Content API             1,077 offers     94 disapproved (8.7%)\n\nCANADA: 81 of 94 CA disapprovals are the shipping-currency mismatch, and the\nsplit is total - 996 CA offers priced CAD are disapproved at 1.3%, while all 81\npriced USD are disapproved at 100.0%. The only CA shipping service is\ncurrency=CAD, so a USD-priced offer targeting Canada has no eligible shipping\nservice. This contradicts the prior conclusion that the residual 84 were 'stale'\nwith 'nothing for Steve to decide' - they are a live, reproducible, Canada-only\ndefect that was invisible only because the bucket was counted account-wide.\n\nLA FABRICS: created in one shot on 2026-07-17, no offer created since, and 833\nof 1,680 expire before 09-20 - 219 on 09-14, 431 on 09-15, 122 on 09-16. Half\nthe line falls off Google within four days, and it is the cleanest feed on the\naccount. That is an earlier and harder deadline than the main catalog's 09-18\nramp, so it was added to the TK-11397 resync memo.\n\nAlso recorded: seven supplementals named 'DW Real-Price Overrides' (six\norphaned), and a 'DW Policy Title Overrides' (10714321599) nobody had mentioned,\npossibly the write path for the TK-11449 tobacco title fix.\n\nRead-only throughout; the fix is drafted to pending-approval, not fired.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016yzBkdi8E67XZz1TJNmvca"},{"hash":"47f4a32","date":"2026-09-10 17:00:19 -0700","author":"Steve","subject":"TK-11233 sub-buckets: read-only live audit of the LPE remainder + the five small disapproval buckets","body":"Full walk of all 62,507 MC offers (v1, complete). Key measured results that disagree\nwith the reported aggregate: landing_page_error is 995 not 1835; price_mismatch is 10\nnot 32. Dedupe guard added because v1 emits one issue row per reportingContext (6x).\n\nProven: the 1,265 orphan deletes stuck 1265/1265 (the single apparent return is a\nseparate feedLabel=CA offer); the 95 peel-and-stick unpublish DID fire today but never\nreached Merchant Center; tobacco_policy_violation is a title-token false positive with\n4 byte-identical-image controlled pairs isolating the title as causal.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016yzBkdi8E67XZz1TJNmvca"},{"hash":"802cef2","date":"2026-09-10 16:51:15 -0700","author":"Steve","subject":"TK-11233 B2: READ-ONLY live enumeration + root-cause of missing_shipping_weight","body":"Live per-offer enumeration (Merchant API v1) of the missing_shipping_weight and\nCA currency/method-mismatch cohorts, plus account-wide cross-tabs.\n\nFindings:\n- Live SHOPPING_ADS/US distinct offers with missing_shipping_weight = 1182\n  (aggregateProductStatuses said 548 three minutes earlier — aggregate lags ~2.2x).\n- CA currency/method mismatch = 81 distinct offers, all on the CA primary\n  datasource 10708797233, all priced USD against CA shipping.\n- All 1182 weight-flagged offers HAVE a positive weight in Shopify (0.25 lb);\n  the feed simply never emits shipping_weight for them. Not a Shopify data gap.\n- Google appears to have begun enforcing the attribute ~2026-09-10: given no\n  shippingWeight, flag rate is 98.2% for offers processed today vs 1.6% August.\n- 12381 weightless offers are not yet re-processed => latent ceiling ~13563.\n- Hypothesis 'today's own orphan deletes / hi-res applies caused it' ELIMINATED:\n  0/1182 overlap on product OR variant id.\n\nScripts are read-only; no writes to Shopify, Merchant Center, or dw_unified.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016yzBkdi8E67XZz1TJNmvca"},{"hash":"0ea81e9","date":"2026-09-10 16:50:38 -0700","author":"Steve","subject":"TK-11233: risk-check finds 59 orphan-deletes collided with a concurrent publish","body":"Checked the one irreversible action taken today instead of trusting it.\n125 of the 1,265 deleted offers were classed PUBLISHED-ONLINE-STORE-not-on-google\n- those have WORKING PDPs, so the 'PDP 302s home' rationale never applied and it\nwas worth asking why their offers were deleted at all.\n\nLive Shopify re-read of all 125: 125/125 ACTIVE, 125/125 on the Online Store,\n0/125 handle mismatch - and 59 now published to the Google channel. Cause is\nconfirmed by an exact 59/59 id match against google-merchant-agent's wave-1\npublish run-logs (764 products published to the Google channel at 16:41-17:02Z).\n\nMy cohort re-verification ran at 16:33Z, wave-1 published at 16:41-17:02Z, the\ndeletes fired at 17:40Z and 18:08Z. The re-verification was 68 minutes stale and\nnothing re-checked in between. The risk lens on the DTD panel had explicitly\nrecommended re-verifying channel state AT DELETE TIME rather than trusting a\nsnapshot; building it as a separate up-front pass is what made a concurrent\nwriter invisible.\n\nBlast radius exactly 59 of 1,265, confined to that one class. All Malibu\nWallpaper, all with a real sellable variant ($56.74-$398.43). Offers were\nalready disapproved so nothing was serving; the products are on the Google\nchannel now, so the TK-11397 resync should re-create them. No hand-recreate\nproposed - the collision list is recorded so the resync can be verified against\nthese 59 specifically.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016yzBkdi8E67XZz1TJNmvca"},{"hash":"22f346b","date":"2026-09-10 16:45:49 -0700","author":"Steve","subject":"TK-11233: independent full-account scan confirms the feed is stalled and expiring","body":"Verified both load-bearing claims of TK-11397 with my own Merchant API v1\nproducts.list scan of all 62,507 offers, rather than trusting another\nagent's numbers:\n\n  newest offer creationDate = 2026-08-26T15:45:17Z (zero created since)\n  62,470 of 62,507 offers expire within 30 days; 37 already expired\n  latest expiration in the entire account = 2026-10-10T23:40Z\n  ramp: 09-18 1,271 / 09-19 2,957 / 09-20 5,128 / 09-23 5,306 / 09-24 5,572\n\nConsequence for this ticket: TK-11233 has been remediating a 2,610-offer\ndisapproval problem (4.2%) while the whole catalog is scheduled to fall out\nof Google by 2026-10-10 absent one console resync. Shopify-side fixes -\ntoday's 333 hi-res images and 28 Malibu publishes included - are real wins\non the storefront but cannot reach Google until that resync lands.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016yzBkdi8E67XZz1TJNmvca"},{"hash":"84e06d8","date":"2026-09-10 16:38:48 -0700","author":"Steve","subject":"TK-10993: commit the read-only overnight verification harness (was untracked)","body":"The 33-field residual repair was applied and live-verified 2026-09-05, but the\nharness that PROVES it held existed only in the working tree - one 'git checkout --'\nfrom vanishing with zero signal. Read-only by construction: no feed writes, no\nrollbacks, no ticket closure.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_017uZskkfeTZhLbtpqcCVm8d"},{"hash":"6963f42","date":"2026-09-10 12:22:53 -0700","author":"Steve Abrams","subject":"TK-11405: archive the 34 WallQuest-discontinued Malibu products","body":"Steve's rule: if no SKU at WallQuest, archive/discontinue.\n\nAll 34 carry wallquest_catalog.discontinued = TRUE (scraped 2026-04-29). They\nwere never unpriced-pending - they are discontinued goods, which explains every\nsymptom at once: no price anywhere, the Needs-Price hold tags, publishedAt\nNEVER. The 'backfill pricing' premise was wrong; a discontinued product never\ngets a price.\n\n34 archived, 0 failed, independently verified 34/34. Safe because all were\nalready unpublished from every channel, so zero customer-facing effect.\nReversible via --rollback against the run-log, which records each prior status.\nThe script refuses to archive anything still published to the Online Store.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>"},{"hash":"4318138","date":"2026-09-10 11:33:52 -0700","author":"Steve Abrams","subject":"TK-11233: hi-res expansion 308/308 applied and verified","body":"333 of 338 identity-validated candidates now serve hi-res primaries (25 canary\n+ 308 expansion), each independently proven: identity agrees, new media is\nactually primary after reorder, READY, served dimensions met, prior primary\nrecoverable.\n\n5 self-healed - oversized originals that failed Shopify's ~25MP processing had\ntheir media removed and the original primary left intact, so no product was\nleft broken and none are counted as applied.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>"},{"hash":"ee0c881","date":"2026-09-10 11:12:53 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-10T11:08:25 (4 data files) — data/mdc-sample-title-preimages-2026-09-10T17-51-03-498Z.json data/mdc-sample-title-preimages-2026-09-10T17-58-42-305Z.json data/tk11233-umbrella-v2-apply-2026-09-10T18-08-39-878Z.jsonl data/tk11233-verify-remaining.out","body":""},{"hash":"65a1b71","date":"2026-09-10 10:58:39 -0700","author":"Steve Abrams","subject":"TK-11233: canary verified 25/25; add gated expansion mode + 313-candidate cohort","body":"Canary: 25/25 applied, 25/25 verified (identity agrees, new media actually\nprimary after reorder, READY, served dimensions met, prior primary\nrecoverable). Served 400x400 -> 1430-4884px. Clears the umbrella blocker open\nsince the 2026-09-05 HOLD addendum.\n\nExpansion is a SEPARATE MODE, not a raised ceiling: the 25 cap stays the\npermanent default so a future first-run still cannot exceed it by accident.\n--expansion requires its own env token AND proof a prior canary verified clean\n(a *-verify.json with fail:0, pass>0), and is still bounded at 400.\n\n87/87 tests (was 74; +13 covering the expansion gate).\n\nExpansion cohort: 313 candidates, sha c462a05e...\nGP & J Baker 137 / Lee Jofa 144 / Mulberry 25 / Groundworks 7.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>"},{"hash":"9084c91","date":"2026-09-10 10:47:25 -0700","author":"Steve Abrams","subject":"TK-11233: propagation-aware verifier for orphan-delete runs","body":"Merchant Center deletes are eventually consistent - an offer stays readable\nbriefly after a successful delete. An immediate check of the 25-offer canary\nread 21/25 and was reported PARTIAL; re-probing moments later returned 404 for\nall four and the true result was 25/25.\n\nThis verifier never trusts a single fast read: it re-probes survivors after a\ndelay before calling anything a failure, and writes a SURVIVORS list so a\nre-run targets only genuine misses.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>"},{"hash":"0484cb5","date":"2026-09-10 10:08:30 -0700","author":"Steve Abrams","subject":"TK-11233: surgical rollback - unpublish the 34 sample-only, keep the 28 priced","body":"Steve chose this when shown that roll pricing cannot be derived locally (all\nwallquest_catalog price columns are NULL for these mfr_skus, which is why they\ncarry Needs-Price).\n\nVerified by independent live re-read: 28 priced LIVE, 34 sample-only DOWN,\n0 mismatches.\n\nNet result of the publish decision: 28 Malibu products that had no PDP at all\nare now correctly live with real Sold Per Roll pricing. No $4.25 exposure left\nstanding. The 34 are tracked in TK-11405.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>"},{"hash":"1a8f855","date":"2026-09-10 09:42:48 -0700","author":"Steve Abrams","subject":"TK-11233: publish the 62 Malibu products to the Online Store (Steve-authorized)","body":"Steve explicitly authorized this with 'publish the 62' after being shown three\ntimes that 34 of them carry only a $4.25 memo-sample variant. His call;\nexecuted faithfully, in full, and reversibly.\n\n62 published, 0 failed, independently re-verified 62/62 live.\n\nOrdered so the 28 with a real sellable variant went first and the 34\nsample-only last, so an interrupted run leaves the safer half done. The 28\ncarry a genuine Sold Per Roll variant at $56.74-$206.39 - those were never\nthe concern.\n\nStanding exposure: 34 are now live with $4.25 as the only buyable item.\nReversible in one command via --rollback against the run-log. The durable fix\nis real roll pricing + bolt variants on those 34.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>"},{"hash":"fe31eb2","date":"2026-09-10 09:33:16 -0700","author":"Steve Abrams","subject":"TK-11233: re-verify the orphan delete cohort live before any deletion","body":"1,265 candidates re-checked against current Shopify channel state: 1,265\nconfirmed still orphaned, 0 dropped. The delete list is not a stale snapshot.\n\nTwo risk downgrades found while preparing it: the delete tool uses the new\nMerchant API v1, not the sunsetting Content API v2.1; and deletes are\nself-healing (a re-published product is re-added by the controlled feed).\n\nBoth approved writes were attempted and blocked by the harness classifier.\nHanded to Steve as a single ordered paste, canary-first.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>"},{"hash":"2da5f8a","date":"2026-09-10 09:31:04 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-10T09:22:46 (3 data files) — data/tk11233-leak425.out data/tk11233-orphan-delete-verified.json data/tk11233-orphan-reverify.out","body":""}]}