Gmc Titlefix

repo: ~/Projects/gmc-titlefix · 189 commits · 3 in last 24h, 15 in last 7d · ▂▃█▄▄

Search the build

189 commits indexed

  1. 8734481 2026-09-26 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
  2. 4f273ef 2026-09-26 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
  3. b8cafe3 2026-09-26 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
  4. 2a68674 2026-09-25 TK-11450: APPLIED v2 CA restore — 41 inputs re-inserted, 0 failed (Steve-approved)
  5. 82f2f09 2026-09-25 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
  6. 3e29ec4 2026-09-25 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
  7. 259f3af 2026-09-24 auto-data-snapshot: 2026-09-24T13:20:22 (1 data files) — data/tk11847-colorway-override-dryrun-2026-09-24T19-58-51.json
  8. 2164b4c 2026-09-24 chore: lint, refactor (session close) + track TK-11847 APPLY rollback artifact
  9. c36bba2 2026-09-24 TK-11847 add merge-recheck script; verified PASS — all 6 overrides merged, no longer legal_restrictions-disapproved
  10. 7b93cd7 2026-09-24 TK-11847 fix double Response-body read in APPLY path
  11. d9f83a8 2026-09-24 TK-11847 Fix Option B: incremental result persistence, transport-error handling, and --from-artifact rollback path
  12. b01c159 2026-09-24 auto-data-snapshot: 2026-09-24T12:49:23 (1 data files) — tk11847-colorway-override.PATCH.md
  13. c2e8ed1 2026-09-23 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.
  14. fa224f8 2026-09-23 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.
  15. 16e8078 2026-09-22 TK-11731: --apply fires the dry-run cohort snapshot with a canary_ts drift guard, not a fresh live-canary read
  16. 10a3116 2026-09-18 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.
  17. 5ee7b7a 2026-09-18 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.
  18. 3fc0eaa 2026-09-18 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.
  19. 01ad6dc 2026-09-18 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.
  20. 99b0473 2026-09-18 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)
  21. d692c74 2026-09-17 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.
  22. 5e4a7db 2026-09-17 auto-data-snapshot: 2026-09-17T22:14:19 (1 data files) — data/tk11450-ca-attr-raw-census-2026-09-18T05-00-20.json
  23. db08423 2026-09-17 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.
  24. 658ba04 2026-09-17 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.
  25. 0a1f915 2026-09-17 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)
  26. ebd1cd8 2026-09-17 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
  27. 5fd115b 2026-09-17 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
  28. efd0ce5 2026-09-17 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
  29. e2de8dd 2026-09-17 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
  30. a50c5ec 2026-09-17 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
  31. c6fcc7a 2026-09-17 auto-data-snapshot: 2026-09-17T14:12:57 (1 data files) — data/tk11449-close-verify.json
  32. 2378dcd 2026-09-17 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
  33. 7657c83 2026-09-16 TK-11844/11847: resolve bare-offer product status; guard destinationStatuses; harden vid fallback
  34. e92df0c 2026-09-16 TK-11844: authoritative Shopify->GMC identity join for Phillip Jeffries showroom-only offers
  35. 8e63c2e 2026-09-16 auto-data-snapshot: 2026-09-16T15:43:40 (2 data files) — data/tk11847-appeal-worklist.json data/tk11847-verify-parity.json
  36. c9c9e59 2026-09-16 fix(mc-read): stop 400 on legacy bare-variant-id offers; tag non-404 as notMeasured (TK-11846)
  37. 192552c 2026-09-16 auto-data-snapshot: 2026-09-16T15:11:20 (1 data files) — data/tk11844-pj-authoritative-join.json
  38. 19c2e6c 2026-09-16 TK-11449: account-wide policy-family locate (61,992 offers) — completeness proof + 2 spinoff tickets
  39. 25a4869 2026-09-16 TK-11449 close-out verification: all 6 tobacco appeals landed, 16/16 cohort accounted for, account-wide policy scan
  40. 5a32a40 2026-09-16 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
  41. 1442626 2026-09-16 TK-11731: add pre-built applier to attach link-override supplemental 10733203704 into primary GMC feed rule
  42. 85783b2 2026-09-13 TK-11568: EXECUTED (Steve-approved) — FLS-2768 94px crop -> 200px dy24-62 image, republished to Google & YouTube
  43. a67d0c3 2026-09-13 TK-11449: pre-delete restore-map for the 1 residual orphan offer (read-only capture, nothing fired)
  44. 655c417 2026-09-13 TK-11568: FLS-2768 image fix executor — 94px crop -> 200px dy24-62 parity image + Google republish (dry-run verified, negative-tested, NOT applied)
  45. 3d1db1c 2026-09-13 auto-data-snapshot: 2026-09-13T02:36:34 (1 data files) — data/tk11568-rollback-map.json
  46. 3c89606 2026-09-13 TK-11449: read-only final verification sweep — 61 deletions hold, 5/5 price fixes serving, residual-3 orphans down to 1 (inert)
  47. f939270 2026-09-13 TK-11449: residual-3 dedup follow-on orphan check — 3 new Google orphans found, gated memo drafted
  48. 8bb2326 2026-09-13 auto-data-snapshot: 2026-09-13T00:21:19 (1 data files) — data/tk11448-apply-ledger.jsonl
  49. 0ebf126 2026-09-13 TK-11559: EXECUTED (Steve-approved) — archive 2 Coordonné stubs + Google-exclude FLS-2768
  50. 5854e2e 2026-09-12 TK-11559: gated Google-channel exclude executor for the 3 tiny-image tail products (dry-run verified, not applied)
  51. 84ec516 2026-09-12 TK-11449: execute residual-3 stripe dedup (Steve-approved 'ungate all 3')
  52. 72268cd 2026-09-12 TK-11493: apply-ledger for 22 live featured-image fixes (reversibility record)
  53. 9ff1688 2026-09-12 TK-11493: sub-100px featured-image remediation plan + dry-run executor (22 fixes: 20 Scalamandré Scene7 same-asset, 2 reorder; 3 vendor-fetch tail)
  54. b1fe027 2026-09-12 TK-11449: execute Steve-approved orphan-unpublish (61) + price-mismatch fix (3)
  55. b831bb3 2026-09-12 auto-data-snapshot: 2026-09-12T07:18:58 (2 data files) — data/tk11522-hollywood-RESTOREMAP-20260912T071930.txt data/tk11522-own-domains-RESTOREMAP-20260912T072328.txt
  56. 231b750 2026-09-12 TK-11449: measure survivor Google-offer coverage — bounds the orphan-unpublish carve-out to 1 product
  57. 8f75855 2026-09-11 auto-data-snapshot: 2026-09-11T15:49:18 (1 data files) — data/tk11522-fentucci-RESTOREMAP-20260911T153908.txt
  58. dd8a5b8 2026-09-11 auto-data-snapshot: 2026-09-11T15:15:48 (1 data files) — data/tk11522-registry-url-RESTOREMAP-20260911T145008.txt
  59. 33da7f5 2026-09-11 TK-11522/11523: full vendor-edge sweep — 126 testable, 27 broken, 0 proxy-fixable
  60. 01d3acd 2026-09-11 TK-11448: per-bucket remediation + why-the-62-pending-crawl-are-stuck (evidence-backed)
  61. ffe6554 2026-09-11 5x: TK-11448 verify-and-fix report — 4 sweeps, 1 real defect (in the probe), 2 consecutive clean
  62. 6308654 2026-09-11 5x sweep 3: widen storefront check 8 -> all 33, add fault-injection self-test
  63. c0bbc10 2026-09-11 5x sweep 1: fix the storefront probe — redirect:follow measured the homepage, not the product
  64. e42e577 2026-09-11 TK-11448: archive 33 vendor-discontinued products (Shopify + FileMaker), verified
  65. 3e98b29 2026-09-11 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
  66. df15890 2026-09-11 TK-11448: prove vendor absence 3 ways, build archive plan (33) + dry-run-default archive executor
  67. 8246589 2026-09-11 TK-11448: remediation plan for 19 placeholder-featured products + dry-run-default executor
  68. 5931b12 2026-09-11 TK-11449: post-dedup read-only measurement of the tobacco-16 and price_mismatch residuals
  69. f15f264 2026-09-11 auto-data-snapshot: 2026-09-11T11:23:31 (1 data files) — data/tk11448-remediation-plan.json
  70. 72d7a55 2026-09-11 TK-11448: verify GMC image buckets at full population; find the gray broken-image placeholder on 51 live products
  71. 6718c59 2026-09-11 TK-11449: add substring-vs-token negative test + NOT_MEASURED bucket + adjacent-surface caveats
  72. 4f6033c 2026-09-11 TK-11449: read-only sweep of all 709 Shopify collections for title-substring smart rules + empirical title-edit impact simulation
  73. add0706 2026-09-11 TK-11449: dedup 67 Fentucci stripe pairs (DTD verdict A, Steve-approved)
  74. 1cda2e5 2026-09-11 TK-10993: 9-link rename repair APPLIED and verified live (9/9, zero collateral)
  75. a32a20b 2026-09-11 TK-11449: 115 true Fentucci duplicate pairs, and the trap in the obvious signal
  76. 701a7af 2026-09-11 TK-11450: relabel 76 CA offers USD->CAD (Steve-approved option C), amounts untouched
  77. 4adf88c 2026-09-11 TK-10993: fix a 5th hardcoded parent constant that would have deadlocked the run
  78. 3093fdb 2026-09-11 auto-data-snapshot: 2026-09-11T08:57:34 (1 data files) — data/tk10993-rename-repair-20260911/preflight-2026-09-11T15-35-34-666Z.json
  79. 413a3ac 2026-09-11 TK-10993: fix a scope guard that made the executor unrunnable, + commit real receipts
  80. 209bcae 2026-09-11 TK-11450: price writers stamped USD on CA-feed offers, disapproving 81 of 81
  81. 3c07dd5 2026-09-11 TK-10993: pinned 9-link rename-repair manifest + executor (validated, unfired)
  82. 7f2c1f9 2026-09-10 TK-11449: refute the Mayenne overcharge claim (verification record)
  83. aa7a9f6 2026-09-10 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
  84. 719c07f 2026-09-10 TK-11449: read-only diagnosis — tobacco_policy_violation + the 3 real price_mismatch
  85. 952fb7d 2026-09-10 TK-11448: 631 live offers advertise a 2019 screenshot, and the images already exist
  86. d055974 2026-09-10 TK-11450: audit all three primary feeds - Canada currency defect + an earlier expiry deadline
  87. 47f4a32 2026-09-10 TK-11233 sub-buckets: read-only live audit of the LPE remainder + the five small disapproval buckets
  88. 802cef2 2026-09-10 TK-11233 B2: READ-ONLY live enumeration + root-cause of missing_shipping_weight
  89. 0ea81e9 2026-09-10 TK-11233: risk-check finds 59 orphan-deletes collided with a concurrent publish
  90. 22f346b 2026-09-10 TK-11233: independent full-account scan confirms the feed is stalled and expiring
  91. 84e06d8 2026-09-10 TK-10993: commit the read-only overnight verification harness (was untracked)
  92. 6963f42 2026-09-10 TK-11405: archive the 34 WallQuest-discontinued Malibu products
  93. 4318138 2026-09-10 TK-11233: hi-res expansion 308/308 applied and verified
  94. ee0c881 2026-09-10 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
  95. 65a1b71 2026-09-10 TK-11233: canary verified 25/25; add gated expansion mode + 313-candidate cohort
  96. 9084c91 2026-09-10 TK-11233: propagation-aware verifier for orphan-delete runs
  97. 0484cb5 2026-09-10 TK-11233: surgical rollback - unpublish the 34 sample-only, keep the 28 priced
  98. 1a8f855 2026-09-10 TK-11233: publish the 62 Malibu products to the Online Store (Steve-authorized)
  99. fe31eb2 2026-09-10 TK-11233: re-verify the orphan delete cohort live before any deletion
  100. 2da5f8a 2026-09-10 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
  101. a9c80ef 2026-09-10 TK-11233: 62-Malibu publish lane is DISQUALIFIED, not deprioritized
  102. 165be73 2026-09-09 Reject MDC sources that claim both primary and supplemental types
  103. 853cb8f 2026-09-09 Preserve historical proof and scope MDC evidence to its ticket
  104. 6ed630b 2026-09-09 Require MDC CLI tests to prove intended source rejection
  105. 71e1db5 2026-09-09 Reject unresolved MDC sample title sources before inserts
  106. 042d3cd 2026-09-10 TK-11233: reporting-context hypothesis for the LPE count gap is disproven
  107. a8bd5c2 2026-09-10 auto-data-snapshot: 2026-09-10T08:12:39 (5 data files) — data/tk11233-lpe-classify.out data/tk11233-lpe-probe.out data/tk11233-umbrella-shortlist-2026-09-10T15-03-24-060Z-canary25.json data/tk11233-umbrella-shortlist-2026-09-10T15-03-24-060Z.json data/tk11233-v2-select.out
  108. af743e5 2026-09-10 TK-11233: derive an exact <=25-product canary cohort with its own hash
  109. a07ace5 2026-09-10 TK-11233: verify must not report a vacuous pass on an empty run-log
  110. 7877b0d 2026-09-10 TK-11233: authoritative landing_page_error classification of all 2,278 offers
  111. f8d022d 2026-09-10 TK-11233: fix two fail-closed selector bugs; add authoritative LPE classifier
  112. 57dde34 2026-09-10 TK-11233: identity-validated, shortlist-bound umbrella hi-res v2 + LPE enumeration
  113. be34cf5 2026-09-10 auto-data-snapshot: 2026-09-10T00:28:57 (1 data files) — data/track-c-canary-current.json
  114. f78c7a1 2026-09-10 gmc-titlefix: migrate remaining v2.1 read tools to _mc-read-v1.js shim + flag spent one-offs (TK10993)
  115. 3628b9f 2026-09-10 gmc-titlefix: add Merchant API v1 read shim + migrate verify-canary & lever2-add-recheck off sunset v2.1
  116. 8bc8356 2026-09-09 auto-data-snapshot: 2026-09-09T08:59:31 (1 data files) — data/mdc-sample-title-overrides.json
  117. 6b3b6dd 2026-09-09 auto-data-snapshot: 2026-09-09T08:26:36 (1 data files) — data/mdc-sample-title-overrides.json
  118. 8f147e6 2026-09-09 gmc mdc-title: fix 404 — bare-variant offerId, en~US~ name, reuse linked datasource (TK-11307)
  119. 37f1e17 2026-09-09 gmc: MDC Google sample-title override (DTD verdict B, TK-11307)
  120. 105c2ff 2026-09-05 auto-data-snapshot: 2026-09-05T08:46:42 (7 data files) — data/tk10993-approved-residual-20260905/verify-2026-09-05T15-41-19-381Z.json data/tk10993-overnight-20260905/2026-09-05T15-41-11-092Z/audit.json data/tk10993-overnight-20260905/2026-09-05T15-41-11-092Z/canada.json data/tk10993-overnight-20260905/2026-09-05T15-41-11-092Z/process-results.json data/tk10993-overnight-20260905/2026-09-05T15-41-11-092Z/result.json
  121. 7f6b851 2026-09-05 auto-data-snapshot: 2026-09-05T00:27:41 (3 data files) — data/tk10993-overnight-20260905/config.json data/tk11233-kravet-hires-canary.json verification/tk10993-approved-decision-record.md
  122. 6502a02 2026-09-05 Verify all 33 approved GMC residual corrections live
  123. 791ac44 2026-09-05 Apply and verify approved GMC residual canaries with scoped PATCHes
  124. 5eddebd 2026-09-05 TK-11233 B3: umbrella hi-res canary (Lee Jofa/GP&J Baker/Mulberry/Groundworks) — reuses proven Kravet apply/rollback/self-heal, joins kravet_catalog by mfr_sku/dw_sku, --vendor filter, apply hard-gated
  125. 5f8a35c 2026-09-04 auto-data-snapshot: 2026-09-04T23:48:35 (1 data files) — data/tk10993-approved-residual-20260905/preflight-2026-09-05T06-57-24-879Z.json
  126. 7a897c7 2026-09-04 Audit remaining GMC feed defects and consolidate approval evidence
  127. f62f718 2026-09-04 Fix Canada shipping verification and fail closed on unreadable data
  128. 78a8c7b 2026-09-04 auto-data-snapshot: 2026-09-04T14:13:19 (4 data files) — data/tk11233-kravet-hires-apply-2026-09-04T20-37-02-951Z.jsonl data/tk11233-kravet-hires-apply-2026-09-04T20-50-59-063Z.jsonl data/tk11233-kravet-hires-apply-2026-09-04T21-14-21-407Z.jsonl data/tk11233-kravet-hires-canary.json
  129. b7bbcf1 2026-09-04 auto-data-snapshot: 2026-09-04T13:35:12 (5 data files) — data/tk11233-kravet-hires-apply-2026-09-04T20-00-14-448Z.jsonl data/tk11233-kravet-hires-apply-2026-09-04T20-09-45-183Z.jsonl data/tk11233-kravet-hires-apply-2026-09-04T20-19-27-843Z.jsonl data/tk11233-kravet-hires-apply-2026-09-04T20-37-02-951Z.jsonl data/tk11233-kravet-hires-canary.json
  130. c7848e1 2026-09-04 auto-data-snapshot: 2026-09-04T12:55:58 (5 data files) — data/tk11233-kravet-hires-apply-2026-09-04T19-12-28-194Z.jsonl data/tk11233-kravet-hires-apply-2026-09-04T19-40-08-698Z.jsonl data/tk11233-kravet-hires-apply-2026-09-04T19-48-29-857Z.jsonl data/tk11233-kravet-hires-apply-2026-09-04T20-00-14-448Z.jsonl data/tk11233-kravet-hires-canary.json
  131. af42c04 2026-09-04 TK-11233 B3: driver honors START_OFFSET for resume after session teardown
  132. 663c9f5 2026-09-04 auto-data-snapshot: 2026-09-04T12:10:54 (4 data files) — data/tk11233-kravet-hires-apply-2026-09-04T18-39-41-137Z.jsonl data/tk11233-kravet-hires-apply-2026-09-04T18-51-02-452Z.jsonl data/tk11233-kravet-hires-apply-2026-09-04T19-12-28-194Z.jsonl data/tk11233-kravet-hires-canary.json
  133. e2478b3 2026-09-04 TK-11233 B3: deterministic --offset pagination + chunked resumable driver (visible progress)
  134. 7480c9d 2026-09-04 TK-11233 B3: skip >5000px/25MP originals up front (avoid Shopify processing-fail churn)
  135. eb7b9da 2026-09-04 TK-11233 B3: canary run 25@1200 + self-heal FAILED media (Shopify >~25MP processing ceiling)
  136. 835144c 2026-09-04 TK-11233 B3: --min/--cap args for approved canary run (threshold 1200, cap 25)
  137. 4e97f12 2026-09-04 TK-11233 B3: Kravet-family hi-res re-fetch canary (read-only enumerate + gated reversible apply)
  138. 9b6af59 2026-09-04 TK-10993 Track G: read-only policy-disapproval enumerator
  139. 9feab81 2026-09-04 TK-10993: read-only US disapproval snapshot by issue code
  140. a84ae54 2026-09-04 TK-10993: gate the canary verdict on the config actually landing
  141. 74802ae 2026-09-03 TK-10993: CA/GB recovery verifier + pre-change baseline
  142. 51a533b 2026-09-03 TK-10993: track read-only Track-C roll-leak enumerator (produced the already-committed data/genuine-rollleaks.json in d3daab6)
  143. 4cadd62 2026-08-31 auto-data-snapshot: 2026-08-31T11:55:57 (1 data files) — data/track-c-canary-current.json
  144. d3daab6 2026-08-31 auto-data-snapshot: 2026-08-31T11:17:15 (3 data files) — data/genuine-rollleaks.json data/track-c-snapshots/primary-180695450-pre-link-2026-08-31T18-17-58-130Z.json data/track-c-snapshots/primary-180695450-pre-link-2026-08-31T18-17-58-130Z.manifest.json
  145. db4fabc 2026-08-31 preserve current TK-00066 canary evidence
  146. 6cddcda 2026-08-31 snapshot before TK-00066 verification observability fix
  147. c92e6cf 2026-08-31 TK-00066/Track C: price-override DS linked into primary feed (466 $4.25 leak fix) — verified live, pre-link snapshot = rollback handle
  148. fed19ed 2026-08-31 Record bounded TK-10993 hold proof
  149. b765ca5 2026-08-31 Record TK-10993 Track C hold proof
  150. 8aadce1 2026-08-31 Execute bounded GMC orphan cleanup with proof
  151. b819e4c 2026-08-31 Record GMC Track C end-to-end proof
  152. b2e9868 2026-08-31 auto-data-snapshot: 2026-08-31T02:00:54 (3 data files) — data/tk10993-track-d/apply-2026-08-31T09-07-41-453Z.jsonl data/tk10993-track-d/preflight-2026-08-31T09-03-03-606Z.json data/tk10993-track-d/preflight-2026-08-31T09-07-41-453Z.json
  153. 2792808 2026-08-31 Harden GMC Track C preflight and rollback
  154. 50a1f6e 2026-08-28 auto-data-snapshot: 2026-08-28T00:19:23 (5 data files) — data/primary-fix-batch-candidates.json data/primary-fix-batch-log.jsonl data/primary-fix-batch-restore-map.json data/primary-fix-batch-result.json data/primary-fix-batch-verify.json
  155. 93cd987 2026-08-27 auto-data-snapshot: 2026-08-27T23:42:41 (1055 data files) — data/primary-fix-batch-candidates.json data/primary-fix-batch-log.jsonl data/primary-fix-batch-restore-map.json data/primary-fix-batch-result.json data/primary-fix-rollback/shopify_US_7800000184371_44126707384371.json
  156. 1783667 2026-08-27 auto-data-snapshot: 2026-08-27T23:05:47 (4003 data files) — data/primary-fix-batch-candidates.json data/primary-fix-batch-log.jsonl data/primary-fix-batch-restore-map.json data/primary-fix-rollback/shopify_US_7413514141747_42625371209779.json data/primary-fix-rollback/shopify_US_7413514731571_42625373274163.json
  157. 64fe06a 2026-08-27 auto-data-snapshot: 2026-08-27T21:15:13 (3 data files) — data/primary-fix-batch-verify.json data/remaining-probe.err data/remaining-probe.out
  158. 4d45f37 2026-08-27 TK-10862: batch-1 applied 4000 GMC primary-fix roll-price supersedes (0 fail)
  159. b374c23 2026-08-27 auto-data-snapshot: 2026-08-27T20:38:24 (4007 data files) — data/apply-batch1.err data/apply-batch1.out data/dryrun-bounded.err data/dryrun-bounded.out data/primary-fix-batch-candidates.json
  160. 3b8cf76 2026-08-27 auto-data-snapshot: 2026-08-27T20:01:28 (250 data files) — data/dryrun-bounded.err data/dryrun-bounded.out data/dryrun-full.err data/dryrun-full.out data/primary-fix-rollback/shopify_US_1494830383216_13898055221360.json
  161. 95d0cb6 2026-08-27 TK-10862: two-phase enumeration (fast Shopify scan + concurrent GMC probe), SCAN_CAP + CONC
  162. b76a6a6 2026-08-27 TK-10862: scaled primary-fix batch runner (capped, reversible, verify)
  163. 0ab1c50 2026-08-27 TK-10451: primary-source GMC $4.25 leak fix — canary proves overwriting sample offer in primary DS 180695450 wins the merge (3/3 served real roll price)
  164. 463ca3d 2026-08-27 track canary tooling (apply-canary/build-fresh-canary/verify-canary) used by TK-10635 remediation
  165. 436960a 2026-08-27 TK-10635: add gated feed-linkage fix (root cause of $4.25 leak: price-override DS never linked to primary 180695450) + rollback
  166. 137e34a 2026-08-26 Add gated apply-full.mjs for the 10,352-row GMC $4.25 remediation (TK-00066)
  167. 7a7e72b 2026-07-28 auto-save: 2026-07-28T17:01:56 (2 files) — data/ lever2-add-recheck.mjs
  168. 9204be4 2026-07-27 price-override: --apply self-resolves DS (file→DEFAULT_DS), no <DS> placeholder — auto-executor safe
  169. c10e177 2026-07-26 auto-save: 2026-07-26T17:14:46 (1 files) — gmc-price-override.js
  170. 2abd4af 2026-07-17 auto-save: 2026-07-17T19:47:29 (1 files) — gmc-dwla-peryard-primary.js
  171. 93e51cb 2026-07-09 weight-override: DEFAULT_DS so --apply needs no long arg (terminal-wrap-safe) + short ~/gw.sh wrapper
  172. 327c4ba 2026-07-09 add --samples-only mode: fix ONLY $4.25 samples @ 0.35lb, leave rolls (Steve: rolls already correct)
  173. f57f894 2026-07-09 verify-link: check authoritative primary rule (reverse-pointer lags) — confirms weight DS linked
  174. 1e92087 2026-07-09 add --link mode: append weight supplemental to primary 180695450 rule (dry-run default, --yes to apply)
  175. 766c063 2026-07-09 weight-override FIX-FIRST (contrarian): +verify-link/list-ds modes, stratified canary (both offerId formats), body-error check, kill undefined WEIGHT_LB; discovered DS 10683334493 NOT linked → must link to primary 180695450 first
  176. e01bb10 2026-07-09 weight override: tiered feed weights — real 1lb / samples 0.35lb (Steve 2026-07-09)
  177. 0cd0040 2026-07-09 add gmc price-override + shipping-weight-override generators (feed-only, checkout untouched; gated to run)
  178. 282cc63 2026-07-09 auto-save: 2026-07-09T08:39:40 (1 files) — _diag425-tmp.js
  179. a04456a 2026-07-09 auto-save: 2026-07-09T08:09:34 (2 files) — _diag425-tmp.js gmc-price-override.js
  180. cefbf23 2026-07-03 chore: macstudio3 migration — reconcile from mac2 + repoint paths (stevestudio2→macstudio3, node/npm/npx→/opt/homebrew)
  181. e79940d 2026-06-18 wrapper: auto-execute authorized retry (Steve go) after final verify, then re-verify; >3000 not-flipped safety abort; residual draft if any survive
  182. 084653f 2026-06-18 step-f: bounded verify-gated retry (dry-run default, CONFIRM_RETRY=1 to push); step-e emits full not-flipped list; wrapper auto-dry-runs + drafts gated retry (DTD-unanimous A)
  183. 85cc622 2026-06-18 step-e: DTD-B verify-and-retry — page processed feed, re-push only un-flipped offers
  184. 78f9b56 2026-06-18 step-2: full-feed verifier + wait-for-scaleout-then-verify wrapper
  185. 278654a 2026-06-18 spotcheck: verify 500-batch title flips landed on Google (8/8 across 5 vendors)
  186. 3ac8233 2026-06-17 step-d: add LIMIT env knob for staged batches (verify-gate preserved)
  187. 18e376c 2026-06-17 canary diag: verified full override chain (supplemental→owning primary 180695450→feed rule); flip is pure reprocess-cadence wait, not misconfig; self-terminating poller
  188. 3a48449 2026-06-17 Fail-closed verify gate: step-c writes PASS marker, step-d blocks without it (vp-compliance-policy ask)
  189. d584d28 2026-06-17 GMC $4.25 sample-only title-fix: list + draft Merchant API supplemental-override scripts (DTD-B Step 1)

Authors

Agents used

  • vp-dw-commerce1
  • vp-compliance-policy1

Skills used

  • /claude81
  • /code81
  • /tk11233-kravet-hires-apply-2026-09-14
  • /tk11731-run9
  • /tk11731-prestate-2026-09-5
  • /tk10993-overnight-202609055
  • /tk11233-kravet-hires-canary5
  • /track-c-snapshots4
  • /primary-fix-batch-candidates4
  • /primary-fix-rollback4
  • /dryrun-bounded4
  • /material3
  • /image3
  • /availability3
  • /products3
  • /tk10993-track-d3
  • /primary-fix-batch-log3
  • /primary-fix-batch-restore-map3
  • /tk11450-ca-restore-v2-map-2026-09-2
  • /audit2
  • /link2
  • /tk11847-verify-parity2
  • /tk11731-cohort-latest2
  • /tk11449-close-verify2
  • /primary-180695450-pre-link-2026-09-2
  • /log-exec2
  • /tk11448-apply-ledger2
  • /preflight-2026-09-2
  • /mdc-sample-title-preimages-2026-09-2
  • /tk11233-umbrella-shortlist-2026-09-2

Creative ideas + design notes

Commits with substantial prose (≥120 chars) — the rationale behind each move.

8734481 · 2026-09-26 · 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
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GtefE2GDYpR1uuZZiqNVjV
4f273ef · 2026-09-26 · 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
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GtefE2GDYpR1uuZZiqNVjV
b8cafe3 · 2026-09-26 · 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
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GtefE2GDYpR1uuZZiqNVjV
2a68674 · 2026-09-25 · TK-11450: APPLIED v2 CA restore — 41 inputs re-inserted, 0 failed (Steve-approved)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015SYWczdX19LZ3mPb7fz2iF
82f2f09 · 2026-09-25 · 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
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015SYWczdX19LZ3mPb7fz2iF
2164b4c · 2026-09-24 · chore: lint, refactor (session close) + track TK-11847 APPLY rollback artifact
Behavior-preserving: saveState/fmtOffer helpers in merge-recheck; drop dead
lastResultArtifact var in override script. node --check + dry-run clean.
No version field in repo (no bump).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Sb592So8iWsxtsmVsiTMfq
c36bba2 · 2026-09-24 · TK-11847 add merge-recheck script; verified PASS — all 6 overrides merged, no longer legal_restrictions-disapproved
Confirms the --apply run cleared all 6 offers within ~10 minutes: color+material
attributes merged and none still legal_restrictions_policy_violation-disapproved.
Launchd durable-cron memo superseded (no longer needed) — moved to _done/.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Sb592So8iWsxtsmVsiTMfq
7b93cd7 · 2026-09-24 · TK-11847 fix double Response-body read in APPLY path
d9f83a8 called resp.json() then resp.text() on the same Response; on a
successful insert the second read throws 'Body is unusable' (a TypeError
the transport guard does not match), crashing after the first live write
before its result/realName was flushed. Read the body once, JSON.parse it.
Verified: node --check, mock-Response repro of old vs new, DRY-RUN clean
(6/6 LR, zero writes).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Sb592So8iWsxtsmVsiTMfq
d9f83a8 · 2026-09-24 · TK-11847 Fix Option B: incremental result persistence, transport-error handling, and --from-artifact rollback path
- Move result persistence inside the loop (after each write) so a transport failure mid-loop leaves an audit trail
- Wrap fetch in try/catch to detect and exit loudly on transport errors (network/DNS/TLS failures)
- Parse the real resource 'name' from successful insert responses and store it for rollback use
- Require --from-artifact <path> on rollback to read the prior APPLY artifact
- If --from-artifact is missing on rollback, fail with exit code 1 and print usage
- Rollback now deletes by the real resource names (avoiding 404s on legacy-feed products)
- Fall back to guessed names if realName is absent (backward compat with old APPLY artifacts)

All three findings from the code review are now addressed:
(1a) Incremental persistence prevents loss of the audit trail on transport failure
(1b) Rollback now uses the actual created names from the APPLY artifact
(2) --from-artifact enforces correct rollback behavior and prevents silent 404s

Dry-run behavior is unchanged (zero writes before line 92).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Sb592So8iWsxtsmVsiTMfq
c2e8ed1 · 2026-09-23 · 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.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PP5PN6yC4vLgDAvFqpS1qJ
fa224f8 · 2026-09-23 · 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.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PP5PN6yC4vLgDAvFqpS1qJ
16e8078 · 2026-09-22 · TK-11731: --apply fires the dry-run cohort snapshot with a canary_ts drift guard, not a fresh live-canary read
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DP24DdLpG6PHXgmjr47TVb
10a3116 · 2026-09-18 · 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.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Xkg7MT5FYYmJF5ovKBsko
5ee7b7a · 2026-09-18 · 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.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Xkg7MT5FYYmJF5ovKBsko
3fc0eaa · 2026-09-18 · 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.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Xkg7MT5FYYmJF5ovKBsko
01ad6dc · 2026-09-18 · 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.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Xkg7MT5FYYmJF5ovKBsko
7657c83 · 2026-09-16 · TK-11844/11847: resolve bare-offer product status; guard destinationStatuses; harden vid fallback
- tk11844: build variantId->productId map so bare-numeric offers (offerId IS the
  variant id) resolve their product; shopify_product_status was
  "(bare-offer:unknown-pid)" for 7/27 rows. Re-run: all 27 now ACTIVE, and 2 of the
  formerly-blind bare offers are SERVING on ACTIVE products (Sakka, Haiku). Removed
  dead `sp` line that needlessly materialized pjProducts.entries() per hit.
- tk11847: guard p.destinationStatuses?.[0]?.status (empty array no longer throws
  and silently drops the GMC read into parity_unknown); harden vid to fall back to
  the numeric tail so prefixed offers without ?variant= still resolve.

Both scripts remain strictly read-only ($0, no Shopify/GMC writes).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TAwgQZWgKL5R6d5uLG3QUt
e92df0c · 2026-09-16 · TK-11844: authoritative Shopify->GMC identity join for Phillip Jeffries showroom-only offers
READ-ONLY. Complete 61,992-offer GMC walk joined by product/variant identity (both
offerId forms) against vendor='Phillip Jeffries' (4147 products/4278 variants). True
count = 27 live GMC offers (16 SERVING, 11 disapproved), not the TK-11449 text-match
count of 7 — the text matcher missed 20 pattern-named PJ products. 0 false positives.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
c9c9e59 · 2026-09-16 · fix(mc-read): stop 400 on legacy bare-variant-id offers; tag non-404 as notMeasured (TK-11846)
toV1Name unconditionally prepended 'online~', so a legacy bare-variant feed
name (en~US~<offerId>, e.g. all 945 MDC offers) became online~en~US~<id> /
online~<id> and getProduct() returned HTTP 400 '[name] Invalid' for every one.
A caller treating that throw as 'no override present' gets a false negative on
a compliance check.

- toV1Name now: strips a full 'accounts/<mid>/products/' prefix; passes a
  '~'-delimited v1 name through verbatim (legacy en~US~x AND online~en~US~x);
  swaps colon v2.1 rids; defaults a bare offerId to the online feed.
- getProduct tags a non-404 failure e.notMeasured=true so a 400/401/403/429/5xx
  reads as UNKNOWN (NOT_MEASURED), never as a genuine absence. Only a clean 404
  is 'product absent'.

Verified live: en~US~<id> and accounts/.../products/en~US~<id> now 200; colon
form unchanged (200); bogus id -> 404 notMeasured=false. 6/6 toV1Name unit cases pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013EXLAV5g4HHux54nArJfyX
19c2e6c · 2026-09-16 · TK-11449: account-wide policy-family locate (61,992 offers) — completeness proof + 2 spinoff tickets
Proves by IDENTITY (not by aggregate arithmetic) that account-wide
DISAPPROVED tobacco_policy_violation = 1 and it is the already-routed
Saint Germain Hemp II, so TK-11449's measurement is no longer cohort-bound.

Spinoffs filed rather than absorbed into a closing ticket:
- TK-11844 Phillip Jeffries showroom-only still has >=8 live GMC offers, >=4 SERVING
- TK-11847 29 offers disapproved on legal_restrictions because 'Champagne' is a
  colorway name — same classifier false-positive as the Hemp/tobacco six, and
  28/29 are still partly serving

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014n9AwiqukwYaLECtAEMvXd
25a4869 · 2026-09-16 · TK-11449 close-out verification: all 6 tobacco appeals landed, 16/16 cohort accounted for, account-wide policy scan
Read-only, $0. Evidence for closing TK-11449:
- 6 Fentucci Naturals tobacco offers now approved 6/6 contexts, zero item-level issues
- landing-side parity re-checked (the Batik trap): 4.25 advertised == 4.25 rendered, 6/6 published
- the other 10 of the original 16 re-measured: 9 absent (404), 1 (Saint Germain Hemp II) still
  disapproved and correctly routed as Phillip Jeffries showroom-only
- account-wide: accountIssues=0, tobacco_policy_violation=1 product total (the routed one),
  so the measurement is no longer cohort-bound

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014n9AwiqukwYaLECtAEMvXd
1442626 · 2026-09-16 · TK-11731: add pre-built applier to attach link-override supplemental 10733203704 into primary GMC feed rule
Dry-run-verified reversible variant of link-price-override-ds.mjs. Fixes the ineffective
456 link overrides (supplemental was never in primary 180695450 takeFromDataSources).
Gated fire: node link-tk11731-override-ds.mjs --apply --yes-i-am-steve; rollback via
link-price-override-ds-ROLLBACK.mjs. GATED external Google feed-structure write — dry-run default.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019Mtyx9YjTzzxpt6Sr1UqCZ
85783b2 · 2026-09-13 · TK-11568: EXECUTED (Steve-approved) — FLS-2768 94px crop -> 200px dy24-62 image, republished to Google & YouTube
Verified live and independently of the script's own read-back: featured media
200x200 READY, old 94px retained as media[1] (reversible), publishedOnGoogle=true,
product ACTIVE. Storefront PDP confirmed serving the 200x200 as primary image.

Also fixed a real bug the run exposed: the ledger call pointed at
~/.claude/yolo-queue/log-exec.mjs, which does not exist — the script lives at
executed-reversible/log-exec.mjs. The action is ledgered.

GMC still serves the stale 94px image and image_too_small; that clears on the next
successful Shopify->Google push (stalled since 2026-08-26, TK-11533).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015HGZ2dpPSE6bcNgojVpho1
a67d0c3 · 2026-09-13 · TK-11449: pre-delete restore-map for the 1 residual orphan offer (read-only capture, nothing fired)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GVWLj6gbs5W5uaJTJqpUFC
655c417 · 2026-09-13 · TK-11568: FLS-2768 image fix executor — 94px crop -> 200px dy24-62 parity image + Google republish (dry-run verified, negative-tested, NOT applied)
Identity evidence: pixel slide-match of the 94px crop over all 60 sibling FLS
images -> best mean-abs-diff 14.67 on the three dy24-62 products vs 57.51 for the
next-best different colorway (median 223.23). Independently corroborated by the
AI colour hex (#6D4C38 vs #674734, delta 6/5/4 per channel; a different colorway
is #D3CBAF) and by FileMaker master rec 72119 (Mfr Pattern dy24-62).

Guards fail closed and are negative-tested: aborts if the target is already
>=200px, if the donor is below the 200px floor, or if the Google publication
state cannot be read. Rollback map written before any mutation.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015HGZ2dpPSE6bcNgojVpho1
3c89606 · 2026-09-13 · TK-11449: read-only final verification sweep — 61 deletions hold, 5/5 price fixes serving, residual-3 orphans down to 1 (inert)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GVWLj6gbs5W5uaJTJqpUFC
f939270 · 2026-09-13 · TK-11449: residual-3 dedup follow-on orphan check — 3 new Google orphans found, gated memo drafted
Read-only check (tk11449-residual3-orphan-check.mjs) confirms the 3 products archived by the
residual-3 dedup (executed 2026-09-13 06:47Z, after the main 61-offer orphan sweep already ran)
left the identical orphan-offer gap: $195.00 advertised, lands on the survivor's $4.25 sample.
All 3 survivors already carry their own offer, so no carve-out needed. Gated memo drafted, nothing fired.
0ebf126 · 2026-09-13 · TK-11559: EXECUTED (Steve-approved) — archive 2 Coordonné stubs + Google-exclude FLS-2768
Verified live: love-stars-cor-23333 + lola-leaf-stripes-cor-23336 -> ARCHIVED (off
all channels); faux-leaf-squares-fls-2768 -> ACTIVE but unpublished from Google &
YouTube (stays sellable elsewhere; real image is a follow-up). All 3 out of GMC ->
image_too_small DISAPPROVED clears. Reversible via rollback maps, ledgered.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KfevHRTapvcS2vMNNuC31z
5854e2e · 2026-09-12 · TK-11559: gated Google-channel exclude executor for the 3 tiny-image tail products (dry-run verified, not applied)
Revises DTD-B (archive all 3): read-only per-SKU due-diligence shows FLS-2768 is
a live sellable Hollywood roll ($31.92/yd) that must NOT be archived, and the 2
Coordonne are Showroom Line stubs. Reversible fix = publishableUnpublish from
Google & YouTube (Koroseal/Majilite precedent), rollback-map first.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KfevHRTapvcS2vMNNuC31z
84ec516 · 2026-09-12 · TK-11449: execute residual-3 stripe dedup (Steve-approved 'ungate all 3')
Golden x2 + Margot Magenta: same proven 2-variant-2024-vs-40-variant-2025
shape as the 67 already-executed pairs. Both handles end in a digit (the
mixed-family exception), so the generic regex-based orig/survivor selector
in tk11449-dedup-execute.mjs can't be reused as-is; pairs are hardcoded here
after re-verifying live variant counts. Restore map written before first
write, per-pair read-back gate, halt-on-mismatch (unused — all 3 clean).
3/3 applied and independently re-verified via a fresh script (not trusting
the run's own success line).

Also: read Batik/Glambeads' full live MC record before attempting their
price fix. Both offer IDs and links already encode their own sample variant
(not a link-pointing-at-wrong-variant bug) — the correct fix really is
price=$4.25 on both, matching the memo's original ask. The write is
consistently blocked by the Claude Code auto-mode classifier (a $4.25
price-override write pattern this repo's own docs flag repeatedly as the
account-suspension-risk signature) — handed to Steve as a paste rather than
attempting to route around a deliberate guardrail.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E2whC5qTE7dEhVmqFe8pND
72268cd · 2026-09-12 · TK-11493: apply-ledger for 22 live featured-image fixes (reversibility record)
Steve-approved 2026-09-13. 22/22 verified featured min-edge>=100px live. Undo ids recorded per row.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KfevHRTapvcS2vMNNuC31z
9ff1688 · 2026-09-12 · TK-11493: sub-100px featured-image remediation plan + dry-run executor (22 fixes: 20 Scalamandré Scene7 same-asset, 2 reorder; 3 vendor-fetch tail)
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).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KfevHRTapvcS2vMNNuC31z
b1fe027 · 2026-09-12 · TK-11449: execute Steve-approved orphan-unpublish (61) + price-mismatch fix (3)
Orphan-unpublish: selected the exact 61 live GMC offers created by the 67-pair
Fentucci dedup (matched by resolving each offer's underlying Shopify product/
variant ID against the dedup restore map, not by stale link-handle text),
excluded the pano-stripe-peck-drive-plum carve-out (turned out to have 0
matching offers, so the exclusion was a no-op), deleted via the existing
hardened gmc-full-orphan-delete.mjs (channel guard, 1-offer canary, then the
remaining 60), verified 61/61 confirmed absent.

Price-mismatch: corrected the 3 clear under-advertised Brunschwig offers
(Mayenne/Maizan/Sufera) via the DW Real-Price Overrides datasource
(10693978453), canary-then-remainder, verified by fresh read-back. Confirms
this write path lands despite the stalled primary channel (TK-11397) — with
a 20-90s processing lag, not the "creates dead since 08-26" behaviour feared
in the gated memo. Deliberately did not touch Batik/Glambeads (their own
offer links pin the sample variant, so the correct fix direction is
ambiguous between lowering the price to match vs. fixing the link — held for
Steve rather than guessed).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E2whC5qTE7dEhVmqFe8pND
231b750 · 2026-09-12 · TK-11449: measure survivor Google-offer coverage — bounds the orphan-unpublish carve-out to 1 product
Closes the hole in the orphan-unpublish recommendation: unpublishing an orphan whose
survivor has no offer removes that product from Google permanently, since creates are
dead (maxCreationDate 2026-08-26, TK-11397).

Complete enumeration of 62,362 offers (refuses to report on an incomplete walk).
70 survivors probed: 66 HAVE an offer, 4 do NOT, 0 NOT_MEASURED. 3 of the 4 are the
reverted pairs with no orphan to unpublish, leaving exactly one genuine carve-out:
pano-stripe-peck-drive-plum.

Read-only. No Shopify, Merchant Center, dw_unified or feed writes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QzRJQxiT3DKZRRfzWsRTVM
33da7f5 · 2026-09-11 · TK-11522/11523: full vendor-edge sweep — 126 testable, 27 broken, 0 proxy-fixable
Swept every vendor_registry entry with a login_url/website_url (126 of 493)
one request each, then re-ran all 27 failures through a rotating residential
proxy. Zero changed outcome, which settles the proxy question empirically.

The 27 re-verified with independent DNS lookups rather than trusted from a
single HTTP result, because a 000 on a box carrying ~2000 processes can be a
local timeout. They split into four distinct defects:
  7 DEAD domains (NXDOMAIN)  - bespoke, british_walls, colefax_fowler,
                               cowtan_tout, hollywood, leed_walls, surface_stick
  4 TLS/cert failures        - glass_bead, innovations, william_morris, zoffany
  2 connection failures      - armani_casa (firewalled), china_seas (port closed)
  5 stale 404/406 URLs       - anna_french, designtex, folia, w1838, hygge
  9 genuine CF/fingerprint   - fabricut, wallquest, spoonflower, romo, and others

Also surfaced that vendor-edge-health-canary watches 37 of these 126 edges and
reports PASS, so the morning panel reads healthy while 21% of testable vendor
edges are broken outside its list.

Read-only throughout; no registry row and no canary was modified.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
01d3acd · 2026-09-11 · TK-11448: per-bucket remediation + why-the-62-pending-crawl-are-stuck (evidence-backed)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DPnHjsFLTsVZton5xPecp9
ffe6554 · 2026-09-11 · 5x: TK-11448 verify-and-fix report — 4 sweeps, 1 real defect (in the probe), 2 consecutive clean
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JwXCqw4PdXfTY729wX8BFw
6308654 · 2026-09-11 · 5x sweep 3: widen storefront check 8 -> all 33, add fault-injection self-test
A check that only ever runs on healthy data proves nothing about its own ability
to fail. S2b now feeds the probe a known-LIVE product and a known-dead handle in
the same sweep and requires them to come back different, so a probe that has
silently stopped discriminating is caught rather than printing green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JwXCqw4PdXfTY729wX8BFw
c0bbc10 · 2026-09-11 · 5x sweep 1: fix the storefront probe — redirect:follow measured the homepage, not the product
An archived Shopify product URL 302s to the HOMEPAGE, which returns 200, so the
sweep's redirect:'follow' probe reported 'still buyable' for all 8 archived
products it checked. The archive was correct; the instrument was wrong.

Classify at the product URL itself: 3xx or 404 or a 404-body = gone, 200 with an
add-to-cart form = buyable, anything else = NOT_MEASURED. Added a control that
requires a still-ACTIVE product to come back buyable, so a probe that detects
nothing cannot pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JwXCqw4PdXfTY729wX8BFw
e42e577 · 2026-09-11 · TK-11448: archive 33 vendor-discontinued products (Shopify + FileMaker), verified
Steve approved in-session: 'if not on mfr website. archive it', scope
Shopify + FileMaker discontinued.

Executed, canary-first, with independent verification at every step:
 - Shopify: 33 ACTIVE -> ARCHIVED. Canary 3 verified by re-read before the
   remaining 30. Exhaustive re-read: 33/33 ARCHIVED. 33 undo rows ledgered.
 - FileMaker: 105 WALLPAPER rows stamped Date Discontinued=09/11/2026 on rows
   where it was blank; rows already dated are skipped, never overwritten.
   Live canary verified against an UNWRITTEN control that stayed blank, proving
   the write was targeted. Exhaustive re-read: 105/105 dated, 0 blank,
   0 unreadable. 105 undo rows ledgered.
 - WRITE-2 (close open sample order) was a measured no-op: 0 open orders.

Caught in my own code first: the FM survey defaulted an unreadable client
response to [] and reported 0 rows for all 33 — a false zero indistinguishable
from 'nothing to do'. Replaced with a hard shape assertion that throws.
The client returns {records,dataInfo}, not {response:{data}}.

Fix plan reduced 19 -> 17: Sandberg Oscar grey and Kimono green are gone from
the vendor too and were archived instead of repaired.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JwXCqw4PdXfTY729wX8BFw
df15890 · 2026-09-11 · TK-11448: prove vendor absence 3 ways, build archive plan (33) + dry-run-default archive executor
Steve: 'if not on mfr website. archive it'. Absence is PROVEN, not guessed —
the first probe used two hand-guessed URLs against a URL shape the vendor does
not use, and 404'd for the wrong reason.

Three independent tests, any single LIVE signal removes a product, UNKNOWN is
never archived: (1) absent from the vendor's own sitemap, (2) every plausible
product URL 404s on a live fetch, (3) no article asset on the vendor CDN.
The sitemap matcher ships a positive control — the 11 products known live at
the vendor must come back FOUND, and did, 11/11.

Two corrections the checks caught before anything fired: 4 of 5 sitemap
'FOUND' results were false matches on generic words (Garden, Structure,
Sample, Ribbon) and are absent; and 2 products previously proposed for a
FIX (Sandberg Oscar grey, Kimono green) are themselves gone from the vendor,
so they move to the archive set.

Result: 33 archive (30 Rebel Walls + 3 Sandberg), 17 fix, 1 live-but-unsourced.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JwXCqw4PdXfTY729wX8BFw
8246589 · 2026-09-11 · TK-11448: remediation plan for 19 placeholder-featured products + dry-run-default executor
tk11448-build-plan.mjs builds the per-product before/after plan (8 Sandberg
reorder-only, 11 Rebel Walls add-real-image-and-feature) with identity
cross-checked against staging pattern/color and the product's own asset prefix.

tk11448-apply-plan.mjs is DRY-RUN BY DEFAULT: --apply is required, --canary N
supported, and every row writes its undo to data/tk11448-apply-ledger.jsonl
before the write. Gated to Steve; not fired.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JwXCqw4PdXfTY729wX8BFw
5931b12 · 2026-09-11 · TK-11449: post-dedup read-only measurement of the tobacco-16 and price_mismatch residuals
16/16 tobacco offers still exist in MC and still carry tobacco_policy_violation;
none moved since 2026-08-22 so today's dedup has not propagated. 8 of 16 now
ARCHIVED on Shopify. 60 of the 67 archived products still carry a live Google
offer and 48 are approved and serving. price_mismatch count stable at 10 but
membership churned (Batik/Glambeads out, Maizan/Sufera in).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QzRJQxiT3DKZRRfzWsRTVM
72d7a55 · 2026-09-11 · TK-11448: verify GMC image buckets at full population; find the gray broken-image placeholder on 51 live products
Read-only. Four measurements, each carrying population beside observed and
failing closed rather than passing when unmeasured:

1. tk11448-screenshot-shopify-verify.mjs — resolves the exact expression the
   Google channel sends (variant.image ?? product.featuredImage) for all 631
   screenshot-primary offers. 631/631 measured, 0 still carry the screenshot,
   so the TK-11397 resync does fix them; 136 would land at <500px.
   Comparator negative-tested against an injected still-screenshot.

2. tk11448-131-reverify.mjs — re-measures the 79-offer/131-occurrence bucket
   against LIVE Merchant Center with the variant-aware expression. Only 9 are
   fixed by the resync; 63 of 79 survive it.

3. tk11448-placeholder-sweep.mjs — bulk-dumps all 177,772 products, filters to
   800x600 featured images and md5s every candidate: 51 ACTIVE products carry
   a byte-identical gray broken-image placeholder as their featured image.
   Distinct per-product filenames, so URL- and filename-based scans miss it.

4. tk11448-placeholder-alternatives.mjs / -resolve-real-images.mjs — splits the
   51 into 8 reorder-only, 11 with a verified >=500px replacement, 32 needing a
   fresh Rebel Walls scrape (R5xxxx series absent from every staging table).

No Shopify or Merchant Center writes. Remediation drafted to pending-approval.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JwXCqw4PdXfTY729wX8BFw
6718c59 · 2026-09-11 · TK-11449: add substring-vs-token negative test + NOT_MEASURED bucket + adjacent-surface caveats
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QzRJQxiT3DKZRRfzWsRTVM
4f6033c · 2026-09-11 · TK-11449: read-only sweep of all 709 Shopify collections for title-substring smart rules + empirical title-edit impact simulation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QzRJQxiT3DKZRRfzWsRTVM
add0706 · 2026-09-11 · TK-11449: dedup 67 Fentucci stripe pairs (DTD verdict A, Steve-approved)
Per pair: rename the 2024 original to <clean>-legacy-2024, transfer the freed
clean handle to the 2025 survivor, archive the original, 301 the survivor's old
-N handle. Titles deliberately untouched - the 12" -> 12-inch edit would empty
the live smart collection beverly-hills-stripe-wallpaper (141 products, matched
solely on TITLE CONTAINS "pipa 12"" / "pico 6"" / "piza 48"" / "pano 24"").

Verified independently per pair rather than from any run-log: 67/67 with the
clean indexed handle ACTIVE holding the HIGHER-variant record, the legacy
ARCHIVED, and the old -N handle vacated. pipa-stripe-classic-green now serves a
40-variant product where it served a 2-variant $195 roll.

SCOPE NARROWED FROM 115 TO 70 BEFORE FIRING, then to 67. Only 70 groups were
the clean pairs the panel ruled on; 45 are 3-to-5-way collisions (one with
eighteen members, one with no clean-handle member at all) and 157 of their 175
products were created in the last four days by a still-running importer -
filed as TK-11483, untouched.

The halt gate fired three times and was correct each time: it refused to
re-process completed pairs (fixed with an idempotent skip matching only the
exact finished state), it stopped on a Shopify 502 returning HTML instead of
JSON (fixed in transport, gate untouched), and it refused to walk over the
half-applied pair that 502 left behind (fixed by resuming from that one known
intermediate, while any other drift still halts).

3 pairs REVERTED after the fact: venezia/vercelli/viterbo grasscloth were
created 09-09 and 09-10 by the TK-11483 importer and passed the clean-pair
filter by coincidence. The verdict's rationale did not apply - both twins are
2-variant, and their handles do not match their titles (venezia- holds 'Modena
Gold'). Reverted from the restore map and read back to the pre-run state so the
incident population stays whole.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1cda2e5 · 2026-09-11 · TK-10993: 9-link rename repair APPLIED and verified live (9/9, zero collateral)
Repaired the 9 GMC landing links that a Shopify private-label rename wave
(Momentum/Hollywood California-city scheme) had left hard-404 after Steve's
2026-09-05 approved corrections.

Sequence: public-landings 9/9 -> preflight READY 9/9 -> canary 3 -> 800s
observation (canary_gate armed) -> rest 6 (+3 skipped ALREADY_CORRECT, no
double-write) -> final verify 9/9 correct, 0 errors, 0 collateral.

Independent confirmation from the ticket's own acceptance oracle, which was RED:
tk10993-remediation-audit f3 cohort 13 PASS/9 FAIL -> 22/22 PASS.

MEASURED BONUS: a productInputs PATCH resets googleExpirationDate to +30d.
Pre-write the 9 were staggered 2026-10-05..10-09; post-write all read 2026-10-11,
split by write batch (canaries 16:18:32-33, rest 16:32:56-59). That proves direct
Merchant API writes refresh offer lifetime - an emergency lever for a prioritized
subset during the channel stall, though a treadmill, not a fix.

Rollback proven BEFORE the remaining 6 were written: all 3 canary rollbacks
restore the exact pre-write value from immutable snapshots.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017uZskkfeTZhLbtpqcCVm8d
a32a20b · 2026-09-11 · TK-11449: 115 true Fentucci duplicate pairs, and the trap in the obvious signal
Steve chose dedup-first over a title edit. Enumerating it found 115 true
duplicate sets (315 ACTIVE products), each a 2024-05 original with a bare title
and inventory 4,052 alongside a 2025-09-02 copy with the
'Wallcovering | DW Bespoke Studios' suffix and inventory 79k-81k. Both twins are
ACTIVE on BOTH the Online Store and Google, so every pair competes with itself.

The trap: the obvious signal is the -1 handle suffix, and it is WRONG. Four
groups are three DIFFERENT products sharing a base handle - pico-stripe-golden
is Pico 6", -1 is Pipa 12", -2 is Pano 24". Deduping by handle would have
destroyed whole product lines. The reliable signal is a TITLE collision after
stripping the category suffix, which is what the 115 is built on.

One action covers two problems: 8 of the 9 tobacco-flagged Pipa products are the
2024 bare-titled originals, so archiving those clears the policy flags as a side
effect - without the duplicate-titled-offer risk my original rename proposal
carried.

Gated memo drafted; archiving 115 live products is customer-facing and
destructive, and the order-history tiebreaker is deliberately unresolved rather
than assumed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yzBkdi8E67XZz1TJNmvca
701a7af · 2026-09-11 · TK-11450: relabel 76 CA offers USD->CAD (Steve-approved option C), amounts untouched
Executed after correcting my own memo: this was never a pricing defect, only a
labelling one. 77 of 81 feed amounts matched the product's Shopify CA (CAD)
price and zero matched its USD base, so the amounts were already Canadian and
only currencyCode was wrong.

The tool never changes an amount - only currencyCode - and carries the lesson
from the TK-11233 delete that hit 59 live offers off a 68-minute-stale cohort:
every offer is RE-VERIFIED AT WRITE TIME immediately before its own write, and
fails closed on any read error.

Result: 76 relabelled, 0 failed. The guard refused 5 - three on amount drift,
one on a 404, and one showing 134 against a Shopify CA price of 408, which
without the guard would have gone live at a third of its real price.

Verified independently rather than from the run-log: re-read all 76 from
Merchant Center after a propagation wait - 76/76 CAD, 0 still USD, 0 errors.
One amount moved, chased rather than waved through: offer 40695358390323 was
submitted at 212 and reads 211, which is exactly Shopify's current CA price, so
the end state is more correct than the input - 212 was the stale feed value my
own 2% tolerance allowed. Probable cause is a supplemental datasource override
outranking the primary write; unproven, because the Merchant API exposes no way
to enumerate a supplemental's contents.

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

File tree

9585 files tracked. Click any to browse the source at HEAD.

Other build journals

← Gmc 425 Supplemental Feed  ·  all 4 projects  ·  Gmc Viewer →

Export

commits.csv · feed.atom · project.json · commits.json

rendered in 47ms