CelebritySignatures

repo: ~/Projects/CelebritySignatures · 229 commits · 0 in last 24h, 0 in last 7d ·

Search the build

229 commits indexed

  1. fbffb50 2026-09-13 gitignore: exclude campaign image-gen candidates + QA artifacts
  2. 8272a62 2026-09-13 campaign: lead the homepage hero with the full seated Signature Edit
  3. d72fd54 2026-09-13 wear: fix "See on garment" not hiding the editorial worn shot + modernize gallery E2E
  4. a310a07 2026-09-09 wear: enable Dad Cap (29) + Trucker Cap (33) for sale, cost/placement verified (TK-10286, Steve-approved)
  5. 52b0f48 2026-09-09 printify-cost-check: add dad-cap + trucker-cap candidates (cost/placement verified)
  6. 1d53030 2026-09-09 wear: raise Bucket Hat 32 to 38 to restore margin floor (TK-10286, Steve-approved)
  7. 15e7499 2026-09-09 wear: add Signature Edit lookbook promo banner (discoverability)
  8. 7bce96c 2026-09-09 signature-edit: expand The Signature Edit lookbook from 10 → 53 icons
  9. 8322ca0 2026-09-09 wear: fix stale ink-color fallback in reconcile-wear-orders.mjs + its test
  10. 71f5347 2026-09-09 wear: surface the Signature Edit — ✦ badge + 'Signature Edit first' sort
  11. cb3ba6f 2026-09-09 wear: map Michelangelo Buonarroti → campaign-michelangelo.jpg (same-person dup record)
  12. ced4cca 2026-09-09 wear: map worn-shot by EXACT signer name, not surname — kills wrong-celebrity collisions
  13. a0253a8 2026-09-09 wear: 43 worn editorial campaign shots for top-signer roster (TK-10286)
  14. 22b0eba 2026-09-09 wear: accent-fold worn-shot slug candidates (Velázquez→velazquez, Molière→moliere)
  15. d8381ce 2026-09-09 wear: auto-detect campaign-<slug>.jpg for the 'worn' shot instead of a hardcoded map
  16. 523cb04 2026-09-09 wear: 'See it worn' — feature each celebrity's seated editorial shot on their product page
  17. ba96456 2026-09-09 printify-cost-check: support bucket-hat + crew-socks + --yes non-interactive flag
  18. 7489d97 2026-09-09 signatures: serve the full-resolution original (vector SVG / native raster), not a downsampled thumb
  19. 6adf104 2026-09-09 wear: raise crew-socks price $22 → $28 to clear cost/markup floor (TK-10286)
  20. 18cca45 2026-09-09 signatures: show TRUE source colors, crisp — drop the invented per-signer recoloring
  21. 68dd99d 2026-09-09 wear: full Signature Edit campaign hero — Lincoln seated in hat+tee+socks
  22. 47a6363 2026-09-09 wear: make Bucket Hat ($32) + Crew Socks ($22) sellable — Lincoln campaign look (TK-10286)
  23. ec820c7 2026-09-09 5x sweep 1: record M3 false-negative (ink control is modal-gated; verified working)
  24. 08f3529 2026-09-09 wear: buyer-adjustable signature ink + Node-ported color for the printed art
  25. b5ebc16 2026-09-09 signature-size: make the mobile grid slider actually resize signatures
  26. 5acdc48 2026-09-09 wear: on-shirt signature uses the signer's color on light cloth, white on dark
  27. a272fad 2026-09-09 wear: Lincoln-in-exact-tee campaign hero (kontext-fit, real product preserved)
  28. 3a772dc 2026-09-09 signatures: render each signer in a distinct, WCAG-legible color on clean white
  29. 6a759ce 2026-09-09 game/murals/wear: render cleaned colored-ink signatures via shared preview
  30. 5499131 2026-09-09 signatures: permanently exclude Q352 (brand safety) from every surface
  31. abc8f51 2026-09-09 signature-viewer: fix ink-collision crash + add user-adjustable signature size
  32. 6140aaa 2026-09-09 auto-data-snapshot: 2026-09-09T13:56:45 (1 data files) — verification/signature-viewer-decision.md
  33. d2c9573 2026-09-09 signature-edit: click any icon opens a lightbox of the full in-outfit look
  34. 936d27e 2026-09-09 signature-edit: regenerate the 9 figures with distinct poses + backdrops
  35. 3d9677d 2026-09-09 Fix Lincoln shop links and launch custom signature wallpaper studio
  36. 19dfb15 2026-09-09 signature-edit: new SEO lookbook page — 10 icons in the Signature Edit
  37. 1b058a3 2026-09-09 auto-data-snapshot: 2026-09-09T12:49:50 (3 data files) — public/assets/campaign-lincoln-products-v2.png verification/e2e-proof.json verification/wallpaper-release.json
  38. bc4838a 2026-09-09 auto-data-snapshot: 2026-09-09T12:16:55 (2 data files) — verification/wallpaper-decision.md verification/wallpaper-release.json
  39. dc24bda 2026-09-09 campaign: regenerate Lincoln image — natural eyes/expression (was distorted)
  40. 01e407c 2026-09-09 wear: fix Lincoln sock signature — flat/horizontal at the cuff, not rotated up the shin
  41. 0355907 2026-09-09 campaign: overlay text on the photo's open area + signature on all products
  42. f757861 2026-09-09 front page: flip sections — campaign (seated Lincoln) leads, hero follows
  43. 62fab0c 2026-09-09 front page: stack the campaign section — image on top, text below
  44. 1e946e3 2026-09-09 auto-data-snapshot: 2026-09-09T11:09:48 (1 data files) — verification/lincoln-campaign-prompts.json
  45. 2a4de6d 2026-09-09 wear: put Abraham Lincoln's signature on the ACTUAL product images (Signature Edit)
  46. f4f8745 2026-09-09 front page: Gucci-style Signature Edit hero — No. 001 Abraham Lincoln
  47. 3693ec3 2026-09-09 wear: add all-over-print signature shirts (camp button-up + long-sleeve) — TK-10286
  48. a70566c 2026-09-09 wear: add typeahead search across the top of the signature picker
  49. 6ccdfb9 2026-09-09 Clear the bucket hat eyelets and update verified preview handoff
  50. c4e6752 2026-09-09 Match the bucket hat preview selection to the supported Bone variant
  51. ac773c5 2026-09-09 wear: front-facing hats + centered signature; remove YOUR DESIGN placeholder (TK-10286)
  52. 703013b 2026-09-09 auto-data-snapshot: 2026-09-09T10:04:38 (1 data files) — data/wear-templates.json
  53. 178086a 2026-09-09 wear: curve-warp hat signature overlays + fix dad-cap/bucket-hat placement (TK-10286)
  54. a15a0cd 2026-09-09 wear: re-center trucker-cap signature overlay (TK-10286)
  55. 7648991 2026-09-09 wear: hover-to-zoom 3x lens on the signature only (TK-10286)
  56. e546ddf 2026-09-09 Center the product preview text and options
  57. f44f65b 2026-09-09 Add three hat previews and socks with guarded purchase and fulfillment paths
  58. f19730e 2026-09-09 homepage: tighten gallery card UI + wire real mural/clothing purchase links (TK-10286)
  59. 2dd7c66 2026-09-09 wear: persist sort selection to localStorage, matching density (TK-10286)
  60. c90a83c 2026-09-09 Verify recolored wear artwork through both fulfillment draft paths
  61. c9d72f3 2026-09-09 wear: fix recolored signature URL being relative, not absolute (TK-10286)
  62. c2a79ec 2026-09-09 wear: independent Stripe live switch — allows one test order before real money (TK-10286)
  63. f2976c0 2026-09-09 wear: use 'convert' not 'magick' — prod box only has ImageMagick 6 (TK-10286)
  64. 452cc4c 2026-09-08 wear: update stale KNOWN ISSUE notes now that the black-print fix landed (TK-10286)
  65. 9f1ba52 2026-09-08 wear: fix the black-garment print contrast bug for real (TK-10286)
  66. bda7296 2026-09-08 wear: real rotatable 3D viewer for the classic tee (Three.js) — TK-10286
  67. 8b345a4 2026-09-08 auto-data-snapshot: 2026-09-08T15:35:04 (1 data files) — public/assets/models/shirt_baked.glb
  68. 108381c 2026-09-08 wear: drop the cap, real Printify product photos instead of flat SVG (TK-10286)
  69. 4173af9 2026-09-08 wear: real multi-item shopping cart (own cart, not Shopify's) — TK-10286
  70. adf1313 2026-09-08 wear: polo left_chest placeholder, add cap garment, collar fabric tag (TK-10286)
  71. 06e1b9d 2026-09-08 wear: dial print size back down to standard small left-chest logo (TK-10286)
  72. e887506 2026-09-08 wear: bigger/higher placement, add pocket-tee, fix preview left/right mismatch (TK-10286)
  73. dcec53c 2026-09-08 auto-data-snapshot: 2026-09-08T10:58:37 (1 data files) — data/wear-templates.json
  74. 97b050d 2026-09-08 wear: verify + fix left-chest print position against real Printify mockups (TK-10286)
  75. 2e8f61b 2026-09-08 wear: extend printify-cost-check.mjs to also verify left-chest placement (TK-10286)
  76. ba30f90 2026-09-08 wear: fix dark-garment preview + map Printify blueprints/variants (TK-10286)
  77. f197cfc 2026-09-08 wear/POD: fix 4 correctness bugs from codex's 2026-09-04 review (TK-10286)
  78. 919eed1 2026-09-04 Celebrity Signatures: correct a FALSE 'Data Not Collected' privacy instruction (TK-10387)
  79. 4794797 2026-09-03 add gated Printify fulfillment path for wear
  80. 4f0db6e 2026-09-03 document TK-10286 wear end-to-end proof
  81. a848890 2026-08-31 chore: v1.0.3 -> v1.0.4 (session close — /wear Stripe live-key fix + 2XL upcharge, TK-10286)
  82. b152beb 2026-08-31 wear: +$4 2XL size upcharge (tee $38 / polo $48) — TK-10286
  83. 8b5b7ca 2026-08-31 wear: charge apparel through live-capable Stripe resolver, not test-only key (TK-10286)
  84. 19ad3e6 2026-08-31 Add AI-readable site guide
  85. 93f7578 2026-08-25 CelebritySignatures mobile: early-game respects Difficulty + persist personal best (TK-10398)
  86. 0770f00 2026-08-10 chore: lint, refactor, session-close fixes, v1.0.2 → v1.0.3 (TK-10286)
  87. 0fa8dbf 2026-08-10 wear/POD: wire Printful sender + go-live path (gated OFF) — TK-10286
  88. 5ed1ce7 2026-08-10 wear v1 soft-launch: browsable catalog live, sales gated behind WEAR_SALES_LIVE (coming-soon/notify-me buy button; no test-checkout exposed to real visitors)
  89. 96c795b 2026-08-10 wear v1 (TK-10286, Steve GO): ship public-domain historical signatures, USPTO auto-screen deferred
  90. a858b81 2026-08-10 chore: lint (node --check ✓, no linter configured) + v1.0.1 → v1.0.2 (session close, TK-10286)
  91. d394377 2026-08-10 wear/TM: partial-register completeness guard + fix retired-host runbook (TK-10286)
  92. 15b76e1 2026-08-10 ios: fastlane push_listing = screenshots-only (skip_metadata) — avoids blanking required App Review contact fields; metadata already published on the draft (TK-10262)
  93. 986ff07 2026-08-10 ios: fresh App Store screenshots (iPhone 6.9" 1320x2868 + iPad 13" 2048x2732) from live site — replaces stale broken set (TK-10262)
  94. a613dfa 2026-08-09 mobile: iPhone-only (supportsTablet:false) — drops iPad so ASC stops requiring iPad screenshots (TK-10258, Steve-approved iPhone-only)
  95. 43d50a8 2026-08-08 screenrecord: track murals debug + verify harnesses (TK-10193 reproducibility)
  96. 57895fb 2026-08-08 game: harden — hide #prep before showRound() (Cody gate, TK-10192)
  97. dc1565d 2026-08-08 game: fix TK-10192 BUG 1 — build failure no longer fires a modal alert() that froze the page
  98. 589b8d1 2026-08-08 auto-data-snapshot: 2026-08-08T10:37:54 (77 data files) — screenrecord/debug-log.jsonl screenrecord/rec/game-run0/page@d3c036c80501f7033d077d5f6df76847.mp4 screenrecord/rec/game-run0/page@d3c036c80501f7033d077d5f6df76847.webm screenrecord/rec/game-run1/page@6e5156e1f617020d464184dbf6f78a28.mp4 screenrecord/rec/game-run1/page@6e5156e1f617020d464184dbf6f78a28.webm
  99. e0115ae 2026-08-08 murals: fix TK-10193 BUG 1 — quote-submit no longer wipes name+email, so a follow-up Pay & order isn't blocked
  100. 8f9337b 2026-08-08 auto-data-snapshot: 2026-08-08T10:07:09 (1 data files) — screenrecord/verify2-out.txt
  101. ea8763a 2026-08-08 auto-data-snapshot: 2026-08-08T09:36:16 (1 data files) — screenrecord/verify2-out.txt
  102. 6b43f50 2026-08-08 auto-data-snapshot: 2026-08-08T09:04:57 (14 data files) — screenrecord/DEBUG-REPORT-murals.md screenrecord/debug-log-murals.jsonl screenrecord/debug-log.jsonl screenrecord/rec-murals/run0/page@f5767eef11026eca613976f1e51c40d4.webm screenrecord/rec-murals/run1/page@28e5339b4fca63b10de68d86e54f6561.webm
  103. 05236a4 2026-08-08 TK-10191: screenrecord front-page UI debug (5-pass) — report + log
  104. cb846f4 2026-08-07 celeb web: add Sign in with Apple button to the account.js login modal (web parity — full-page /auth/apple/login redirect, shown only when /api/auth-config reports apple:true)
  105. 7f435c2 2026-08-07 celeb: allow /.well-known/ through the sensitive-path guard (Apple domain-association file for Sign in with Apple) — dotfiles otherwise still blocked
  106. 5c6df61 2026-08-07 celeb mobile: add Sign in with Apple button to AccountScreen — appleSignIn() runs ASWebAuthenticationSession (expo-web-browser) then replays /auth/handoff so cs_sess lands in the native cookie jar; button hidden until /api/auth-config reports apple:true (v1.1, staged — not submitted)
  107. ee2b355 2026-08-07 celeb: add Sign in with Apple backend (web OAuth + WebView handoff bridge) — /auth/apple/login+callback verify Apple, upsert user by appleSub, cs_sess session; /auth/handoff one-time cookie bridge; /api/auth-config gates the button. Dormant until Services ID/key configured (v1.1)
  108. 6a34cf3 2026-08-06 chore: lint, refactor, v1.0.1 (session close)
  109. 4986121 2026-08-06 Add WEAR-READY-FOR-KEY finish note (paste key -> full-register screen -> /wear populates)
  110. 9a722d3 2026-08-06 Repoint TM register fetcher to USPTO Open Data Portal (trtdxfap); document WAF + ID.me-key reality, add --file/--odp/--url ingest modes
  111. a1b47a6 2026-08-06 Add /wear: left-chest signature apparel with USPTO trademark clearance gate
  112. 56c46cb 2026-08-06 auto-save: 2026-08-06T09:20:28 (13 files) — .gitignore server.js WEAR-LEGAL-NOTE.md data/tm-clearance.json data/tm-index-seed.json
  113. 9492cb5 2026-08-06 murals: add precise wall-size number inputs synced with the sliders
  114. 16ef809 2026-08-06 auto-save: 2026-08-06T08:19:59 (1 files) — apps/mobile/package-lock.json
  115. 7884b61 2026-08-06 murals: fix selected mural not appearing (SVG thumbnails 400'd)
  116. c148585 2026-08-06 chore: bump mobile v1.0.0 → v1.1.0 (6-game suite, session close)
  117. dd93fc7 2026-08-06 mobile: add game-engine validation harness (6/6 games ALL PASS vs live data)
  118. 7c16c4c 2026-08-06 auto-save: 2026-08-06T04:48:33 (8 files) — screenrecord/debug-log.jsonl screenrecord/game-debug.mjs screenrecord/rec/game-run0/ screenrecord/rec/game-run1/ screenrecord/rec/game-run2/
  119. 4e9ff2c 2026-08-05 auto-save: 2026-08-05T20:45:35 (3 files) — apps/mobile/fastlane/README.md apps/mobile/fastlane/report.xml apps/mobile/fastlane/screenshots/
  120. f3381c6 2026-08-05 iOS: fastlane deliver config + metadata — uploaded listing to ASC draft
  121. d805e54 2026-08-05 auto-save: 2026-08-05T18:14:36 (1 files) — apps/mobile/store-assets/listing.md
  122. ab0c89f 2026-08-05 auto-save: 2026-08-05T17:44:25 (1 files) — apps/mobile/store-assets/
  123. e2d7d1c 2026-08-05 web: clicking a signature opens its details popup; Books section (Open Library) for non-artist hands
  124. 91f1e57 2026-08-05 iOS app: white gallery theme + all images render + tap-signature works/books (Steve email 8/5)
  125. 701c009 2026-08-05 mobile: harden games port per adversarial review
  126. 3d57856 2026-08-05 mobile: port all 6 desktop games into GameScreen (was whose-only)
  127. 4b6b29e 2026-08-05 iOS: complete App Store screenshot set — all 4 tabs (Gallery/Game/Murals/Account)
  128. 792482d 2026-08-05 iOS: capture Gallery App Store screenshot (6.9", release sim build) + submit PTY helper
  129. 81f3b93 2026-08-05 auto-save: 2026-08-05T16:43:55 (2 files) — apps/mobile/scripts/eas-submit-pty.exp apps/mobile/store-screenshots/
  130. de43961 2026-08-05 iOS: wire ASC app id 6798448971 into eas.json submit (app record + App ID already exist under team 3VAV3KMNZK)
  131. 7beb504 2026-08-05 iOS: EAS project link + headless first-build tooling + App Store listing draft
  132. 523098f 2026-08-05 auto-save: 2026-08-05T16:13:44 (2 files) — apps/mobile/app.json apps/mobile/scripts/eas-build-pty.exp
  133. a36745c 2026-08-05 iOS: wire eas.json submit to the team-wide ASC API key (reused from C&E)
  134. 0fd2d48 2026-08-05 iOS app: address contrarian FIX-FIRST gate
  135. caf36ad 2026-08-05 iOS: add on-brand app icon + splash + adaptive icon, wire into app.json
  136. fc65300 2026-08-05 iOS: wire the 3.1.1 WebView guard + fix evolution-load side effect
  137. 73d9137 2026-08-05 iOS app: native Expo/EAS scaffold over celebsignatures.com APIs
  138. 77c8879 2026-08-05 backend: add POST /api/auth/delete (Apple 5.1.1(v) account deletion)
  139. 4bbb628 2026-08-05 AdSense onboarding: add /privacy policy page + site-wide footer link (celebsignatures.com)
  140. 7cd0f6a 2026-08-04 chore: fix game tagline (Five→Six ways), add version 1.0.0 (session close — live-payments milestone); lint clean, refactor review report-only on live payment code
  141. b4ed90d 2026-08-04 auto-save: 2026-08-04T13:33:48 (1 files) — public/assets/ads.js
  142. cc24002 2026-08-04 Pre-built reserved AdSense ad zones (gallery/article/game) — hidden until per-zone slot ids are set via env (ADSENSE_SLOT_GALLERY/ARTICLE/GAME), so zero visual impact pre-approval + zero CLS once live (reserved min-height). assets/ads.js activator + server config injection. Post-approval = paste 3 slot ids into prod .env, done (TK-10181)
  143. 87f0e4a 2026-08-04 Accept rk_live_ restricted keys for the live Stripe key (least-privilege restricted key path for the murals go-live) (TK-10181)
  144. 6db34b0 2026-08-04 AdSense Auto-ads integration (Steve request 2026-08-04): loader injected into every HTML response + /ads.txt route, both driven by ONE env var ADSENSE_PUB_ID (pub-XXXX, ca- prefix tolerated). No-ops safely when unset (0 loaders, ads.txt 404). Auto ads = no per-slot IDs; Google places units. Ready the instant a publisher id is set — needs an AdSense account + site approval (Steve-gated) (TK-10181)
  145. ea2f10b 2026-08-04 Live switch is now MURAL-ONLY (Steve go-live 2026-08-04): per-flow keys — murals use live key when STRIPE_LIVE_ENABLED=1, downloads PINNED to test key until a celebrity-payout mechanism exists. Flipping the live switch can never accidentally charge a real card for a download whose owner we cannot pay. mode stamped from STRIPE_MODE (TK-10181)
  146. cc656ee 2026-08-04 Live-mode switch (prep for go-live, defaults OFF): STRIPE_LIVE used ONLY when STRIPE_LIVE_ENABLED=1 AND sk_live_ present — else test. Real cards never charged unless Steve explicitly flips both. Generalized cs_(test|live)_ session-id checks. Boot logs the active mode (TK-10181)
  147. d8cfb50 2026-08-04 SECURITY (HOLE 5, blocks live money): paid download link no longer permanent — a Stripe session stays paid forever, so a shared ?sid= URL was infinite free re-download. Now gated to a 1-HOUR window from purchase + max 3 serves/session (persisted download-sids.json), then 410 → contact support. Allows legit retry, kills permanent sharing. Prereq for the live-key flip (TK-10181)
  148. f2fc2ab 2026-08-04 payments(TEST): Cody gate fixes — atomic USED_SIDS guard (closes concurrent double-credit race) + gate on status===complete (Stripe fulfillment best-practice)
  149. 0881033 2026-08-04 payments(TEST): gate signature downloads behind Stripe checkout — /api/signature-checkout + paid-session verification on /api/signature-file (idempotent by sid, inert without test key, live key never read)
  150. faf97c9 2026-08-04 GA4 game_start: guard category param — only log when #catOpts visible (Cody gate fix, prevents junk dimension for 4/6 modes)
  151. e44e3a8 2026-08-04 GA4 events: add game_start (mode/difficulty/category) + game_mode_select on game.html
  152. 3b155de 2026-08-04 GA4 events: wire named conversion/engagement events (mural_order_click, signature_upload, view_signature, cta_click) via delegated ga-events.js on all pages (DTD-B verdict)
  153. fc549c4 2026-08-04 Stripe Checkout for mural orders (Steve APPROVED, TEST-mode): zero-dep /api/mural-checkout creates a Stripe Checkout Session via REST (price = custom sqft × $10), /order-success verifies payment + marks the order paid + confirms; murals form gets 'Pay & order →' (with 'Request a quote' fallback). Reads STRIPE_TEST_SECRET_KEY ONLY — live key deliberately never touched (go-live = separate gate). Degrades gracefully w/o key (503). NOT deployed until a real test checkout verifies (TK-10181)
  154. 5d6a79e 2026-08-04 yoloforever PIVOT (Cody unanimous KILL-the-museum-loop): stop bolting museums, build SEO surface area — the 7,211 signatures lived in ONE JS-rendered page Google couldn't crawl. Now: server-rendered crawlable /a/<QID> page per signature (JSON-LD Person schema + canonical + OG), /sitemap.xml (7,197 URLs), /robots.txt; grid card links point at /a/<QID> (JS still opens the popup, href is the SEO/no-JS fallback). Factored mergedSignatures() helper w/ 60s cache. Verified: /a/ 200 + renders server-side, sitemap 7197 locs, popup still works (TK-10181)
  155. 248c7da 2026-08-04 World-collections expansion: +12 major museums (Hermitage, British Museum, Kunsthistorisches Vienna, Pompidou, Reina Sofía, Musée Rodin, V&A, Gemäldegalerie Berlin, NPG London, Alte Pinakothek, Städel, Tokyo National) via the dense P6379 path → +53 net Artists (1368→1421), site 7168→7211, 78 artists gained a new-museum tag. Honest: per-museum P6379 coverage is uneven (marquee retags sparse) — the win is +53 new signature-artists (TK-10181)
  156. da686f0 2026-08-04 auto-save: 2026-08-04T07:00:57 (2 files) — data/artists-raw.json scripts/fetch-artists.mjs
  157. db2d9d9 2026-08-03 auto-save: 2026-08-03T21:27:28 (4 files) — output/collage-artists-named.png output/collage-artists.png output/collage-authors-named.png output/collage-authors.png
  158. 681aafe 2026-08-03 Cody-gate fix (verified, proportionate): server art-occupation gate now excludes fashion/costume/game/sound/web 'designer' matches (Christian Dior no longer sits in Artists next to Van Gogh). Kept genuinely art-occupied figures famous for other things (Pasteur=portrait painter, Andersen=papercut artist, Mercator=engraver) — defensible. VERIFIED Cody overstated '33 non-artists live': the server gate already excludes Darwin/Tolstoy/Galileo; only 4 designer/adjacent leaked, Dior the sole indefensible one. Artists 1372→1368 (TK-10181)
  159. b394599 2026-08-03 auto-save: 2026-08-03T20:57:17 (5 files) — output/collage-declaration-of-independence-named.png output/collage-declaration-of-independence.png output/collage-politics-named.png output/collage-politics.png scripts/fetch-artists.mjs
  160. 4e31653 2026-08-03 Amsterdam haul via P6379: +110 net Artists (1262→1372), site 7076→7168. P6379 (has-works-in-collection, person→museum) is DENSE where P195 (artwork→collection) was a dead end — pulled the Dutch masters & tagged Van Gogh/Rembrandt/Vermeer/Mondrian to the Rijksmuseum. Densifies museum coverage for all 30 museums (TK-10181)
  161. e4eec83 2026-08-03 harvest infra: fix WDQS 504 timeout on the 25-museum query — now batched (3 museums/query) with retry+backoff, robust for every future harvest; register 5 Amsterdam/Dutch museums (Van Gogh Museum, Stedelijk, Rembrandt House, Amsterdam Museum, Mauritshuis) for when their Wikidata P195 coverage improves. NOTE: P195 itemization for these is currently sparse (+6 net artists, no marquee retags) — a real Amsterdam haul needs a Rijksmuseum-roster source (TK-10181)
  162. 36e1cbe 2026-08-03 yoloforever C3 fast-follow (Cody SHIP-IT verified real): canonical + meta description + apple-touch-icon on all 4 pages (the two tags Google actually uses); softened upload share-card from '$10 per download' to 'a commission' (payments still Stripe-gated — no promise the product can't yet keep) (TK-10181)
  163. d017b3d 2026-08-03 yoloforever C3: social-share polish — OG + Twitter summary_large_image meta on all 4 pages (per-page title/desc, og:image = signature-wall share card built in Photoshop/PIL from the artists collage + wordmark) so shared score links unfurl richly; favicon (signature-ink glyph) + /favicon.ico route → kills the last console 404 fleet-wide. Verified: favicon 200, OG on all pages, 0 console errors (TK-10181)
  164. cb358f7 2026-08-03 yoloforever C2 hardening (Cody FIX-FIRST, all verified real): leaderboard endpoint locked down — game/diff whitelist (no arbitrary-key disk-fill), score capped 250 (blocks client-asserted 9999), per-IP rate limit 10/min (429), submission-id for deterministic rank + id stripped from public list. Verified: cheat→250, junk key→400, 11 posts→429 (TK-10181)
  165. 79cdb51 2026-08-03 yoloforever C2: games social layer — server /api/leaderboard (top-20 per game+diff, JSON-backed, no-auth, sanitized) + results-screen leaderboard w/ your-rank highlight + 'Copy result' & X-share intent; addresses Cody's zero-retention/no-social-loop risk. Verified: API ranks correctly, UI posts+renders, 0 new console errors (.deploy.conf leaderboard-exclude applied locally, gitignored) (TK-10181)
  166. e4183c5 2026-08-03 yoloforever C1: scope-aware empty-search state (honest 'archive of history's hands, living people not here yet' — addresses Cody's brand-vs-content churn risk); UI debug pass verified all 3 pages 0 console errors, 2 findings phantom-dropped (TK-10181)
  167. 9913d83 2026-08-03 Portraits for non-artists: fetch-portraits.mjs pulls Wikidata P18 -> Commons (CC/PD) for all 7055 people (6437 found); politicians/astronauts/authors/founders now show their PORTRAIT in the popup instead of an empty Works section (artists keep Works); portrait face-thumbnail added to every card's details chip + a circle beside the signature in the popup. Plus: client-side upload file-size guard (screenrecord finding) (TK-10181)
  168. b10be7b 2026-08-03 Celeb Signatures: slow 16s ease-in-out float on hero logo (premium/calm, reduced-motion guarded)
  169. 4562ef6 2026-08-03 auto-save: 2026-08-03T14:24:54 (6 files) — data/portraits.json screenrecord/ scripts/fetch-portraits.mjs scripts/screenrecord-game.mjs scripts/screenrecord-murals.mjs
  170. 92e20cb 2026-08-03 ⚡ Lightning Round (6th game): a real museum painting flashes up, 5-SECOND timer to name the ARTIST then the TITLE (auto-fails on timeout, no time to look it up), both-right bonus per painting (+5), fame-adjacent distractors from the same painting pool; timer bar drains green->red (TK-10181)
  171. 1762123 2026-08-03 auto-save: 2026-08-03T13:54:39 (1 files) — public/game.html
  172. 647ee5c 2026-08-03 celebsignatures.com LIVE: elegant front page (Photoshop Snell-script logo hero + corner hamburger + Amazon-style left drawer), GA4 G-2HEVP6TD0J injected on all 4 pages, mobile pass, go-live runbook aligned to fleet ACME-webroot + IP-bound 443 pattern (TK-10181)
  173. 934e111 2026-08-03 celebsignatures.com go-live runbook (nginx vhost IP-bound per fleet rule + LE cert + smoke) — awaits domain purchase + DNS
  174. aeefcc5 2026-08-03 Elegant front page: Photoshop Snell-Roundhand script logo (topbar + hero, mix-blend multiply), full-bleed hero over faint museum-collage backdrop with 3 CTAs, corner hamburger opening Amazon-style left drawer holding ALL browse controls (tabs/categories/use/sort/density/views + links), The Collection section head, /assets route (TK-10181)
  175. 0faa6c2 2026-08-03 mobile pass: responsive masthead (wrap + scrollable nav), 2-col grid on phones (layout-aware: ledger 1 / wall 4 / vitrine 1), full-width search, popup 96vw + 2-col works + full-width CTA, game stage + choices sized for phones, murals header/ctrls compact (verified at 390x844)
  176. 133e8ee 2026-08-03 The Signature Games: 5-game arcade at /game — Whose Hand? (sig->name), Who Signed This? (real AIC museum artwork->artist, Steve's ask), Match the Hand (sig->pick their artwork of 4), Early or Late? (two dated sigs from one person's evolution timeline), Date the Hand (sig->century); shared engine, streak scoring, per-game best scores, artwork gallery prefetch with progress (TK-10181)
  177. dbeb105 2026-08-03 pre-deploy: strip temp Figma capture scripts; Authors collage built (top-200, 10x20) -> murals catalog 34
  178. 14e7071 2026-08-03 popup: center name/life/badges under the signature; FIX broken works images (AIC IIIF hotlink-blocks Referer -> referrerpolicy=no-referrer, verified 6/6 render for Munch incl. The Scream) + broken tiles self-remove; gallery card names centered
  179. 21c7dea 2026-08-03 Gallery layout: names always visible below the details chip (chip stays hover-revealed above)
  180. d1e7283 2026-08-03 6 switchable shopping layouts (View chips), all info-on-hover: Gallery (refined default), Float (chromeless ink on cream), Plaque (dark plate slides over on hover), Ledger (auction-catalog rows), Vitrine (large tiles, glass caption fade), Wall (dense signature texture, hover lifts + floating name plate); persisted per visitor, touch devices keep info visible (TK-10181)
  181. 5a07275 2026-08-03 'Whose Hand?' signature-ID game at /game: 10 rounds, 4 fame-adjacent same-category distractors, streak scoring, 4 difficulty tiers (Icons top-100 -> Deep Cuts all 7,076), category filters, per-mode best score, every reveal links to the artist's page; nav wired (TK-10181)
  182. b9facd3 2026-08-03 auto-save: 2026-08-03T12:23:59 (5 files) — public/index.html public/murals.html public/upload-signature.html output/collage-authors-named.png output/collage-authors.png
  183. 7084e36 2026-08-03 typography unification: Playfair Display headings across murals + upload pages (brand consistency with the grid masthead)
  184. 5d38631 2026-08-03 collage builder: merge authors.json into the data view (Authors collage was silently empty)
  185. 4b5b421 2026-08-03 Authors category LIVE: 5,686 deceased authors with verified Commons signatures (Shakespeare #1; writer/novelist/poet/playwright/essayist occupations, dead>50yr, famous-first) — site now 7,076 signatures; Authors collage capped at top-200 (logged, full set in grid) (TK-10181)
  186. 9aa908e 2026-08-03 Mural pricing: $10/sq ft (Steve directive) — 24x12 flagship now $2,880, custom sizes scale linearly
  187. 46fd5bd 2026-08-03 Custom mural sizing: user enters mural width/height (ft) and signature chips re-arrange live at true print scale (~1.9x0.85ft/sig) — bigger walls pull the next famous-first set in (verified: Politics 8x4ft=16 sigs, 24x12ft=54 sigs, live sqft price); order payload carries custom dims + count. Plus: Authors category scaffolding (fetch-authors.mjs literary-occupation harvest, server merge, UI chips, /k/w collage QR) (TK-10181)
  188. 03c2beb 2026-08-03 Five-Horsemen UX pass (ui-ux + graphic-designer panel verdicts applied): global nav masthead + Playfair wordmark, name SEARCH on the grid, value-prop hero line, category chip counts, consumer language (Free to use / Permission needed), document-style cards + hover-reveal details chip, popup recomposition (full-width signature, Playfair name, sticky Order-a-mural CTA), dialog a11y (role/aria-modal/focus return), upload page $10 stat callout (TK-10181)
  189. b5a9458 2026-08-03 Celebrity signature upload + commission system: account-owned uploads (private storage, never statically served), tracked download endpoint with append-only commission ledger (50% of $20/download), identity-review admin gate, upload page + earnings dashboard at /upload; CLOSED pre-existing hole: data/{users,sessions}.json were directly fetchable -> 403 guard (TK-10181)
  190. b6b478a 2026-08-03 Museum expansion final: 1262 artists (Cleveland 219, MFA Boston 202, LACMA/Broad/MOCA/Getty tags merged), collage rebuilt 911 sigs 10x92 (TK-10181)
  191. 248d9d2 2026-08-03 works source 4: Wikidata P170+P18 by QID (keyless CORS WDQS -> Commons thumbs) — covers Rijksmuseum/Uffizi/Prado holdings; art-build audit: MET+AIC already integrated, Rijks key was placeholder + old API 410-retired (TK-10181)
  192. 7318273 2026-08-03 Artists mega-collage (895 verified signatures, 10x90 wall + QR /k/a) + 3 museum murals built (Masters of the MET / National Gallery Masters / Smithsonian Masters) -> 33 mural products (TK-10181)
  193. a7c40c4 2026-08-03 Museum expansion wiring: +10 museums in P195 harvest (LACMA, The Broad, MOCA, Getty, SFMOMA, Whitney, Guggenheim, Cleveland, MFA Boston, Philadelphia; QIDs verified), union-not-overwrite artists-raw writes; popup works loader now multi-source (Met -> AIC -> Cleveland, all keyless CORS) with per-tile museum label (TK-10181)
  194. faaabcc 2026-08-03 Minimal cards (signature + name only) + artist details popup: badges/museums/license/links, signature-evolution strip, and the artist's WORKS live-loaded from the Met Open Access API; URL-addressable ?artist=QID deep links (TK-10181)
  195. cddb938 2026-08-03 signature-evolution data live: 162 people with multiple signatures, 58 datable timelines (Delacroix 1835-1863, Lincoln 28 sigs, Rodin, van Eyck); adopt authoritative artists.json server filter (TK-10181)
  196. 0a2db07 2026-08-03 Adopt two-source architecture (curated file + generated artists.json, server-side merge): artists-post.mjs ports CC salvage (Rembrandt/Kahlo) + museums re-join + rerank onto artists.json; evolution + collage builders read the merged view; retire merge-artists bake-in (TK-10181)
  197. c07a041 2026-08-03 CC-license salvage: +162 artists whose signature SVG carries a CC BY(-SA) claim (Rembrandt, Kahlo) — admitted per site's existing attribution model; Artists=1237, catalog=1365 rows (TK-10181)
  198. e6a9005 2026-08-03 Artists category LIVE in catalog: 1075 verified dead artists (MET/NGA/Smithsonian + major-museum rosters), all PD-signature Commons-verified, visual-arts occupation gated; catalog 128->1203 rows (TK-10181)
  199. 396705f 2026-08-03 3 museum mural themes: Masters of the MET / National Gallery Masters / Smithsonian Masters (curated 14-name rosters from artists-raw, gemma3 local blurbs) (TK-10181)
  200. 757e39d 2026-08-03 Signature evolution: multi-P109 + Commons 'Signatures of X' timeline fetcher, inline card strip (details/summary, no modal); wire Artists into collage builder + /k/a QR short code (TK-10181)
  201. e3ae265 2026-08-03 auto-save: 2026-08-03T10:23:02 (3 files) — data/artists-raw.json data/artists.json tmp_artists.png
  202. 3c90e38 2026-08-03 Artists category: Wikidata P195 museum-artist harvest + PD-signature verify + dedupe-safe /api/signatures merge
  203. 4d73f50 2026-08-03 Artists groundwork: shared wikidata-common lib (extracted from fetch-wikidata), roster gap-fill harvester (NGA/MET-CSV/SI -> P109), idempotent celebrity_signatures merger, museum tags on grid cards (TK-10181)
  204. 31e56bf 2026-08-03 fix: add package.json (type:module) so the ESM server.js can actually run — app was never startable without it (TK-10123)
  205. fb92129 2026-08-01 CelebritySignatures: href-drill — category + usability are filter-links (URL-addressable)
  206. b3b1355 2026-07-03 chore: macstudio3 migration — reconcile from mac2 + repoint paths (stevestudio2→macstudio3, node/npm/npx→/opt/homebrew)
  207. 5af58db 2026-06-19 add 27 themed signature murals (Wikidata P109 sigs + Met PD art) → 30 murals on /murals; catalog-roster drawer
  208. 3a77cd8 2026-06-19 wire Oldest Signatures into storefront: grid category + mural product + roster (Met PD art)
  209. 57c16d5 2026-06-19 add 'Oldest Signatures in History' research dataset, spreadsheet + Met-art mural
  210. f4efd0f 2026-06-19 narrow catalog to historical figures (Declaration + Politics) dead >50yr; drop movie/tv/sports; rebuild CSV from JSON; regen art
  211. 5528234 2026-06-19 fix card name + category-tag clipping (wrap long surnames instead of overflow-hidden)
  212. a60c49a 2026-06-19 deploy: ship deceased-only catalog to celebrity.designerwallcoverings.com; add .deploy.conf
  213. 2c1af56 2026-06-19 regenerate collages + portrait murals from deceased-only dataset
  214. 8def5d9 2026-06-19 remove all living celebrities; keep only deceased (publicity-rights safe)
  215. 3c6f492 2026-06-19 snapshot before removing alive celebrities
  216. 11d1aad 2026-06-18 Accounts + save-your-placement: zero-dep email/password auth + per-account saved mural placements; injected account.js UI
  217. a27e4a9 2026-06-18 data: recategorize FDR Sports→Politics + rebuild affected collages
  218. 4ad180e 2026-06-18 Portrait murals: portrait+signature per cell (PD/CC-gated portraits) for all 6 categories + generator
  219. 86bfd8c 2026-06-18 murals: add 5 consensus components (graphic-designer ∩ four-horsemen)
  220. 9111112 2026-06-18 Murals storefront: /murals sales page + wall-placement studio + order endpoint + 150dpi 24x12ft TIF print-master generator (verified)
  221. 84da440 2026-06-18 Mural QR: B+C — functional-size centre QR + short /k/<code> route
  222. ac66a5d 2026-06-18 QR points at public Kamatera host via short /k/<cat> route; verified all 6 decode
  223. a8e8de1 2026-06-18 Murals: QR is now a signature-sized centre cell (drop panel/caption/shadow)
  224. b04a4a9 2026-06-18 Murals: hide names + centre QR to the named key
  225. 3a492fb 2026-06-18 All 3: Collages tab in viewer + deceased-only Movies(Classic) category (97 usable) + signature-likeness filter (drops color-photo/document scans, keeps sparse sigs). Dataset now 656 rows, 6 collages
  226. 933e944 2026-06-18 Build per-category collages (usable-only): Declaration(56), Politics(75), Sports(42), Hollywood(100), TV(22); Movies skipped (0 usable). 429-throttled Wikimedia raster fetch
  227. 44a7d34 2026-06-18 Add zero-dep grid viewer (server.js + public/index.html): sort + density slider, risk/usability badges, uniform card sizing
  228. 7d02e4f 2026-06-18 Populate 556 verified signatures (500 celebrity + 56 DoI); sitelink-title backfill, CSV newline sanitize, WDQS outage backoff
  229. 0829e6e 2026-06-18 CelebritySignatures: scaffold + verified Declaration of Independence set (56 signers, all PD) + WDQS celebrity engine

Authors

Agents used

  • none detected

Skills used

  • /claude39
  • /code39
  • /wear27
  • /mobile11
  • /assets10
  • /wear-success8
  • /rec7
  • /murals6
  • /page6
  • /index5
  • /auth5
  • /game5
  • /wear-templates4
  • /wear-checkout4
  • /scale4
  • /signatures4
  • /socks3
  • /reconcile-wear-orders3
  • /polo3
  • /black3
  • /size3
  • /debug-log3
  • /game-run03
  • /game-run13
  • /mural-checkout3
  • /auth-config3
  • /fastlane3
  • /ads3
  • /fetch-artists3
  • /trucker2

Creative ideas + design notes

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

fbffb50 · 2026-09-13 · gitignore: exclude campaign image-gen candidates + QA artifacts
Rejected Lincoln generation variants and verification screenshots from the
Sep-9 campaign session — regenerable, not referenced by any tracked code.
The chosen hero (campaign-lincoln-seated.jpg) stays tracked.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8272a62 · 2026-09-13 · campaign: lead the homepage hero with the full seated Signature Edit
Swap the campaign hero from the tee-only shot to campaign-lincoln-seated.jpg
(Lincoln seated in the full Signature Edit — bucket hat, tee, socks) and
reword the copy + rendering disclaimer to match.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VAzDMrVAjLD4umvnMMStjD
d72fd54 · 2026-09-13 · wear: fix "See on garment" not hiding the editorial worn shot + modernize gallery E2E
- wear.html: #lifestyleShot had display:block with no [hidden] guard, so
  setLifeView("garment") (.hidden=true) never actually hid the seated
  Signature Edit portrait — for all 50+ mapped signers, "See on garment"
  left the worn shot covering the garment mockup/3D view. Add
  #lifestyleShot[hidden]{display:none}.
- gallery-shopping.e2e.cjs: port the retired murals journey to the shipped
  /wallpaper studio (commit 3d9677d), expect all 9 garments, correct the
  sale state (dad/trucker/bucket/socks are for sale; the two AOP shirts are
  the coming-soon holds), cover the worn-shot -> garment toggle, screenshot
  the always-visible .preview instead of the now-hidden #stage.
- 5x/ink-gate.mjs: supplementary CDP E2E for the modal ink control (PASS).

Both viewports PASS, zero page errors.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VAzDMrVAjLD4umvnMMStjD
15e7499 · 2026-09-09 · wear: add Signature Edit lookbook promo banner (discoverability)
Slim green-accented callout below the header linking /wear → /signature-edit,
so shoppers find the 53-icon worn-shot lookbook.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7bce96c · 2026-09-09 · signature-edit: expand The Signature Edit lookbook from 10 → 53 icons
All top-50 famous signers now have their seated editorial 'worn' card in the SEO
lookbook (was just the original 10). Generated from the ranked list + live feed
data (name, qid, death year, signature, license), matched to the campaign slugs.
Each card + lightbox links to its /wear product page. Headline/meta updated.
Verified 53 cards render, 0 JS errors.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8322ca0 · 2026-09-09 · wear: fix stale ink-color fallback in reconcile-wear-orders.mjs + its test
test/wear-artwork-flow.test.mjs (committed 07:58 today) asserted the old
fixed #f5f3ee recolor tint. Commit 18cca456 (16:13 today) deliberately
changed server.js's dark-cloth fallback to #ffffff to match the on-shirt
preview's inkHexFor() exactly — but the test was never updated, so it was
failing on HEAD (verified via git blame: the two commits are unrelated,
the test simply predates the ink-choice feature).

Root-caused by reading both implementations rather than guessing:
server.js's #ffffff is correct/intentional (matches public/wear.html's
inkHexFor, "dark cloth, no pick → white"); the old #f5f3ee was pre-feature
scaffolding. So the fix is NOT touching server.js — it's:

1. scripts/reconcile-wear-orders.mjs: renamed recolorSignatureToLight() ->
   recolorSignatureInk(imageUrl, hex) and added safeInkHex(), mirroring
   server.js's current signature/cache-key/fallback exactly (was still on
   the pre-buyer-choice, fixed-#f5f3ee version — the two producers had
   drifted out of parity since the ink-color feature landed).
2. test/wear-artwork-flow.test.mjs: updated the two stale pixel assertions
   from #F5F3EE(FF/00) to #FFFFFF(FF/00) to match current intended
   behavior.

Verified: both producer subtests (success + reconciler) now pass; node
--check clean. Did not touch server.js, public/index.html, or the
unrelated wear-accessories.test.mjs failures (separate, pre-existing,
in another session's active hat/accessory work).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
71f5347 · 2026-09-09 · wear: surface the Signature Edit — ✦ badge + 'Signature Edit first' sort
The 52 signers with a seated editorial 'worn' shot were buried among 2,955 in the
grid. Now a subtle ✦ star + green outline marks them, and a new sort option
brings them to the top so shoppers can find the premium lookbook content. Keyed
off the same exact worn-shot map (no false badges). 0 errors, verified.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
cb3ba6f · 2026-09-09 · wear: map Michelangelo Buonarroti → campaign-michelangelo.jpg (same-person dup record)
The catalog has two Michelangelo records ('Michelangelo' + 'Michelangelo
Buonarroti'); both are the same artist so both should show the worn shot. Added
the name variant. (Napoleon III / Rembrandt Peale / Dumas fils / the George
Washington-named people are DIFFERENT people and stay correctly excluded.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ced4cca · 2026-09-09 · wear: map worn-shot by EXACT signer name, not surname — kills wrong-celebrity collisions
Surname auto-detect would show campaign-adams.jpg (John Quincy Adams) on all 10
other Adams pages (John/Samuel/Abigail...), Napoleon's shot on Napoleon III,
Hugo's on Hugo Grotius, Louis XIV's on France Prešeren, etc. — the WRONG person's
editorial photo. Replaced with an exact full-name→slug map of the definitive
top-50 (+ existing); anyone not listed shows the normal garment mockup. Still
probes the file (may not be generated yet) and self-surfaces as shots land.
Verified: Darwin/Napoleon show, Abigail Adams/Napoleon III show nothing, 0 errors.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
a0253a8 · 2026-09-09 · wear: 43 worn editorial campaign shots for top-signer roster (TK-10286)
Each historical signer seated editorial in our white bucket hat + tee + crew
socks, garments carrying a cursive signature — matches the Einstein bar.
flux-kontext text-to-image with front-loaded per-figure features. Assets only;
wear.html auto-detects campaign-<slug>.jpg. Likeness approximate for non-iconic
figures (text-to-image ceiling). Cost $1.72 (43 imgs).
22b0eba · 2026-09-09 · wear: accent-fold worn-shot slug candidates (Velázquez→velazquez, Molière→moliere)
The auto-detect stripped accents to nothing (velázquez→velzquez), so accented-name
shots would never surface. Normalize NFD + strip diacritics first, matching the
pipeline's transliterated campaign-<slug>.jpg filenames. Verified across the
accented top-50 names. Display-only, reversible.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d8381ce · 2026-09-09 · wear: auto-detect campaign-<slug>.jpg for the 'worn' shot instead of a hardcoded map
Per peer coordination (celebritysignatures-e9 owns generation + naming): derive
slug candidates from the signer's name (surname / joined last-two / full / first,
+ overrides for vangogh & frida) and probe which campaign-<slug>.jpg exists, so
every shot the pipeline generates (Shakespeare, da Vinci, Goethe, … the top 50)
surfaces on its product page automatically with no code change. Fixes Lincoln to
use campaign-lincoln.jpg (was pointing at -seated). Verified Darwin/Lincoln worn,
Shakespeare no-shot, 0 errors. Local only, not deployed. Reverse: git revert HEAD.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
523cb04 · 2026-09-09 · wear: 'See it worn' — feature each celebrity's seated editorial shot on their product page
For signers who have an AI 'seated in the full Signature Edit' campaign photo
(currently Darwin, Franklin, Lincoln, Michelangelo, Napoleon, Van Gogh among the
wear-eligible), the /wear product modal now leads with that editorial 'worn' shot
(the person in the signed hat + tee + socks) with a 'See on garment' toggle back
to the interactive mockup. Signers without a shot are unchanged (flat mockup, no
toggle) — verified both paths, 0 console errors. Display-only, reversible; NOT
deployed (overnight gate). Reverse: git revert this commit.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7489d97 · 2026-09-09 · signatures: serve the full-resolution original (vector SVG / native raster), not a downsampled thumb
Steve: 'high res'. resolveSource returned Wikimedia's 1200px PNG thumbnail — which
also rasterizes SVGs, throwing away vector sharpness. Now prefer info.url (the
original file): SVGs render as VECTOR (crisp at any size), rasters at full native
resolution. Signature files are small so full-res is cheap; thumb stays a fallback.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
6adf104 · 2026-09-09 · wear: raise crew-socks price $22 → $28 to clear cost/markup floor (TK-10286)
Crew Socks was priced $22, which at reference blank cost ~$11-16 fell below
Steve's cost/0.65/0.85 markup floor (only ~1.4-1.7x). $28 clears it comfortably.
Bucket Hat left at $32 (healthy ~2x vs ~$13-17 reference cost). Exact Printify
cost unverified — Printify does not expose blank cost read-only; run
scripts/printify-cost-check.mjs for precision.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
18cca45 · 2026-09-09 · signatures: show TRUE source colors, crisp — drop the invented per-signer recoloring
Steve: 'make all signatures original colors, not all diff colors on index page'
(+ a green box on the shirt, + blurry). Root causes & fixes:

- Gallery/detail (signature-preview): render the ORIGINAL resolved image directly
  instead of the canvas-normalized copy. SVGs stay vector (crisp at any size) and
  every signature keeps its true source colors — no more raster blur, no rainbow.
- Shirt (wear canvas): DEFAULT is now the original art (multiply drops the white
  ground, shows true colors) — no recolor. The green box was recolorInk's source-in
  fill painting every opaque pixel of a white-bg source; recolorInk now thresholds
  (ink→color, background→transparent) so a buyer's chosen color / white-on-dark
  colors only the strokes. 3D decal uses a matching knockoutWhite for the original.
- Print (server): recolor only when the buyer picked a color or the cloth is dark;
  otherwise keep the original art.
- Ink control default is now 'Original' (the signature's own colors); presets +
  Custom remain for buyers who want a specific color.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
68dd99d · 2026-09-09 · wear: full Signature Edit campaign hero — Lincoln seated in hat+tee+socks
Replaced the bust campaign hero with the full-edit seated shot: real O-77 portrait
face composited in Photoshop onto a generated seated body (kontext, $0.12 total
this thread), craggy AI face removed; our exact 1862 signature composited onto the
bucket hat, tee chest, and both socks; garbled AI text blurred out. Campaign copy
updated to 'the full Signature Edit'. (index.html swap on disk; ships on deploy.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
47a6363 · 2026-09-09 · wear: make Bucket Hat ($32) + Crew Socks ($22) sellable — Lincoln campaign look (TK-10286)
Bucket Hat (bp1698/provider99, Bone/One size 116655) and Crew Socks
(bp2941/provider29, White/One size 155679) were Printify-mapped but held
(saleEnabled:false, priceUsd:null). Set saleEnabled:true + priceUsd. Socks
printPositions (left_leg/right_leg) were already set by codex-run-10286;
hat printPosition (front) already set. Prices are category defaults — NOT
cost-verified (Printify exposes blank cost only on a created product, which
is gated). Classic/Pocket/Polo + Dad/Trucker caps + AOP shirts untouched.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
08f3529 · 2026-09-09 · wear: buyer-adjustable signature ink + Node-ported color for the printed art
UI: a SIGNATURE INK control on the /wear product — Auto (the signer's own color,
white on dark cloth) + 7 curated inks + a Custom… full picker. The pick drives
the live shirt preview (inkHexFor honors the override) and rides the cart →
checkout → order item (validated server-side).

Print: ported inkColorForHue to server.js (identical FNV+HSL+WCAG-3:1 output,
verified against the client), generalized recolorSignatureToLight →
recolorSignatureInk(url, hex), and the POD draft now bakes the resolved ink into
the printed art — buyer's pick, else white on dark / signer color on light —
matching the preview. Client ink is strictly validated (#rrggbb) before it can
reach ImageMagick -fill.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
b5ebc16 · 2026-09-09 · signature-size: make the mobile grid slider actually resize signatures
The mobile @media block hardcoded .sig height:96px, overriding the --sig-h
var, so the "Signature size" slider (reachable via the ☰ drawer on phones)
saved the pref but never changed tile size. Use var(--sig-h,96px) so mobile
matches desktop. Verified headless: mobile grid 96px -> 172px.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5acdc48 · 2026-09-09 · wear: on-shirt signature uses the signer's color on light cloth, white on dark
Extend the distinct per-signer color to the garment mockup (2D canvas, AOP tile,
and 3D decal): recolor the ink to the signer's own color on light colorways
(composited via multiply so fabric shading still reads), and to pure white on
dark colorways (source-over) where a dark color would be invisible. Generalizes
recolorToLight(img) -> recolorInk(img,hex); a small module bridge exposes the
shared inkColorFor() to the classic canvas script so shirt and swatch match.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
a272fad · 2026-09-09 · wear: Lincoln-in-exact-tee campaign hero (kontext-fit, real product preserved)
Photoshop-placed our real Signature Tee on Lincoln's public-domain O-77 portrait,
content-aware-filled the suit remnants, then one flux-kontext image-EDIT ($0.04,
logged) added his neck/shoulders so he genuinely wears it — his face + our exact
tee + chest signature preserved (edit, not recreate). Campaign section now points
at /assets/campaign-lincoln-tee.jpg with an honest 'digitally composed, not a
photograph' line. (index.html campaign swap is on disk; ships on deploy.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
3a772dc · 2026-09-09 · signatures: render each signer in a distinct, WCAG-legible color on clean white
Route every signature swatch (gallery, /wear, murals rosters, games, detail +
evolution panels) through the shared signature-preview component so the ink is
painted in a stable per-signer color on a clean white ground instead of black
ink on cream. Color keyed on qid (unique per signer) with a name fallback.

normalizeInk() takes an optional ink triple; inkColorForHue() guarantees every
hue clears WCAG 3:1 non-text contrast on white by darkening lightness only as
much as needed (fixes the ~10% olive/yellow dead zone). Fallback path (CORS-
denied source, ~0.06% of the feed) instrumented via window.signatureRenderStats.
Tests: 360-hue WCAG sweep + color-path assertions (7/7).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
6a759ce · 2026-09-09 · game/murals/wear: render cleaned colored-ink signatures via shared preview
Wire the signature-preview.css + signature-preview.js component into the game,
murals, and wear pages so their signatures get the same white-ground / colored-
ink cleanup as the gallery. Depends on the signature-ink.js crash fix.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014ikfY9DhpMDXkpNRpb5ufG
5499131 · 2026-09-09 · signatures: permanently exclude Q352 (brand safety) from every surface
Filters the QID from mergedSignatures() so it never appears in feed, grid,
wear, or sitemap.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014ikfY9DhpMDXkpNRpb5ufG
abc8f51 · 2026-09-09 · signature-viewer: fix ink-collision crash + add user-adjustable signature size
- signature-ink.js: rename the pixel counter (was `let ink` shadowing the
  `ink` color param) → hard SyntaxError that broke the whole preview module.
  The broken build had shipped to prod; unit test now 5/5, module chain parses.
- New size controls (both surfaces): a "Signature size" slider resizes gallery
  tile signatures (--sig-h); a −/+/Reset stepper resizes the popup preview
  (--ap-sig-h). Both persist in localStorage prefs; null keeps the responsive
  default. Verified headless on desktop + mobile.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014ikfY9DhpMDXkpNRpb5ufG
d2c9573 · 2026-09-09 · signature-edit: click any icon opens a lightbox of the full in-outfit look
Clicking a card image or name opens a modal showing the full campaign image
(person in the signature outfit) + their real signature + shop/source links.
Keeps the crawlable /a/Q link for SEO (JS intercepts the click).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U2uvgXWs4FjLd6eDBDNUxP
936d27e · 2026-09-09 · signature-edit: regenerate the 9 figures with distinct poses + backdrops
Each icon now has a unique pose (leaning, standing, arms-crossed, contemplative,
etc.) and a different studio backdrop shade, so the lookbook no longer reads as
one shot repeated. Products + real signatures + likeness unchanged. Lincoln kept
as-is (its composition drives the home-page text overlay).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U2uvgXWs4FjLd6eDBDNUxP
19dfb15 · 2026-09-09 · signature-edit: new SEO lookbook page — 10 icons in the Signature Edit
New /signature-edit page (route + sitemap in server.js): 10 famous public-domain
figures (Lincoln, Einstein, Van Gogh, Picasso, Frida Kahlo, Napoleon, Franklin,
Twain, Darwin, Michelangelo) each seated in the signature products, with their
REAL Wikimedia signature + attribution + /a/Q link. Person ItemList JSON-LD,
canonical, OG. Front-page 'Shop the Lincoln edit' now links here.
Only deceased/public-domain figures used (likeness + never-invent rules).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U2uvgXWs4FjLd6eDBDNUxP
dc24bda · 2026-09-09 · campaign: regenerate Lincoln image — natural eyes/expression (was distorted)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U2uvgXWs4FjLd6eDBDNUxP
01e407c · 2026-09-09 · wear: fix Lincoln sock signature — flat/horizontal at the cuff, not rotated up the shin
Steve flagged the live front-page "Signature Socks" card: the signature was
rotated ~90° and ran vertically up the shin. Recomposited from the clean base
(crew-socks-white.jpg) with the signature flat and horizontal, small, at the
sock's cuff/ankle — matching how it sits on the tee's chest. Same source
asset (Wikimedia 1862 signature), no re-generation, $0 local. Reversible.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Scv6ymMnvxhwETzTMdobqJ
0355907 · 2026-09-09 · campaign: overlay text on the photo's open area + signature on all products
- Text (Signed, Mr. Lincoln + copy) now overlays the left negative space of
  the image with a soft ivory scrim (dark ink); mobile falls back to a dark band.
- Regenerated campaign-lincoln.jpg so the hat, tee, and socks all carry the
  signature (were blank).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U2uvgXWs4FjLd6eDBDNUxP
f757861 · 2026-09-09 · front page: flip sections — campaign (seated Lincoln) leads, hero follows
Per Steve: swap section order so the full-width seated-Lincoln campaign image
is the first thing under the masthead, with the 'Wear a piece of history'
editorial hero below it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U2uvgXWs4FjLd6eDBDNUxP
62fab0c · 2026-09-09 · front page: stack the campaign section — image on top, text below
Per Steve: campaign band goes from side-by-side (image left/text right) to
stacked full-width image on top of the dark text band. Local build; deploying.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U2uvgXWs4FjLd6eDBDNUxP
2a4de6d · 2026-09-09 · wear: put Abraham Lincoln's signature on the ACTUAL product images (Signature Edit)
The front-page Signature Edit trio showed blank products while the copy said the
autograph 'runs through every thread'. Composited Lincoln's real 1862 signature
(public-domain, Wikimedia) onto the actual product photos — tee/polo/pocket at the
chest, dad/trucker/bucket caps centered front, socks up the leg, and the two AOP
shirts all-over — producing real signed product images (<garment>-lincoln.jpg).
Swapped the front-page edit-trio (tee/hat/socks) to the signed versions. $0 local
compositing, no image-gen spend. Reversible.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013oMdD46CVyPsuM6JUoiea7
f4f8745 · 2026-09-09 · front page: Gucci-style Signature Edit hero — No. 001 Abraham Lincoln
Redesign public/index.html hero into an editorial 'Signature Edit': real
public-domain Lincoln signature (Wikimedia, attributed, links to /a/Q91) +
the 3 real wear blanks (tee/hat/socks) + softened hero-bg. Adds a clearly
labeled AI 'campaign' accent (Lincoln dressed in the products; not a photo).
Preserves all existing hooks (burger/drawer/grid/sort/artistPop/api fetch).
Honors the project's never-invent-a-signature rule. Local only; not deployed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U2uvgXWs4FjLd6eDBDNUxP
3693ec3 · 2026-09-09 · wear: add all-over-print signature shirts (camp button-up + long-sleeve) — TK-10286
Steve's reference was a button-up covered edge-to-edge in tone-on-tone signature
script; add it as product options. POD reality: Printify AOP cut-and-sew,
sublimation (printed tone-on-tone, not woven jacquard). Two blueprints:
 - Signature Camp Shirt  = #1533 (MWW On Demand), short-sleeve button-up
 - Signature Long-Sleeve = #1261 (Miami Sublimation), pullover
New AOP render path in wear.html (paintAllover): tiles the selected signature
edge-to-edge, staggered + tone-on-tone, clipped to the garment silhouette via a
background-keyed mask (threshold 80 + 3px erode = no off-fabric bleed). Bases are
the official blank flat-lay front mockups. saleEnabled:false / priceUsd:null until
Printify config + go-live (TK-10286 Steve gate); real variant IDs recorded.
Verified live in-browser (verification/live-aop-*.jpg), zero console errors.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013oMdD46CVyPsuM6JUoiea7
a70566c · 2026-09-09 · wear: add typeahead search across the top of the signature picker
Full-width search bar above the grid that (a) live-filters the 2,955-signature
grid as you type (name + category) with the count + empty-state updating, and
(b) drops an autocomplete list of the top ranked matches (word-start > substring,
match highlighted, thumbnail + category) that you can click or arrow-key +Enter
to jump straight to the product. Escape/blur closes it; × clears. Pure client-side
addition to wear.html, no server change.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013oMdD46CVyPsuM6JUoiea7
ac773c5 · 2026-09-09 · wear: front-facing hats + centered signature; remove YOUR DESIGN placeholder (TK-10286)
Dad Cap / Trucker Cap / Bucket Hat previews were rendering on ANGLED on-model
lifestyle photos, so a centered front decal was geometrically impossible (the
earlier curve/rotation overlay hacks were compensating for that). Rebased each
hat on a true front-facing Printify view; inpainted the 'YOUR DESIGN(/HERE)'
placeholder off the dad+trucker front panels; used the clean blank front bucket.
Reset overlayBox to a centered front print box (center x=1024=image center) and
removed curve+rotation. Bucket colorway Army->White to match the only
front-facing asset (preview-only; saleEnabled stays false). Proofs in verification/.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013oMdD46CVyPsuM6JUoiea7
178086a · 2026-09-09 · wear: curve-warp hat signature overlays + fix dad-cap/bucket-hat placement (TK-10286)
Per /dtd (4/4 unanimous B): graphic-designer review flagged flat
rectangle overlays on curved cap crowns read as pasted stickers rather
than real DTF/embroidery prints. paintSignatures() now optionally
slices the signature into thin vertical strips and bends each along a
parabola (ob.curve, px) when a garment box declares one — cheap,
canvas-only, no 3D pipeline. Applied per-hat (trucker:6, dad-cap:14,
bucket-hat:18, matched to each crown's actual curvature).

Also fixed the two placement issues the same review caught: dad-cap
overlayBox was too close to the bill seam (y:705->640, h:150->130);
bucket-hat's right edge landed on the crown's ventilation grommet
(x:860->780). Verified via Playwright screenshots against local pm2 —
all three hats now centered, curved, and clear of seams/hardware.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AmxcNKtFg77wP47uZq5Zsm
a15a0cd · 2026-09-09 · wear: re-center trucker-cap signature overlay (TK-10286)
Steve flagged live that the signature sat low, overlapping the mesh
side seam instead of centered on the solid front panel. Pixel-verified
against the actual on-model photo (overlaid a debug rectangle, compared
before/after) rather than guessing: x:765,y:560,w:570,h:160 ->
x:955,y:500,w:450,h:140. Checked dad-cap and bucket-hat the same way —
both already reasonably centered, left unchanged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AmxcNKtFg77wP47uZq5Zsm
7648991 · 2026-09-09 · wear: hover-to-zoom 3x lens on the signature only (TK-10286)
Only activates over the printed signature (not the whole garment), and
repaints fresh from the source photo + signature images at the zoomed
resolution instead of CSS-scaling the already-rendered canvas (which
just stretched existing pixels and looked blurry). Zoom level adapts
per garment box so wide signatures never clip out of the lens.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AmxcNKtFg77wP47uZq5Zsm
f19730e · 2026-09-09 · homepage: tighten gallery card UI + wire real mural/clothing purchase links (TK-10286)
Two coordinated changes landed together (claude-run-10286 + codex-run-10286,
same session, real-time a2a via the ticket system after a genuine file-write
race on public/index.html — reconciled rather than reverted):

1. Card UI tightening (Steve's direct ask, screenshot-driven): grid gap
   18px->10px, .sig image area 120px->88px, .meta padding 11px/13px->6px/8px,
   .name forced single-line (white-space:nowrap + ellipsis, was wrapping to
   2 lines for longer names like "Mustafa Kemal Atatürk"). Verified via a
   real Playwright screenshot at /?cat=Politics — names fit one row, padding
   visibly tighter.

2. Real mural/clothing purchase links, wired end-to-end (Steve separately
   steered codex-run-10286: the Politics homepage had no visible /wear links
   and mural CTAs were buried in a modal): new signatureShopLinks() helper
   generates qid-carrying links to /murals?qid=...#finder and /wear?qid=...,
   rendered as a .shop-actions button pair on every card, in the artist
   detail popup (.ap-shop), the masthead nav, hero CTAs, and the drawer.
   public/wear.html and public/murals.html got matching boot-time hooks that
   read ?qid=/?name= and either open that signature's configurator directly
   (wear: only if it passes the same wearEligible() gate server.js enforces
   — shows a graceful "not available on clothing" notice otherwise) or
   preselect it in the mural finder/roster.

An earlier icon-based approach (🖼️/👕 badges + a client-side
wearEligibleClient() mirror) was built independently by claude-run-10286
for the same "signal what's purchasable" goal, then removed once
signatureShopLinks()'s real deep-linking buttons landed — redundant with,
and less functional than, working links.

Verified: all 3 files' inline script blocks parse clean. codex-run-10286
ran desktop+mobile Playwright E2E (verification/gallery-shopping.e2e.cjs,
verification/e2e-proof.json) covering the full click-through journey.
claude-run-10286 verified the card tightening visually via a fresh
screenshot. Not deployed — held for explicit Steve go per the standing
deploy gate.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AmxcNKtFg77wP47uZq5Zsm
2dd7c66 · 2026-09-09 · wear: persist sort selection to localStorage, matching density (TK-10286)
Caught by codex-run-10286 (a2a, also active on this ticket) — density
already persisted (wear_cols) but sort never did, missing the standing
sort+density rule's persistence requirement. Added wear_sort localStorage
key, saved on change, restored on boot alongside the existing density
restore. Verified via Playwright: select a sort, reload, value persists.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AmxcNKtFg77wP47uZq5Zsm
c9d72f3 · 2026-09-09 · wear: fix recolored signature URL being relative, not absolute (TK-10286)
Real bug caught via a2a by codex-run-10286 (also actively on this ticket) —
recolorSignatureToLight() returned a RELATIVE path
(/assets/recolored-signatures/<hash>.png), set directly as
draft.design_image_url. That flows straight into
submit-pod-draft-printify.mjs's buildPayload() as images[0].src, which
Printify fetches from the public internet — a relative path would have
failed there (or worse, resolved against whatever base the fetcher assumes).
Both the cache-hit AND cache-miss return paths had the bug.

Fixed in both places that build this URL (server.js, and the duplicate in
reconcile-wear-orders.mjs — same reasoning already applied to
extraPrintAreas' imageUrl in submit-pod-draft-printify.mjs, which already
prefixes with the site origin): added WEAR_SITE_ORIGIN and prefixed both
return points. Verified the function now returns a proper
https://celebsignatures.com/... URL.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AmxcNKtFg77wP47uZq5Zsm
c2a79ec · 2026-09-09 · wear: independent Stripe live switch — allows one test order before real money (TK-10286)
Steve wants a real test order through /wear before it charges real cards.
Critical finding that made this necessary: Kamatera's .env already has
STRIPE_LIVE_ENABLED=1 set (murals/downloads use it) with a real live key
present. /wear's checkout previously shared STRIPE_MURAL_KEY, so the moment
WEAR_SALES_LIVE=1 landed, it would have charged REAL cards immediately —
zero chance to place a test order first.

Added WEAR_STRIPE_LIVE_ENABLED as wear's own independent live switch,
completely separate from STRIPE_LIVE_ENABLED. New WEAR_STRIPE_KEY /
WEAR_STRIPE_MODE resolvers (same shape as the existing STRIPE_MURAL_KEY /
STRIPE_DOWNLOAD_KEY per-flow pattern already in this file for exactly this
kind of reason — downloads stay pinned to test until a payout mechanism
exists). Swapped both /api/wear-checkout and /wear-success off
STRIPE_MURAL_KEY/STRIPE_MODE onto the new wear-specific ones. Applied the
same fix to reconcile-wear-orders.mjs's resolveStripeKey().

This means Steve can now set WEAR_SALES_LIVE=1 + WEAR_POD_PROVIDER=printify +
PRINTIFY_SHOP_ID + PRINTIFY_MANUAL_APPROVAL_CONFIRMED=1 — making checkout,
Printify, and the cart fully functional — while WEAR_STRIPE_LIVE_ENABLED
stays unset, so it still charges the TEST key. Place one real test order
end-to-end, then flip WEAR_STRIPE_LIVE_ENABLED=1 as the final, deliberate
step to real money.

Verified by faking the exact production condition locally (STRIPE_LIVE_
ENABLED=1 + WEAR_SALES_LIVE=1, WEAR_STRIPE_LIVE_ENABLED unset): checkout
correctly returned a cs_test_ session despite the shared flag being live,
with the startup log clearly showing the split ("STRIPE LIVE MODE — murals
charge REAL cards" vs "Wear apparel: Stripe test mode, independent of the
murals live flag"). Also verified WEAR_STRIPE_LIVE_ENABLED=1 correctly flips
wear to live mode on its own. Test order cleaned from the gitignored
wear-orders.json afterward. Real (unfaked) local environment re-confirmed
still fully gated off.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AmxcNKtFg77wP47uZq5Zsm
f2976c0 · 2026-09-09 · wear: use 'convert' not 'magick' — prod box only has ImageMagick 6 (TK-10286)
Caught right after deploying 9f1ba52: SSH'd into Kamatera to verify the
black-print recolor fix would actually work there, and 'which magick' came
back empty — only 'convert' (ImageMagick 6) is installed. My local dev
machine has IMv7's 'magick' unified CLI, which made the gap invisible until
checked. Would have failed open (the try/catch falls back to the original
unrecolored image) rather than crash anything, but the actual fix wouldn't
have worked in production — worth catching before it needed a real dark-
garment order to surface.

Switched both call sites (server.js, reconcile-wear-orders.mjs) to spawn
'convert' instead — verified present and working with identical output on
both this Mac and Kamatera (same recolor command, same result, 'convert' is
just deprecated-but-functional under IMv7 too, only a stderr warning).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AmxcNKtFg77wP47uZq5Zsm
452cc4c · 2026-09-08 · wear: update stale KNOWN ISSUE notes now that the black-print fix landed (TK-10286)
Documentation-only follow-up to 9f1ba52.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AmxcNKtFg77wP47uZq5Zsm
9f1ba52 · 2026-09-08 · wear: fix the black-garment print contrast bug for real (TK-10286)
Resumes the standing KNOWN ISSUE noted in wear-templates.json since the
2026-09-08 verification session: Printify prints a design's own pixel colors
as-is (no auto-recolor for dark garments), so the black polo's dark-ink
signature printed as low-contrast dark-gray-on-black on the REAL product —
confirmed visually earlier this session, never fixed until now.

Added recolorSignatureToLight() in server.js (and the same logic duplicated
in scripts/reconcile-wear-orders.mjs, which has its own independent draft-
creation path) — shells out to ImageMagick (already on this box) via stdin/
stdout piping, no temp files: `magick -background none - -channel RGB -fill
#f5f3ee -colorize 100% png:-`. This recolors every opaque pixel to a light
ink while preserving the alpha channel exactly (mirrors the client-side
canvas recolorToLight() used in the on-site preview and the 3D decal).
Handles both PNG and SVG signature sources (needed -background none — without
it, ImageMagick's default SVG rasterization fills a white background instead
of preserving transparency, verified by testing both formats). Cached by a
hash of the source URL under public/assets/recolored-signatures/ (gitignored
— regenerable, not something to track) so a re-ordered signature isn't
reprocessed. Fails open: any error (magick missing, fetch failure, an 8s
timeout) falls back to the original image rather than blocking order/draft
creation — a low-contrast print is a quality issue, not a reason to lose the
customer's order record.

Wired into both draft-creation paths (/wear-success and
reconcile-wear-orders.mjs): for each cart line item, look up its garment+
color's hex from wear-templates.json, and if luminance < 0.4 (dark), recolor
before setting design_image_url on the draft.

Verified the actual fix, not just the mechanism: recolored a real signature,
uploaded it to Printify, and rendered a real throwaway draft product on the
black polo — the signature is now clearly legible (light ink) instead of the
low-contrast dark-gray from the original verification. Deleted immediately
after. Also verified the recolor pipeline handles SVG-sourced signatures
correctly (transparency preserved) and that reconcile-wear-orders.mjs still
runs clean against the existing test order. Local E2E re-confirmed sales
still fully gated off (comingSoon:true) afterward.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AmxcNKtFg77wP47uZq5Zsm
bda7296 · 2026-09-08 · wear: real rotatable 3D viewer for the classic tee (Three.js) — TK-10286
Steve: "show each shirt with blender and three.js". Blender isn't installed
and there's no from-scratch 3D garment model — building one with correct
cloth draping + UV-mapped print area is genuine 3D-artist work, not a script.
Used the practical path instead: a free, MIT-licensed, pre-made crew-neck
tee model (Starklord17/threejs-t-shirt on GitHub — itself the well-known
"JS Mastery 3D T-shirt customizer" tutorial asset by Anderson Mancini + Paul
Henschel), loaded in Three.js with real rotation, live garment-color swap,
and the signature applied as a DecalGeometry projected onto the mesh at the
model's own standard chest-decal placement.

Scoped to classic-tee ONLY — it's a generic crew-neck shape, wrong for the
polo (no collar) and pocket-tee (no pocket), and no matching free model was
found for those. Showing the wrong silhouette would be worse than no 3D view,
so the "View in 3D" toggle only appears for classic-tee; switching to another
garment while in 3D mode falls back to the real photo automatically.

Hit and fixed 2 real integration bugs during verification:
1. The addon modules (GLTFLoader/OrbitControls/DecalGeometry) do bare
   `import ... from 'three'` internally, which a plain dynamic import() of a
   CDN URL can't resolve — added an <script type="importmap"> mapping
   "three" and "three/addons/" to the CDN, verified via Playwright that this
   is what actually made the modules load (the error before the fix was
   caught, not silent).
2. Drawing the (cross-origin, Wikimedia-hosted) signature image onto the
   decal's offscreen canvas tainted it, throwing a WebGL SecurityError on
   texSubImage2D — verified Wikimedia serves permissive CORS
   (access-control-allow-origin: *) and set sigImg.crossOrigin='anonymous'
   to fix it. Only affects the new 3D path; the existing 2D canvas never
   reads pixels back so it needed no CORS handling.

Verified end-to-end via Playwright: 3D toggle appears for classic-tee, loads
and renders the real 3D model with the signature decal visible on the chest,
drag-to-rotate works, switching colors while in 3D mode updates the garment
color live, and switching to polo correctly hides the toggle and falls back
to the 2D photo — 0 console errors throughout (after both fixes). Checkout
re-verified still fully gated off (comingSoon:true) afterward.

The shirt_baked.glb model itself (1.0MB, MIT-licensed) was already captured
by this repo's auto-data-snapshot automation before this commit.

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

File tree

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

Other build journals

← Bertha  ·  all 4 projects  ·  ClawCoder →

Export

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

rendered in 22ms