{"slug":"dw-kravet-hires","total":46,"limit":100,"offset":0,"since":null,"commits":[{"hash":"cfd73e8","date":"2026-09-24 23:40:42 -0700","author":"Steve Abrams","subject":"TK-12136: drop 8 fake-hires P2 rows (native 400px via pad=true); P2-final map = 3 real + 32 P2b","body":"Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FdQNVBL3doxmMXmnn6kSAZ"},{"hash":"700132b","date":"2026-09-24 23:26:46 -0700","author":"Steve Abrams","subject":"TK-12136 P2b: deeper re-resolve of 128 kravet slug-misses","body":"Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FdQNVBL3doxmMXmnn6kSAZ"},{"hash":"c181cc4","date":"2026-09-24 23:08:02 -0700","author":"Steve Abrams","subject":"TK-12136 P2 remainder map: 11 unapplied rows, live-verified still 400px","body":"Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FdQNVBL3doxmMXmnn6kSAZ"},{"hash":"cfc314a","date":"2026-09-24 12:50:14 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-24T12:49:23 (1 data files) — data/tk12097/dupe-cleanup-ledger.jsonl","body":""},{"hash":"64d958a","date":"2026-09-24 12:19:08 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-24T12:18:37 (1 data files) — data/tk12097/dupe-cleanup-ledger.jsonl","body":""},{"hash":"68e7ad7","date":"2026-09-24 11:17:57 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-24T11:17:31 (3 data files) — data/tk12097/batchD-apply-ledger.jsonl data/tk12097/batchDplus-apply-ledger.jsonl data/tk12097/batchP2-apply-ledger.jsonl","body":""},{"hash":"1278615","date":"2026-09-24 11:00:57 -0700","author":"Steve Abrams","subject":"Add dupe-media cleanup for TK-12097 concurrent Batch-A run","body":"Two apply runs processed Batch A at once; each uploaded its own copy of\nthe same hi-res image, leaving 249 products with a redundant duplicate.\n\nThe tool picks which copy to remove from a live per-product read rather\nthan from ledger order, refuses when the featured media is not one of the\ntwo uploaded copies, and refuses when the low-res rollback anchor is\nmissing. Dry-run by default; deletions are ledgered with a re-upload undo.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KXUyzc9vybUz39rhnNJdwY"},{"hash":"4636e7b","date":"2026-09-24 10:47:24 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-24T10:46:49 (3 data files) — data/tk12097/batchA-apply-ledger.jsonl data/tk12097/batchD-apply-ledger.jsonl data/tk12097/tk12097-batchA-duplicates.json","body":""},{"hash":"5489959","date":"2026-09-24 10:43:34 -0700","author":"Steve Abrams","subject":"Add live Shopify verifier for TK-12097 hi-res swap ledgers","body":"Re-probes a random sample of ledger rows against the live store and\nconfirms the product's current featured media is the ledger's new\nmedia and that it is larger than the retained low-res anchor.\n\nDistinguishes NOT-MEASURED (API unreachable) from PASS so a dead\ntoken cannot read as a clean run.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KXUyzc9vybUz39rhnNJdwY"},{"hash":"dfdb8f9","date":"2026-09-24 10:16:39 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-24T10:15:55 (2 data files) — data/tk12097/batchA-apply-ledger.jsonl data/tk12097/batchC-apply-ledger.jsonl","body":""},{"hash":"c176a22","date":"2026-09-24 09:59:47 -0700","author":"Steve Abrams","subject":"TK-12097 P2+P3: 20 slug-reresolve recoveries + Hollywood momentum re-scrape spec (TK-12134)","body":"P2: 150 kravet.com slug-misses -> 20 recovered (naive_slug never converted spaces; fixed slug\nresolves name-alias redirects), all 2048px colorway-safe .auto; 128 genuinely off-kravet, 2\nwrong-colorway dropped. P3: 434 Hollywood no-source = 100% absent from stale momentum snapshot\n(Meilisearch 20k cap); ~405 recoverable via refresh.mjs; spec + ticket TK-12134.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HAz5GCSg6DiHMufykgedet"},{"hash":"0ac5d10","date":"2026-09-24 09:44:43 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-24T09:44:11 (4 data files) — data/tk12097/P3-hollywood-momentum-rescrape-SPEC.md data/tk12097/batchC-apply-ledger.jsonl data/tk12097/canary-apply-ledger.jsonl data/tk12097/canary-map.json","body":""},{"hash":"011ebf6","date":"2026-09-24 09:23:38 -0700","author":"Steve Abrams","subject":"TK-12097: no-source re-scrape lane (763 A/C/D) characterized + 44 immediate recoveries","body":"Buckets: 44 recoverable_now (.auto hero, phase-2 .jpg-forcing bug — 30/30 sampled confirmed >=800px,\nbuilt to batchD-plus map, colorway-verified, dry-run clean); 434 Hollywood no-momentum-mapping\n(needs live re-scrape); 150 kravet.com slug-miss (re-resolve via product_url/search); 129 vendor-capped\n<=400px (recheck quarterly); 6 placeholder/discontinued. 179 discontinued patterns flagged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HAz5GCSg6DiHMufykgedet"},{"hash":"1a1afae","date":"2026-09-24 08:06:08 -0700","author":"Steve Abrams","subject":"TK-12090 Fix 2: apply-hires.mjs — orphan-media ledgering + throttle backoff","body":"2a — a throw AFTER productCreateMedia succeeded (poll/reorder/ledger-write)\nleft the new media live on the product with no ledger row, so --rollback\n(ledger-driven) was blind to it. newMediaId is now tracked outside the\ntry block; the catch path writes an `orphaned: true` row (old_media_id,\norphaned_media_id, the error) to both the per-run ledger and the fleet\nexec-ledger instead of attempting a best-effort delete that could itself\nthrow on the same fault that caused the orphan. --rollback now splits\ncompleted swaps (reorder back to old_media_id) from orphan rows (delete\nthe orphan media outright, since nothing was ever displaced) so an\norphan is never mistaken for an applied swap.\n\n2b — shopify() threw immediately on THROTTLED/429 with no retry, and this\nscript shares one SHOPIFY_ADMIN_TOKEN rate bucket with T4\n(shopify-room-mockup.py). Added bounded exponential backoff + jitter\n(--max-retries, default 6), honoring Shopify's own throttleStatus hint\nor a Retry-After header when present, with every backoff logged so a\nthrottled run is visibly slow rather than silently stalled. Concurrency\nis unchanged (batches stay sequential).\n\nNegative tests (scripted global.fetch mock, zero live Shopify calls):\npost-create throw -> orphan row + rollback dry-run/live correctly\ndelete-not-reorder it; THROTTLED -> retry+recover with an honored wait;\nalways-THROTTLED -> bounded retries (exhausts, reports failed, never\nhangs or falsely applies). All 6 checks pass; real fleet ledgers\n(project apply-ledger.jsonl + ~/.claude/.../executed-reversible/ledger.jsonl)\nconfirmed untouched by the test run.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KXUyzc9vybUz39rhnNJdwY"},{"hash":"7280da7","date":"2026-09-24 07:06:55 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-24T07:06:26 (1 data files) — scripts/__pycache__/build-batchC-map.cpython-314.pyc","body":""},{"hash":"fe1692c","date":"2026-09-24 07:02:18 -0700","author":"Steve Abrams","subject":"TK-12097 Batch A: verify 99 tier-2 cross-ref rows vs kravet.com (99/99 colorway-correct) -> fold 98 (>=800) in; Batch A now 550 rows","body":"Every tier-2 row (legacy B&F/Lee Jofa cross-ref codes, e.g. 8013149<->33127) resolved to the\nrequested product's own kravet.com page, isMain hero matches recorded URL, color present.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HAz5GCSg6DiHMufykgedet"},{"hash":"dae45e5","date":"2026-09-24 07:00:43 -0700","author":"Steve Abrams","subject":"TK-12097 Batch D: Gaston Y Daniela dry-run map (436 colorway-safe @ >=1200px)","body":"520 low-res(<=500px); staging (165 rows) contributed 0 (doesn't cover active GDT/LCT fabrics);\n436 via phase-2 kravet.com Brandfolder hero, all filename-verified colorway-safe, all >=1200px;\n84 no-source. Dry-run 0 writes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HAz5GCSg6DiHMufykgedet"},{"hash":"1a8a6f5","date":"2026-09-24 06:53:30 -0700","author":"Steve Abrams","subject":"TK-12097 Batch B+C: dry-run maps (measured, colorway-safe)","body":"Batch B Jeffrey Stevens: 851 low-res(<=500px) but jeffrey_stevens_catalog is a MIRROR of the\nlive store (memo 600-1800px yorkwall claim FALSE) -> only 1 genuine upgrade (ext Schumacher S3\n1200px). Batch C Hollywood: 741 low-res, 307 colorway-safe upgrades via momentum_colorways\nCloudinary TRUE-NATIVE (c_scale,w_2000 upscales=fake; used transform-removed original); dw_sku\njoin dead (fabricated DWHD-*), used unique mfr-code join. Both dry-run 0 writes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HAz5GCSg6DiHMufykgedet"},{"hash":"1cf9573","date":"2026-09-23 18:08:32 -0700","author":"Steve Abrams","subject":"TK-12097 Batch A: build colorway-safe hi-res swap map (452 rows @ >=800px) + dry-run clean","body":"814 live-measured low-res(<=400px) Kravet-family ACTIVE products; hi-res resolved from vendor\n_catalog Brandfolder (colorway-exact) + kravet.com Brandfolder hero (phase-2, filename-verified\ncolorway). 470 colorway-safe upgrades, 452 at >=800px floor. 99 held (color matches, pattern\nbase differs -> unverified). 245 no bigger vendor asset. Dry-run: 452 rows, 3 batches, 0 writes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HAz5GCSg6DiHMufykgedet"},{"hash":"970e304","date":"2026-09-23 17:59:24 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-23T17:59:00 (4 data files) — data/tk12097/batchA-all-active.tsv data/tk12097/batchA-candidates.tsv data/tk12097/batchA-measured.json data/tk12097/batchA-swap-map.json","body":""},{"hash":"8ab5855","date":"2026-09-23 17:47:51 -0700","author":"Steve Abrams","subject":"TK-12090: parameterize low-res width threshold (--max-width, default 400) to fix Batch B false-green skip risk","body":"Batch B (Jeffrey Stevens ~665 products) targets <500px low-res, but the hardcoded 400px threshold at L171 was skipping ALL of them as 'already moved'. Added --max-width parameter (defaults to 400 for Batch A Kravet compatibility) so each batch can specify its own threshold: Batch A=400, Batch B=500, Batch C=640, Batch D=650 (per memo targets). Also fixed the skip message to show the actual limit being applied, not the hardcoded 400."},{"hash":"9caaaac","date":"2026-09-17 18:05:07 -0700","author":"Steve Abrams","subject":"TK-11658 cycle-4 ground truth (2026-09-17/18): Phase-1 remaining-map stale — 42 of 50 rows are clean+applyable+still-low live, sources re-verified 42/42 HTTP 200; preflight re-run 621/621 (579 clean applyable, 42 flagged); live-featured-state refreshed (56 still <1200 across phase1 population, 42 in remaining-map + 14 flagged)","body":""},{"hash":"1ee7e73","date":"2026-09-15 17:53:34 -0700","author":"Steve Abrams","subject":"apply-hires: rollback self-scopes by --ticket (shared-ledger over-revert fix)","body":"data/apply-ledger.jsonl accumulates every phase's swaps (TK-11658 1546 +\nTK-11740 84 + TK-11742 28 = 1658), so the old undo reverted ALL of them.\nrollback() now reverses only TICKET's entries by default; --all-tickets restores\nthe whole-ledger behavior explicitly; baked-in undo_cmd now carries --ticket so\neach run's recorded undo self-scopes. Guards exit 2 on an unknown ticket.\nVerified dry-run: TK-11740->84, TK-11742->28, --all-tickets->1658, all of 1658.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HgXb7b5SZbb9MNZwNZW94q"},{"hash":"0c1deb7","date":"2026-09-15 17:31:54 -0700","author":"Steve Abrams","subject":"TK-11740: post-apply review — scoped rollback ledger (84) + live verify PASS 84/84 hi-res held","body":"Scoped rollback data/rollback-tk11740.jsonl reverses exactly TK-11740's 84\n(vs baked-in undo_cmd targeting the shared 1658-entry apply-ledger.jsonl).\nverify-tk11740.mjs is read-only; confirms 84/84 featured==new hi-res media live.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HgXb7b5SZbb9MNZwNZW94q"},{"hash":"220c207","date":"2026-09-15 13:42:06 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-15T13:40:09 (1 data files) — data/apply-ledger.jsonl","body":""},{"hash":"01b8a09","date":"2026-09-15 12:35:13 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-15T12:33:48 (1 data files) — data/apply-ledger.jsonl","body":""},{"hash":"73f02e5","date":"2026-09-15 12:02:44 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-15T12:00:25 (1 data files) — data/apply-ledger.jsonl","body":""},{"hash":"8c73060","date":"2026-09-15 11:29:36 -0700","author":"Steve Abrams","subject":"TK-11740: apply-ledger — 84/84 fixable oversized-source variants swapped to hi-res","body":"Steve-approved live apply complete over 3 runs (resize param iterated: fit=bound -> +quality=90\nfor JPEG -> bound=3000 for PNG). Final: 84/84 fixable = hi-res, 0 failed, old 400px kept per\nproduct as rollback anchor. 28 broken-source variants tracked separately in TK-11742.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01R9NqWUYGborGRqS4NMyA13"},{"hash":"711e108","date":"2026-09-15 11:29:04 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-15T11:25:48 (1 data files) — data/apply-ledger.jsonl","body":""},{"hash":"da2c50b","date":"2026-09-14 21:16:26 -0700","author":"Steve Abrams","subject":"TK-11742 cycle4 PartA: 14 net-new placeholders (dedup vs recovered 28) all genuinely-absent, 0 recovered — covered by existing TK-11719 DRAFT-flip memo","body":""},{"hash":"087fb5e","date":"2026-09-14 21:06:21 -0700","author":"Steve Abrams","subject":"TK-11658 cycle3: pre-flight Phase-1 621 swappable rows + measure live state","body":"- preflight-phase1.py: MEASURE all 621 (ranged GET+PIL), cap oversized w/ TK-11740\n  per-format Brandfolder param, RE-MEASURE capped. 495 pass as-is, 84 pass-after-cap,\n  42 flagged (14 kravet placeholder-thumb, 1 dead 404, 27 unprocessable 422 PNGs).\n- live-featured-check.mjs (read-only): ground truth = 529/621 ALREADY hi-res live.\n- normalized-map.json (579 clean, idempotent-safe) + remaining-map.json (50 real delta)\n  + clean/flagged split. Pre-flight only; no --live."},{"hash":"e94d49f","date":"2026-09-14 21:03:16 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-14T21:02:03 (4 data files) — data/kravet-hires-phase1-normalized-map.json data/phase1-clean-flagged-split.json data/phase1-preflight-measured.json preflight-phase1.stderr","body":""},{"hash":"d436a32","date":"2026-09-14 20:55:36 -0700","author":"Steve Abrams","subject":"TK-11658 cycle2: pre-flight MEASURE 778 phase-2 hi-res URLs vs Shopify 5000px/20MB ceilings — 778/778 measured, all PASS (max 2048px/8.62MB), 0 need cap fix","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"1b214f2","date":"2026-09-14 20:46:07 -0700","author":"Steve Abrams","subject":"TK-11658: verify 247 'absent' -> 246 valid-lowres (NO draft needed) + 1 placeholder (already in TK-11719); evidence TSV + optional reversible Low-Res-Image tag asset","body":""},{"hash":"80f62c8","date":"2026-09-14 16:48:52 -0700","author":"Steve Abrams","subject":"TK-11740: PNG dim-cap (bound=3000) + longer processing poll — fixes final 8","body":"Second live run: 76/84 landed; 8 self-healed. Root causes: (a) 6 .CAC PNG sources stay ~20MB\neven resized because Brandfolder ignores &quality/&format on PNG (lossless) -> cap PNG dims to\n3000px (~11-15MB); (b) 2 valid JPEGs false-healed on the 45s processing poll -> bump poll to 75s.\nJPEG sources keep quality=90@4472. Already-live products race-skip on re-run.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01R9NqWUYGborGRqS4NMyA13"},{"hash":"ce21d47","date":"2026-09-14 16:48:19 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-14T16:46:18 (1 data files) — data/apply-ledger.jsonl","body":""},{"hash":"0e5f574","date":"2026-09-14 16:25:49 -0700","author":"Steve Abrams","subject":"TK-11740: add &quality=90 to resize param — fixes 53/84 that failed Shopify 20MB byte limit","body":"First live run: fit=bound kept dims at 4472px (<=20MP) but the JPEG came back ~24MB, over\nShopify's 20MB BYTE limit -> productCreateMedia processing FAILED for 53/84 (all self-healed\nto old 400px, no breakage). &quality=90 compresses to ~6MB worst-case, full 4472px retained.\nThe 31 that already succeeded are race-skipped on re-run.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01R9NqWUYGborGRqS4NMyA13"},{"hash":"abecdde","date":"2026-09-14 16:19:13 -0700","author":"Steve Abrams","subject":"TK-11658/TK-11742: human-readable absent SKU list for DRAFT-flip follow-up","body":""},{"hash":"11e8962","date":"2026-09-14 16:17:47 -0700","author":"Steve Abrams","subject":"TK-11658 Phase-2 + TK-11742: recover Kravet-family hi-res via vendor gallery re-scrape","body":"- phase2-recover.py: feed-first brandfolder gallery-hero extractor ($0, 12-way parallel, resumable)\n- 1,621 targets processed: 806 recovered(>1200px) / 568 below-threshold(401-1200px) / 247 absent\n- TK-11742: 28/28 broken-source residuals recovered (gallery hero != broken direct URL)\n- TK-11658 Phase-2: 778 recovered + 568 below-1200 upgrades + 247 genuinely-absent\n- staging maps built (apply-hires.mjs-compatible, rollback_url per row): phase2 / phase2b-below1200 / tk11742\n- data/phase2-absent.json: 247 for ACTIVE->DRAFT/Needs-Image follow-up\n- both maps dry-run clean (0 writes, $0)"},{"hash":"5f30df2","date":"2026-09-14 16:15:27 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-14T16:13:45 (4 data files) — data/apply-ledger.jsonl data/phase2-targets.json data/recover-results-combined.json data/recover-targets-combined.json","body":""},{"hash":"f64f457","date":"2026-09-14 15:03:23 -0700","author":"Steve Abrams","subject":"TK-11740: apply-hires.mjs — additive --ticket override (default TK-11658)","body":"Lets subset re-runs tag their ledger rows correctly (e.g. --ticket TK-11740).\nNo behavior change unless passed.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01R9NqWUYGborGRqS4NMyA13"},{"hash":"ecf0161","date":"2026-09-14 15:02:02 -0700","author":"Steve Abrams","subject":"TK-11740: oversized-source residual subset — 84 resize-fixable + 28 broken-source split","body":"Brandfolder CDN supports aspect-preserving resize (?width=4472&height=4472&fit=bound,\nverified <=4472px/<=20MP, under Shopify's ~20MP limit; parent's accepted swaps topped 4480px).\n84 of 112 residuals resize cleanly (source 200); 28 have broken sources (1x404 dead jpg,\n27x422 unprocessable PNGs) that resizing cannot fix -> need re-scrape (data/hires-broken-source.txt).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01R9NqWUYGborGRqS4NMyA13"},{"hash":"5c55057","date":"2026-09-14 14:37:56 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-14T14:36:24 (1 data files) — data/apply-ledger.jsonl","body":""},{"hash":"7db4573","date":"2026-09-14 14:05:03 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-14T14:02:07 (1 data files) — data/apply-ledger.jsonl","body":""},{"hash":"05813b7","date":"2026-09-14 08:37:51 -0700","author":"Steve","subject":"TK-11658: apply-hires.mjs executor (dry-run default, ledger, rollback) — dry-run proves 621-product Phase-1 plan, zero writes","body":""},{"hash":"d057cdc","date":"2026-09-14 00:42:29 -0700","author":"Steve Abrams","subject":"TK-11658: Kravet-family hi-res image audit + reversible swap map (2214 <=400px verified)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01RePUgpi4TWMrHo68U8ckpT\n"}]}