Crazy News Channel Shadowman

repo: ~/Projects/crazy-news-channel-shadowman · 108 commits · 0 in last 24h, 108 in last 7d · ▁█▂

Search the build

108 commits indexed

  1. c3b7dd0 2026-09-25 TK-12241: Shadow Man gallery page on the Cartoon Desk (approved pieces only)
  2. 9c5d41b 2026-09-25 auto-data-snapshot: 2026-09-25T10:22:25 (2 data files) — .claude/worktrees/agent-a1b66befdca443faf .claude/worktrees/eyes-top-left
  3. 8ef5d98 2026-09-25 p24 daily-cartoons: docs for article-driven, still-image-by-default pipeline
  4. fb5ea85 2026-09-25 p24 daily-cartoons: review queue shows linked article, renders cleanly without clips
  5. 0b40f82 2026-09-25 p24 daily-cartoons: approve.py defaults --story-id from meta.json, links source article
  6. b8bc8d0 2026-09-25 p24 daily-cartoons: generate cartoons from real articles, still image by default (TK-12237)
  7. dee75b4 2026-09-25 auto-data-snapshot: 2026-09-25T09:51:23 (1 data files) — .claude/worktrees/agent-adeaa4f0116149a98
  8. 8d0d7a9 2026-09-25 p24: cover the fake artist signature the image model painted into 5 daily-queue posters (undo: git revert)
  9. 391456a 2026-09-25 snapshot before merging one-stylesheet + name-scrub branch
  10. 5743111 2026-09-25 p24: drop stale manifest entry for deleted filibuster-marathon page
  11. 04b770b 2026-09-25 p24: scrub every mention of Paul Conrad / Conrad per Steve's standing rule
  12. 010df2d 2026-09-25 auto-data-snapshot: 2026-09-25T09:20:47 (1 data files) — .claude/worktrees/agent-adeaa4f0116149a98
  13. 3619366 2026-09-25 p24: fix cartoon-page generators to emit zero inline styles going forward
  14. f3c1a2d 2026-09-25 p24: move all 22 cartoon-strip pages + the reference page onto the shared stylesheet
  15. 455c6ee 2026-09-25 p24: move index.html's 9 inline style="..." attrs into style.css classes
  16. d12e5a2 2026-09-25 p24: remove per-category mood palette swap and per-strip dark toggle from style.css
  17. e22509c 2026-09-25 auto-data-snapshot: 2026-09-25T07:42:43 (4 data files) — daily-cartoons/queue/2026-09-25/bureaucrats-and-bubbles/meta.json daily-cartoons/queue/2026-09-25/infinite-scroll/meta.json daily-cartoons/queue/2026-09-25/senator-s-shadow-war/meta.json daily-cartoons/queue/2026-09-25/tech-tyrant/meta.json
  18. 688391d 2026-09-25 auto-data-snapshot: 2026-09-25T04:07:37 (2 data files) — cartoons/queue/2026-09-25.json yolo/cartoon-batch-log.jsonl
  19. 523729e 2026-09-25 auto-data-snapshot: 2026-09-25T02:36:15 (1 data files) — cartoons/queue/2026-09-25.json
  20. 9c016cc 2026-09-24 cartoon shorts: first 5 public Satire Shorts posted to All News Daily (TK-12191)
  21. e0ca704 2026-09-24 auto-data-snapshot: 2026-09-24T15:53:39 (3 data files) — cartoons/shorts-ledger.json yolo/cartoon-shorts-log.jsonl yolo/tk12191-shorts-hook.patch
  22. 9abf345 2026-09-24 daily cartoon batch: post new cartoons as public Satire Shorts, max 5/day (TK-12191)
  23. 89ae98f 2026-09-24 cartoon shorts: transparent SATIRE badge (no white box), kicker below badge, caption tucked under image (TK-12191)
  24. ce98d61 2026-09-24 Add make-cartoon-shorts.mjs: turn each P24 cartoon into a vertical YouTube Short
  25. 2d4bee0 2026-09-24 Add googly eyes (/eyes skill) pinned bottom-right above the ticker, pointer-events none
  26. bd41b0b 2026-09-24 P24 cartoon batch: build one at a time (no parallel rate-limit risk), start 5:15 ET (2:15 PT) to post by 6:30 ET, 15-min per-build timeout
  27. 7b23cb1 2026-09-24 P24 cartoon batch: 6:00 ET start (3:00 PT), build all briefs in parallel to post by 6:30 ET; parent registers manifest/stories + commits (keeps story_id + tags rules)
  28. 2a7fdfb 2026-09-24 auto-data-snapshot: 2026-09-24T15:23:04 (2 data files) — scripts/com.steve.p24-cartoons-daily.plist yolo/cartoon-batch-log.jsonl
  29. 33a362f 2026-09-24 P24 daily-cartoons: Ollama concepts + flux-schnell poster + WAN 2.2 clip into local review queue, $1/day cost cap (TK-12153)
  30. dc17f16 2026-09-24 reschedule P24 daily cartoon batch: 9:15 AM → 3:30 AM
  31. 0f638f4 2026-09-24 cleanup: remove filibuster-marathon (duplicate of Cloture o'Clock) + test scratch files
  32. e224274 2026-09-24 gitignore: cover shots*/ , _tmp-*/ , cartoons/_shot-*.png
  33. b6a6016 2026-09-24 P24: every category page uses the same photo-card layout as the front page (retire newspaper-mode)
  34. 318cde7 2026-09-24 P24: add article tags on every post, with a clickable #tag= filter + tag cloud
  35. 6765454 2026-09-24 auto-data-snapshot: 2026-09-24T13:51:00 (1 data files) — cta/cta3-video-results.json
  36. 4c712f2 2026-09-24 Fix P24 cartoon video: pull <video> out of the <a> wrapper, clear ticker overlap
  37. 7bf67a3 2026-09-24 Animated Filibuster Marathon on P24 front page (WAN 2.2 i2v, ~$0.20)
  38. 6481269 2026-09-24 Unify P24 stylesheet: shared external CSS across front page, cartoon gallery, and all 18 strip pages
  39. c130b62 2026-09-24 Backfill story_id links for 9 orphaned cartoons + codify link-to-article rule
  40. dff6f9f 2026-09-24 P24: add Paul Conrad style reference (Masters page + device toolbox) and 3 Conrad-manner strips (meter mayor, corn marshal, toll treadmill)
  41. e2f9f7b 2026-09-24 Add Paul Conrad style-reference page for P24 Political Cartoon Desk
  42. 122888f 2026-09-24 Feature Conrad-style Filibuster Marathon ink cartoon on P24 front page
  43. edcd6b3 2026-09-24 Add filibuster-marathon P24 cartoon (3-panel SVG, click-advance)
  44. 6db3d93 2026-09-24 Add Model Arena winner: The Filibuster Marathon (Paul Conrad style, qwen25-7b)
  45. 37653be 2026-09-24 auto-data-snapshot: 2026-09-24T11:17:31 (2 data files) — cartoons/queue/2026-09-24.json yolo/cartoon-batch-log.jsonl
  46. 76360d3 2026-09-24 Add P24 cartoon: The Revolving Door (invented regulator/lobbyist revolving-door satire)
  47. 2f0a37c 2026-09-24 auto-data-snapshot: 2026-09-24T10:46:49 (1 data files) — yolo/cartoon-batch-log.jsonl
  48. dcc569c 2026-09-24 P24: register business/entertainment/scitech/sports/weather cartoons in manifest.js
  49. 7ddc237 2026-09-24 Add P24 cartoon: Cloture o'Clock (invented senate-clock filibuster/cloture satire)
  50. 9d290d7 2026-09-24 crazy-news-channel: live-verify hardened admin server (vp-engineering close-out)
  51. 35cc1c2 2026-09-24 Add P24 cartoon: The Quorum Call (invented legislative hide-and-seek quorum satire)
  52. 90bdc43 2026-09-24 cartoons gallery: front-page per-category colors + category chip filter
  53. 3e6ffab 2026-09-24 P24: add first cartoon for business/entertainment/scitech/sports/weather categories
  54. bb599b5 2026-09-24 Add P24 cartoon: The Pork Barrel Express (invented infrastructure-bill train satire)
  55. b0b4970 2026-09-24 admin-server: fix 3 verified security/robustness holes
  56. 6609a82 2026-09-24 cartoons gallery: add list/grid view toggle alongside density slider
  57. 0368b35 2026-09-24 crazy-news-channel: verify admin refresh endpoint live (session-close check)
  58. 1b61464 2026-09-24 auto-data-snapshot: 2026-09-24T10:15:55 (2 data files) — cartoons/queue/2026-09-24.json yolo/cartoon-batch-log.jsonl
  59. 6504ba2 2026-09-24 crazy-news-channel: final refresh of real Google News data (session end)
  60. e79e251 2026-09-24 Add P24 cartoon: Who Gets the Last Slice (budget pie-slicing satire)
  61. daf7ea3 2026-09-24 cartoons: 6 new political cartoons for invented politics stories, story_id-linked (TK-12138)
  62. 0839cdd 2026-09-24 Category view: V4 Newspaper Column dense listing + cartoon-thumb slot for politics (TK-12138)
  63. c832bd4 2026-09-24 Add admin button to refresh real news via a tiny local admin server
  64. 24b3be0 2026-09-24 crazy-news-channel: refresh real Google News headlines (42 stories, all 7 categories)
  65. 2d5e99e 2026-09-24 Cartoon batch: exit non-zero when any cartoon fails verification
  66. 5aff77e 2026-09-24 Cartoon batch: verify output file + manifest entry (not just exit 0); grant headless claude scoped edit/test tools
  67. 30215fc 2026-09-24 Cartoon batch: set PATH for launchd so node/claude resolve; fail loudly if missing
  68. 7518fc5 2026-09-24 Fix Cody's 4 verified findings: XSS in cartoon gallery, file:// manifest fetch failure, cover-label desync, dead tab stops on inert panels
  69. 5cd57ad 2026-09-24 P24 Political Cartoon Desk: gallery archive, daily prompt generator, first strip (Commissions All the Way Down)
  70. 3a5ce94 2026-09-24 Stop tracking Playwright screen-recording video output; ignore *.webm/*.mp4 going forward
  71. f58b710 2026-09-24 chaos-screenrecord: fix chaosFF-concluded's coverage gap on the standby flash
  72. 1ce86db 2026-09-24 Fix Chaos Index reading ~51% on fresh load — exclude single-stage real-news from the escalation gauge
  73. 5643bfe 2026-09-24 One feed: invented satire + real Google News together
  74. 6018a55 2026-09-24 Remove [CORRECTION] headline stamp from concluded stories
  75. 4d10d98 2026-09-24 5x: final report, Cody SHIP IT on 2472ae0
  76. 2472ae0 2026-09-24 5x sweep 5: route every home link through goHome() via one delegated handler
  77. b868846 2026-09-24 5x sweep 3: Cody's 3 verified findings — article back/Escape returns to its own category (not Home), one canonical home URL, empty-state link is real
  78. 0466ef4 2026-09-24 Slow the breaking-news ticker to a constant readable ~55-70 px/s
  79. 40beaff 2026-09-24 5x: sweep 1 (category-page fix) and sweep 2 (clean) notes
  80. d7c494a 2026-09-24 Add scripts/fetch-real-news.mjs: real Google News RSS per category, $0
  81. f79b2f1 2026-09-24 Article view: render a real outbound link to a story's source article
  82. 458b2cc 2026-09-24 Category selection opens a real page (#/category/<key>), not just an in-place recolor; logo links home
  83. d583f26 2026-09-23 Reset to Defaults clears FAILED_IMAGES
  84. 30c5077 2026-09-23 Keyed child morph + failed-image memory: stop cascading card rebuilds
  85. 43aba19 2026-09-23 Morph escalated cards in place; close articles synchronously on Escape
  86. 5d6d91c 2026-09-23 auto-data-snapshot: 2026-09-23T20:04:48 (1 data files) — screenrecord/debug-log.jsonl
  87. 679e2f4 2026-09-23 Chaos Index: serialize live announcements, reserve 100% for meltdown, fix standby re-arm
  88. f961c67 2026-09-23 Fix real horizontal overflow from the chaos-tier-3 broadcast tilt
  89. 0e2f7d8 2026-09-23 Add CHAOS INDEX: a global escalation gauge that degrades the broadcast itself
  90. 87e501c 2026-09-23 Escape quotes in escapeHTML: close admin-headline attribute injection
  91. c69818e 2026-09-23 CTA pass: escalation-arc feature (e4c7519) + regression — finds HIGH admin XSS via unescaped quotes
  92. bd02807 2026-09-23 auto-data-snapshot: 2026-09-23T19:02:06 (3 data files) — cta/cta2-all-results.json cta/cta2-chrome-results.json cta/cta2-safari-results.json
  93. 512c23a 2026-09-23 Fix escalation-arc grammar: no run-on headline frames, no doubled quotes
  94. e4c7519 2026-09-23 Give admin-created stories 8 distinct escalation arcs instead of 1 shared template
  95. de89fd4 2026-09-23 Stamp lastUpdated at state-entry, not in render; clear grid at zero stories
  96. e1d52f1 2026-09-23 Fix story-grid click/focus race: keyed in-place patch + stable Updated stamp
  97. 8e9575f 2026-09-23 Add screenrecord DEBUG-REPORT: confirms real story-grid DOM-detach race, clears 3 harness false positives, verifies Escape-priority both-open case is clean
  98. 2059f5a 2026-09-23 Fix WebKit header ghosting + 4 Cody holes: mood-desync, migrateV1 resurrect, missing img onerror, no-Escape-for-banner
  99. 5bb0f0c 2026-09-23 Add CTA cross-browser click-through proof for PANDEMONIUM-24
  100. 213738e 2026-09-23 auto-data-snapshot: 2026-09-23T17:59:00 (5 data files) — cta/cta-browserbase-results.json cta/cta-chrome-results.json cta/cta-local-results.json screenrecord/_aborted-attempt0/debug-log.jsonl screenrecord/debug-log.jsonl
  101. 63ec4a9 2026-09-23 Fix malformed hash crash: wrap decodeURIComponent in try/catch, start tick before renderRoute
  102. 744e857 2026-09-23 Add remaining SDXL story photos (all 40 stories now have an image)
  103. ae53be9 2026-09-23 All 40 stories now have complete Onion-style article bodies
  104. 195e22c 2026-09-23 Seed PANDEMONIUM-24 with 37 new stories, SDXL photo generator, article bodies, and layout for 40-story grid
  105. ad547da 2026-09-23 Add full Onion-style articles: hash-routed article view + feature pieces
  106. 4459222 2026-09-23 Re-anchor saved story offsets on load so admin stories keep escalating after a reload
  107. c180c52 2026-09-23 Add admin panel: create/delete/reset controls for breaking stories
  108. cff03a3 2026-09-23 Build PANDEMONIUM-24: satirical 24hr news channel (Crazy News Challenge)

Authors

Agents used

  • vp-engineering1

Skills used

  • /claude64
  • /code63
  • /index16
  • /style10
  • /manifest8
  • /reference8
  • /queue8
  • /page7
  • /entertainment7
  • /scitech6
  • /weather6
  • /sports6
  • /cartoon-batch-log5
  • /article5
  • /worktrees4
  • /assets4
  • /meta4
  • /business4
  • /category4
  • /dark3
  • /localhost3
  • /fetch-real-news3
  • /debug-log3
  • /cartoon2
  • /agent-adeaa4f0116149a982
  • /paul-conrad2
  • /tags2
  • /cta3-video-results2
  • /light2
  • /title2

Creative ideas + design notes

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

c3b7dd0 · 2026-09-25 · TK-12241: Shadow Man gallery page on the Cartoon Desk (approved pieces only)
cartoons/shadow-man.html + shadow-man.js, linked from cartoons/index.html. Data comes from
cartoons/shadow-man-data.js, written by the Inkwell export script, which exports ONLY pieces
approved in the Inkwell curation UI (currently 0 -> page shows an empty state). Theme/era filters,
sort, density slider (persisted), date+time chips, <dialog> viewer. Styling added to
assets/style.css as PART 4 scoped under body.shadow-man-page; no inline styles. Not added to
manifest.js, the daily queue, or the Shorts pipeline.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
8ef5d98 · 2026-09-25 · p24 daily-cartoons: docs for article-driven, still-image-by-default pipeline
README.md rewritten for TK-12237: article selection rules (14-day queue + full
manifest.js exclusion, real-news-first-then-p24-fallback), the new $0.003/cartoon
still-image cost line (was $0.103 with video), --concepts-only and --video usage,
and a note that the older multi-panel interactive-strip cartoons already in
cartoons/manifest.js use a different DOM than scripts/cartoon-shorts/make-cartoon-shorts.mjs
expects (pre-existing gap, unrelated to this change). run-daily.sh comment updated
to flag that --video must not be added there without an explicit Steve ask.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XizSgLiFuNbjY418z94Ewq
fb5ea85 · 2026-09-25 · p24 daily-cartoons: review queue shows linked article, renders cleanly without clips
build_review.py's card now shows the linked source article (title + real-news/p24
source chip), or a plain "no linked article" note for pre-TK-12237 queue items that
predate story linking. The approve-command snippet shown per card now includes the
recorded --story-id so Steve can copy/paste it directly. review.html regenerated;
verified 0 console/page errors via Playwright and 0 <style> blocks / style="" attrs
(only ../assets/style.css, per the one-stylesheet rule).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XizSgLiFuNbjY418z94Ewq
0b40f82 · 2026-09-25 · p24 daily-cartoons: approve.py defaults --story-id from meta.json, links source article
--story-id is no longer required on the command line — it defaults to the article
generate.py recorded in meta.json (story_id) and is still validated against
stories-data.js/real-news-data.js; pass --story-id to override. The generated
cartoon page now also shows a "Source: <headline>" link to the linked article when
present. Works unchanged with or without clip.mp4 (poster-only renders as a still
<img>, no style violations — only ../assets/style.css is linked).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XizSgLiFuNbjY418z94Ewq
b8bc8d0 · 2026-09-25 · p24 daily-cartoons: generate cartoons from real articles, still image by default (TK-12237)
generate.py now reads today's real-news-data.js (falling back to stories-data.js's
invented P24 stories) via a sandboxed extract_stories.mjs parser, picks one unused
article per cartoon (skipping story_ids cartooned in the last 14 days of the queue
or already in cartoons/manifest.js, preferring newest real news), and asks local
Ollama for exactly one gag per article instead of inventing abstract concepts with
no article input. Video generation (Replicate wan-2.2 i2v) is now opt-in via
--video (default OFF, ~$0.003/cartoon instead of ~$0.103) per Steve: "just an
image, not moving." Added --concepts-only/--dry-run for a $0 preview of picked
articles + concepts with no Replicate calls.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XizSgLiFuNbjY418z94Ewq
04b770b · 2026-09-25 · p24: scrub every mention of Paul Conrad / Conrad per Steve's standing rule
Removes the name from all user-visible text and from the daily-cartoon
generator prompts/templates so it can't come back in future output:

- cartoons/reference/paul-conrad.js -> editorial-ink-reference.js: rewrites
  the "Masters" bio+works reference into a generic "Classic Editorial-Ink
  Tradition" style reference (no named individual, no catalogued/cited real
  works) and updates cartoons/reference/index.html to match.
- cartoons/20260924-conrad-filibuster-ink.html -> 20260924-filibuster-ink.html
  and 20260924-conrad-filibuster-qwen25-7b.html -> 20260924-filibuster-qwen25-7b.html,
  images/filibuster-marathon-conrad.jpg -> filibuster-marathon-ink.jpg, with
  every reference updated (manifest.js ids/files/thumb/tags/style_reference,
  index.html featured-cartoon links, cartoons/index.html, assets/style.css
  comments, cta/cta3-video-results.json local test-evidence paths).
- 3 other cartoon pages (come-in-and-get-me-meter, row-by-row-marshal,
  gold-tier-treadmill) + their manifest.js entries: "in the manner of Paul
  Conrad" -> "in classic editorial-ink style"; style_reference/tag values
  paul-conrad / "paul conrad style" -> editorial-ink / "classic editorial ink".
- daily-cartoons/generate.py STYLE_PRE (the actual generator prompt) and
  approve.py's approved-page caption + style_reference/tags rephrased so no
  future daily cartoon carries the name; daily-cartoons/README.md updated;
  the 5 queued (not-yet-approved) meta.json image_prompt fields scrubbed and
  daily-cartoons/review.html rebuilt from them via build_review.py.

Verified: recursive case-insensitive grep for "conrad" across the whole
worktree (incl. yolo/) returns zero hits; the one-stylesheet invariant
(no <style>/style=" in any tracked html) still holds; Playwright crawl of
index.html + cartoons/index.html + cartoons/reference/index.html + all 23
cartoon pages returns HTTP 200, 0 console errors, 0 failed network requests,
and no "conrad" in rendered text or HTML source on every page reachable from
the current manifest (one unrelated pre-existing 404 found and left alone:
manifest.js's "filibuster-marathon" entry points at a file removed by an
earlier, unrelated commit — flagged for a separate fix, not in scope here).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
3619366 · 2026-09-25 · p24: fix cartoon-page generators to emit zero inline styles going forward
daily-cartoons/approve.py (writes a new cartoons/<date>-<slug>.html for every
newly-approved cartoon) and daily-cartoons/build_review.py (writes the local
admin review queue) each emitted their own <style> block with a hardcoded
palette (--cream/--ink/--mint, or --bg/--ink/--mint/--card/--dim + a
prefers-color-scheme dark swap) and a Georgia font, on top of already
linking ../assets/style.css. Fixed both generators to link only the shared
stylesheet and use new body classes (cartoon-page-simple, cartoon-queue-page)
whose rules now live in style.css, so every page these scripts produce from
here on stays on the one site-wide palette/font. Regenerated review.html
(local-only queue, 5 items) to verify.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
f3c1a2d · 2026-09-25 · p24: move all 22 cartoon-strip pages + the reference page onto the shared stylesheet
Each of the 22 cartoons/2026*.html pages (plus cartoons/reference/index.html)
carried its own <style> block — 10 distinct copy-pasted/drifting variants —
on top of already linking ../assets/style.css, plus a per-page "Dark mode"
theme-toggle button+script on 17 of them. Some variants set a serif font
(Georgia/'Times New Roman'/'Iowan Old Style'/Palatino) that didn't match the
site's sans-serif stack, so which page you clicked into changed both the
font and (via the toggle, or the mood-swap removed in the prior commit) the
colors.

Deleted every inline <style> block and moved its rules into assets/style.css
under body classes scoped per layout family (cartoon-page[-wide], -frame,
-diagram, -editorial, -reference) so none of it can leak onto index.html or
cartoons/index.html. Removed the per-page theme toggles (button + JS) along
with the mismatched serif fonts. Functionality (panels, reveal/twist
buttons, sliders, status messages, the one true 3-state auto/dark/light
toggle on budget-pie-fight) is unchanged — only the styling mechanism moved.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
455c6ee · 2026-09-25 · p24: move index.html's 9 inline style="..." attrs into style.css classes
cartoon-desk-link and the featured-editorial-cartoon block (panel/link/
video/title/caption) carried inline styles, including a Georgia/'Times New
Roman' font-family on the title+caption that didn't match the site's one
sans-serif font stack. Replaced each with a class (.cartoon-desk-link,
.featured-cartoon, .featured-cartoon-panel/-link/-eyebrow/-video/-title/
-caption) defined once in style.css, and dropped the mismatched serif so
the whole page uses one font system. index.html now has zero style="..."
attributes.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
d12e5a2 · 2026-09-25 · p24: remove per-category mood palette swap and per-strip dark toggle from style.css
Clicking a category filter set body[data-mood="politics|weather|..."], and a
whole block redefined --bg/--panel/--accent/--text/etc per category, so every
click repainted the entire site's colors. Same problem for the per-strip
"Dark mode" toggle, which swapped --bg/--panel/--text via html[data-theme].
Removed both blocks; kept only the single default ("all") mint-green palette
in :root. JS still sets body[data-mood] on click (for the mood-readout text
and the independent per-card --cat-accent dots) and pages still carry
data-theme, but nothing in style.css keys colors/fonts off either anymore.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
ce98d61 · 2026-09-24 · Add make-cartoon-shorts.mjs: turn each P24 cartoon into a vertical YouTube Short
Playwright captures the 3-panel strip + Plot Twist state live from the cartoon
HTML; ImageMagick composites branded 1080x1920 cards (opening SATIRE card,
per-panel cards, plot-twist card, article card for the linked real story);
ffmpeg Ken-Burns + concat + mux produces out.mp4. Reuses the EXISTING
allnewsdaily pipeline modules (tts-elevenlabs.mjs, upload-youtube.mjs,
fit-caption.js) rather than copying them. Idempotent via
cartoons/shorts-ledger.json; every run logs PASS/FAIL/SKIP rows to
yolo/cartoon-shorts-log.jsonl and writes a fleet-health-rollup heartbeat to
~/.claude/skills/p24-cartoon-shorts/data/latest.json.

A cartoon whose story_id doesn't resolve to a real stories-data.js /
real-news-data.js entry is skipped (FAIL row) and never rendered/uploaded.

Tested (--no-upload): commission-turtles with VO ($0.087, 290 chars) and
budget-pie-fight silent, both 1080x1920 / 34.2s / <60s. Negative test
(unresolvable story_id) confirmed FAIL row + no video, no ledger write.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2d4bee0 · 2026-09-24 · Add googly eyes (/eyes skill) pinned bottom-right above the ticker, pointer-events none
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KLwoGhVdenyRTtTeMnGHSU
33a362f · 2026-09-24 · P24 daily-cartoons: Ollama concepts + flux-schnell poster + WAN 2.2 clip into local review queue, $1/day cost cap (TK-12153)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VGPARcQepnFT49pzMk1ZE5
e224274 · 2026-09-24 · gitignore: cover shots*/ , _tmp-*/ , cartoons/_shot-*.png
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LfkajczsrHUsBBKvhRwcCG
b6a6016 · 2026-09-24 · P24: every category page uses the same photo-card layout as the front page (retire newspaper-mode)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01673i1FNbU9H28DomRKpHuk
318cde7 · 2026-09-24 · P24: add article tags on every post, with a clickable #tag= filter + tag cloud
Adds a `tags` array (3-6 short, shared-vocabulary tags) to every entry in
stories-data.js (44), real-news-data.js (42), cartoons/manifest.js (23),
and the 4 inline FEATURES in index.html (109 posts total, 0 missing).
Cartoons inherit their linked story's tags plus "editorial cartoon" (+
"paul conrad style" for the 5 Conrad-manner strips).

UI: tag chips render on every story/feature card, in the article view
under the dek, and on every cartoon-gallery card (as a sibling of the
card's own <a>, not nested inside it). Clicking a chip filters to every
post carrying that tag across all categories, shows a "Tagged: X ✕"
indicator, and persists in the URL as #tag=<tag> (works under file://,
unlike localStorage cross-page). A tag cloud (top tags with counts,
tags used only once excluded) sits above the grid when no filter is
active.

Real-news tagging is deterministic (scripts/lib/auto-tag-real-news.mjs:
category + outlet + ~30 keyword rules, always 3-6 tags, no LLM/API) and
is now called by fetch-real-news.mjs on every refresh, so a future run
can never write an untagged entry. build-cartoon-batch.sh's FAIL check
is extended the same way it already enforces story_id, so a cartoon (or
the story it's paired with) built without tags fails the batch. Each
data file's header now states the tags rule.

Also fixes the last 6 P24 pages still carrying their own inline theme
CSS instead of the shared assets/style.css from TK-12151's unification
(cartoons/reference/index.html + the come-in-and-get-me-meter,
row-by-row-marshal, gold-tier-treadmill, conrad-filibuster-ink, and
filibuster-marathon strips) — same link+data-mood treatment as the
other 18, so every page's background now matches its mood site-wide
(verified: index.html and cartoons/reference/index.html compute the
identical "all"-mood background gradient).

Verified: node --check on every edited JS file; a vm-context script
(scripts/verify-tags.mjs) asserting 0 of 109 posts have missing/empty
tags and printing vocabulary stats; a 30-check Playwright pass over
file:// (front page article + tag-click filtering, cartoon gallery +
tag-click filtering, 390px mobile with 0 horizontal overflow, and the
6 CSS-unified pages) — 0 console/page errors throughout.

TK-12165

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V29xaoBwcFwJyR4KC43ptn
4c712f2 · 2026-09-24 · Fix P24 cartoon video: pull <video> out of the <a> wrapper, clear ticker overlap
CTA cross-browser test found clicks on the video were being swallowed by the
enclosing anchor (Safari navigated away, Chrome silently did nothing), and the
fixed bottom ticker covered the native control bar at normal window heights.
Video now sits outside any <a>; caption/title link separately. Added
margin-bottom to clear the ticker.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VGPARcQepnFT49pzMk1ZE5
7bf67a3 · 2026-09-24 · Animated Filibuster Marathon on P24 front page (WAN 2.2 i2v, ~$0.20)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VGPARcQepnFT49pzMk1ZE5
6481269 · 2026-09-24 · Unify P24 stylesheet: shared external CSS across front page, cartoon gallery, and all 18 strip pages
Extracts the front page's 818-line inline <style> into assets/style.css
(Part 1, verbatim) and links it from index.html, cartoons/index.html
(Part 2: gallery-only grid/card/controls rules, deduped against Part 1),
and all 18 cartoon strip pages (Part 3), replacing three drifting inline
stylesheets with one shared file — still pure file:// static HTML, no
server/build step.

The 18 strips previously hand-rolled a separate "parchment newspaper"
serif theme (--ink/--ink-dim/--rule/--seal, Georgia font, a per-file
light/dark toggle). Rather than rewrite each strip's SVG-drawing JS
(several read these var() names directly at render time), the legacy
names are aliased onto the shared mint-green token system on the `body`
selector (not `:root` — aliasing at :root freezes the substitution using
html's own default-mood value instead of re-resolving per body[data-mood],
verified by isolated repro) so every strip re-themes automatically,
including a `data-mood="<category>"` attribute per strip matching its
manifest.js section (13 politics, 1 each business/entertainment/scitech/
sports/weather).

Also found and fixed: 17 of 18 strips explicitly set data-theme="light"
on load by default (only one has real 3-state auto/dark/light logic), so
a literal parchment-color override on data-theme="light" was permanently
masking every mood palette. Light is now a no-op (mood palette shows by
default); the toggle's "dark" state layers a night-viewing neutral on
top of whichever mood is active, verified working via Playwright click.

Verified with Chrome headless screenshots + Playwright (front page,
gallery, and 3 varied strips: politics 3-panel, scitech, weather) —
correct per-category theming, legible contrast, 0 console/page errors,
click-advance SVG interaction intact, dark-mode toggle intact.

Out of scope (left untouched, in-flight from other concurrent agents):
cartoons/manifest.js, cartoons/reference/*, and the newer cartoon files
not yet in the 18-file manifest (filibuster-marathon, come-in-and-get-me-
meter, conrad-filibuster-ink, gold-tier-treadmill, row-by-row-marshal) —
those will need the same link+data-mood treatment once their owning
tickets land.

TK-12151

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V29xaoBwcFwJyR4KC43ptn
c130b62 · 2026-09-24 · Backfill story_id links for 9 orphaned cartoons + codify link-to-article rule
9 cartoons shipped with story_id: null (no underlying article at all):
commission-turtles, budget-pie-fight, pork-barrel-train, quorum-call-hide-seek,
cloture-oclock, lobbyist-revolving-door, conrad-filibuster-ink,
conrad-filibuster-qwen25, filibuster-marathon.

Added 7 new stories-data.js entries (window.P24_EXTRA_STORIES, matching the
existing schema exactly): 6 distinct stories for the 6 non-filibuster
cartoons, plus one shared story (pw-filibuster-holloway) for the 3
Paul-Conrad/model-contest/plain filibuster variants, since they all depict
the same invented Delegate Holloway event. Re-pointed all 9 cartoons'
story_id fields in cartoons/manifest.js accordingly. Verified via a vm-context
load of both files: all 23 cartoons now resolve to a real story (0 orphans,
0 broken links).

Codified the standing rule (Steve, verbatim: "always link images cartoons to
the real article") as a comment block at the top of cartoons/manifest.js, and
wired the same requirement into scripts/build-cartoon-batch.sh — the
not-yet-installed daily batch pipeline that appends new manifest entries:
updated its claude -p prompt to require writing a companion story + a
non-null story_id, and added a cheap substring-based post-build check that
now fails (not passes) a build whose manifest entry has story_id: null.

Scope: only cartoons/manifest.js, stories-data.js, and
scripts/build-cartoon-batch.sh touched. Left untouched (a sibling agent's
uncommitted CSS-unification work): cartoons/index.html, index.html, and all
cartoons/*.html strip files.

TK-12158

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V29xaoBwcFwJyR4KC43ptn
e2f9f7b · 2026-09-24 · Add Paul Conrad style-reference page for P24 Political Cartoon Desk
Links from the cartoons index header ("Masters: Paul Conrad ->") to a new
cartoons/reference/index.html: bio, creed, the visual devices/brief P24
uses to draw "in the Conrad manner," and a documented-works table that is
metadata + citation-only (no cartoon images hosted — Conrad's actual work
is copyright LA Times/estate and non-embeddable). Explicitly credits and
links to the standalone research catalog at ~/Projects/paul-conrad-cartoons
(run `node server.js`, http://localhost:9933) for the fuller 38-record
archive. Presents P24's Conrad-styled strips as original in-house satire
inspired by his technique, never as reproductions.

Verified: node --check on manifest.js + reference/paul-conrad.js, and a
Playwright pass through cartoons/index.html (23 cards, 0 console errors)
into reference/index.html (12 works rendered, correct rights disclaimer).

TK-12155

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V29xaoBwcFwJyR4KC43ptn
122888f · 2026-09-24 · Feature Conrad-style Filibuster Marathon ink cartoon on P24 front page
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VGPARcQepnFT49pzMk1ZE5
edcd6b3 · 2026-09-24 · Add filibuster-marathon P24 cartoon (3-panel SVG, click-advance)
Delegate Holloway filibusters the invented Assembly, cycling reading
material (phone book -> cereal box -> furniture instructions -> his
own bill) via Plot Twist. Panel 2 has a melting Dali-style clock;
panel 3 shows the chamber asleep at their desks. Fully self-contained,
matches the commission-turtles.html house style. Verified click-advance
+ plot-twist cycling with Playwright, zero console/page errors.

Also fixed manifest.js, which a concurrent process had left with a
JS syntax error (a raw object literal appended after the array's
closing bracket) — folded that entry properly into the array and
appended this cartoon's entry alongside it.

TK-12146

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V29xaoBwcFwJyR4KC43ptn
6db3d93 · 2026-09-24 · Add Model Arena winner: The Filibuster Marathon (Paul Conrad style, qwen25-7b)
- Qwen2.5 7B won the 3-model Conrad showdown (vs Qwen3 14B; Claude CLI failed)
- Stark black-ink single panel: delegate reads phone book, clock melts Dali-style, Congress sleeps
- Challenge 56406f116d2a auto-judged by vision-referee (qwen25-7b PNG 7.5x larger → more detail)
- Added to cartoons/ + registered in manifest.js with model attribution + challenge_id
- No external publish; fully reversible (git revert + cartoons/ delete)

Challenge: https://localhost:9758/#/challenges/56406f116d2a
Model Arena: https://localhost:9758 (admin/DW2024!)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V29xaoBwcFwJyR4KC43ptn
dcc569c · 2026-09-24 · P24: register business/entertainment/scitech/sports/weather cartoons in manifest.js
Atomic read-modify-write per coordinator direction (re-read fresh, parse
with the same regex daily-cartoon-gen.mjs uses, append, write back) to
avoid a race with the concurrently-running build-cartoon-batch.sh politics
batch (still in flight, 4/6 done at commit time, its own entries untouched).

Added a `section` field (politics/business/entertainment/scitech/sports/
weather) to all 16 entries -- backfilled "politics" on the 11 pre-existing
ones, set to the real category key on the 5 new ones -- for the parallel
gallery color/filter work on cartoons/index.html. Non-politics entries use
category: "Editorial Cartoon" instead of "Political Cartoon".
9d290d7 · 2026-09-24 · crazy-news-channel: live-verify hardened admin server (vp-engineering close-out)
Verified directly (not just read the diff): git log confirms b0b4970 shipped,
button POSTs /api/refresh-real-news, server binds 127.0.0.1 only (lsof
confirmed), a live POST re-ran fetch-real-news.mjs and refreshed
real-news-data.js (mtime advanced, 42 real headlines), and file:// direct-open
still degrades gracefully via the location.protocol guard.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01166faVcwiztzWqhHwD9yer
90bdc43 · 2026-09-24 · cartoons gallery: front-page per-category colors + category chip filter
Replace the single hard-coded red palette with the same 8 mood blocks
(all/politics/weather/scitech/sports/entertainment/business/uncategorized)
from ../index.html, add the matching 8-chip category filter that retunes
body[data-mood] the same way, give each card a data-cat + --cat-accent
color (left border + badge) so the All view is multicolored, classify
cartoons via section -> story_id lookup (../stories-data.js) -> "Political
Cartoon" -> uncategorized, and persist the selection via
localStorage/#/category/<key> hash (hash wins on load). Sort, density,
grid/list toggle, and textContent-only rendering all preserved.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DqUe1Hvqsnrkxpe4R6jrk1
3e6ffab · 2026-09-24 · P24: add first cartoon for business/entertainment/scitech/sports/weather categories
Five single-panel interactive SVG cartoons (matching the
20260924-gnome-who-wouldnt-hush.html pattern: 5-stage click-to-advance,
Plot Twist button, dark mode, keyboard nav, reduced-motion safe), each
linked via story_id to a real invented story in stories-data.js:
- tollpoints-diamond-status -> bs-toll-loyalty (Business)
- jackalope-custody-battle -> es-jackalope-statue-town-rivalry (Entertainment)
- tuber-bank-of-chugwater -> sci-battery-potato (Sci-Tech)
- the-zipper-that-ended-an-inning -> sw-mascot-costume (Sports)
- the-corner-with-its-own-weather -> sw-persistent-crosswind (Weather)

Playwright-verified at 1440/390px, dark+reduced-motion, and full keyboard
nav (Tab reaches #art, Enter/'n' both advance) — zero console/page errors
on all 5. manifest.js registration follows once the live
build-cartoon-batch.sh run (today's 6-cartoon politics batch) finishes
writing to that file, to avoid a race on the shared array.

Also (prep only, not wired into rotation mix): cartoon-prompt-bank.mjs now
carries a category field per bank entry (existing 12 default to politics)
plus 3 new stub entries per non-politics category (15 total), and
daily-cartoon-gen.mjs threads category through to queue briefs. The picker
itself is still a flat shuffle across the whole bank -- a future session
decides the rotation mix.
b0b4970 · 2026-09-24 · admin-server: fix 3 verified security/robustness holes
- Malformed-URL crash: decodeURIComponent was outside try; a single
  'curl /%' killed the process on Node v26 (unhandled URIError). Now 400.
- Path-traversal prefix bug: startsWith(ROOT) without separator let a
  sibling <ROOT>-secrets path through. Now boundary is ROOT + path.sep,
  plus a top-level allowlist (index.html, *-data.js, cartoons, images)
  so .git/, scripts/ source, and .env are no longer served.
- Unauthenticated cross-origin POST: 127.0.0.1 is not a CSRF boundary;
  now rejects any non-same-origin Origin on the state-changing refresh.

All three reproduced live before fixing and proven fixed with negative
tests (crash→400, leak→403, drive-by→403); legit paths + refresh still 200.
6609a82 · 2026-09-24 · cartoons gallery: add list/grid view toggle alongside density slider
Adds a segmented Grid/List view-mode toggle to the P24 cartoon gallery
controls bar. List mode renders cards as full-width horizontal rows
(reusing the existing textContent-only card-building code via a
.list-mode CSS modifier) and hides the density slider since row width
is no longer density-controlled. View mode persists to localStorage
(p24cartoons.viewmode) alongside the existing sort/density keys.
Verified with Playwright at 1440px and 390px viewports: 0 console
errors, 0 page errors, correct persistence across reloads.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DqUe1Hvqsnrkxpe4R6jrk1
daf7ea3 · 2026-09-24 · cartoons: 6 new political cartoons for invented politics stories, story_id-linked (TK-12138)
- The Meter That Wouldn't Yield (pw-meter-street): a parking meter's honors escalate from street-naming to a council seat to a re-election bid to a one-day mayoralty it refuses to vacate.
- Row by Row Only (pw-corn-etiquety): Kansas legislates the one true corn-eating method, deputizes Corn Marshals, and bans cob holders as cheating devices.
- The Gnome Who Wouldn't Hush (pw-lawn-gnome-tax): a loud lawn gnome gets registered, ankle-monitored, sued over, and finally reviewed by a Gnome Parole Board.
- Four Minutes Ahead of Everyone (pw-clock-secession): a town clock set 4 minutes fast escalates into its own named time zone and a secession petition from Mountain Time.
- The Casserole Succession (pw-bean-queen): a ceremonial Bean Queen title gets term-limited, the sash is contested, and a courthouse rules succession passes by casserole, not bloodline.
- The Hedge Non-Aggression Pact (pw-hedge-statue): a statue-shaped hedge draws a height limit, a fine, an interstate espionage accusation, and a formal treaty with Idaho.

Each cartoon is a single-panel inline SVG scene with a Plot Twist button that cycles through the story's own 5-headline escalation arc, concluding cleanly at the final stage (no loop-back). Dark mode, keyboard nav (N/arrow/Enter/Space), focus-visible outlines, and prefers-reduced-motion all match the commission-turtles template. manifest.js gains an additive story_id field on every entry (null on the pre-existing commission-turtles cartoon) linking each cartoon to its source invented-politics story for category-view lookup.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XKaojLnVW8hyxsVriY5f9a
0839cdd · 2026-09-24 · Category view: V4 Newspaper Column dense listing + cartoon-thumb slot for politics (TK-12138)
Steve picked V4 (of 6 Figma mockups: figma.com/design/oqcZhYvN4kWvw0VRUa1FYG) — dense
multi-column newspaper-style headline listing for the category route (#/category/<x>),
distinct from the 'All Categories' home view which keeps its original photo-card stack.

- .story-grid.newspaper-mode: true CSS column-count flow (1/2/3/4 cols by breakpoint),
  restyles the SAME storyCardHTML() markup used everywhere else — no markup fork, so
  patchStoryGrid()'s keyed morph reconcile never bridges a shape change from this toggle
  alone (a category route change already swaps the id set on its own).
- Inline category label (.np-cat-label) replaces the badge-pill kicker in dense mode;
  detail paragraph + read-more link hidden (headline does the work); escalation bar
  shrinks to a left rail-style accent.
- Toggled in renderStories(): els.storyGrid.classList.toggle('newspaper-mode',
  state.category !== 'all').
- findCartoonForStory(): looks up cartoons/manifest.js (window.P24_CARTOONS, now loaded
  via a new <script> tag) by story_id. A POLITICS story with a linked cartoon shows a
  cartoon-thumb link INSTEAD OF its photo, in the same image slot, styled for both card
  and newspaper mode. Gracefully falls back to the plain photo (or nothing) when no
  cartoon is registered — safe to ship ahead of / independent from the cartoon content
  landing. Real-news political stories are NEVER cartoon-linked (only invented pw-*
  stories get one — the Cartoon Desk's own policy: invented bureaucracy only, never real
  people/parties).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XKaojLnVW8hyxsVriY5f9a
c832bd4 · 2026-09-24 · Add admin button to refresh real news via a tiny local admin server
Steve wanted a button instead of typing `node scripts/fetch-real-news.mjs`
in a terminal. Browsers on file:// can't execute local processes, so this
adds an opt-in zero-dependency admin server (scripts/admin-server.mjs,
binds 127.0.0.1 only) that serves the static site and exposes
POST /api/refresh-real-news to shell out to the existing fetch script.

The admin panel's new "Refresh Real News" button posts to that endpoint
and reloads on success. Opening index.html directly via file:// (the
default, unchanged "no server needed" experience) shows a clear
instruction to start the admin server instead of failing silently.

Verified live: server-mode click-through refreshed 42 real headlines
(real-news-data.js mtime advanced) with a real headless-Chrome run, and a
separate file:// run confirmed the rest of the page is unaffected and the
button degrades gracefully with zero console errors.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01166faVcwiztzWqhHwD9yer
24b3be0 · 2026-09-24 · crazy-news-channel: refresh real Google News headlines (42 stories, all 7 categories)
Re-ran scripts/fetch-real-news.mjs to restore current real headlines after a
parallel-session rewrite left the feed stale. $0, no API key.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01166faVcwiztzWqhHwD9yer
2d5e99e · 2026-09-24 · Cartoon batch: exit non-zero when any cartoon fails verification
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DqUe1Hvqsnrkxpe4R6jrk1
5aff77e · 2026-09-24 · Cartoon batch: verify output file + manifest entry (not just exit 0); grant headless claude scoped edit/test tools
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DqUe1Hvqsnrkxpe4R6jrk1
30215fc · 2026-09-24 · Cartoon batch: set PATH for launchd so node/claude resolve; fail loudly if missing
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DqUe1Hvqsnrkxpe4R6jrk1
7518fc5 · 2026-09-24 · Fix Cody's 4 verified findings: XSS in cartoon gallery, file:// manifest fetch failure, cover-label desync, dead tab stops on inert panels
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DqUe1Hvqsnrkxpe4R6jrk1
5cd57ad · 2026-09-24 · P24 Political Cartoon Desk: gallery archive, daily prompt generator, first strip (Commissions All the Way Down)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DqUe1Hvqsnrkxpe4R6jrk1
3a5ce94 · 2026-09-24 · Stop tracking Playwright screen-recording video output; ignore *.webm/*.mp4 going forward
47 tracked recordings (~317MB) from prior screenrecord/cta harness runs
were regenerable QA artifacts, not source — permanently bloating .git for
every future clone/gc, including one 0-byte truncated recording. Untrack
them (files remain on disk unchanged) and add *.webm/*.mp4 to .gitignore
so future harness runs stop re-committing video. debug-log.jsonl and the
*.md reports under screenrecord/ stay tracked (small, useful history).

Note: this untracks going forward only — the 317MB already sits in git
history/blobs and .git stays large until that history is rewritten
(filter-repo/BFG), which is a separate, more invasive action not taken
here since it permanently discards the original commit objects.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019yVgDG93UFMN6sNbRaUfzd
f58b710 · 2026-09-24 · chaos-screenrecord: fix chaosFF-concluded's coverage gap on the standby flash
Two bugs in the same step, both confirmed by direct repro against the
live app with a fake clock:

1. The 12x25s=300s virtual-time cap was sized for the app's old 6s stage
   interval. Once MIN_STAGE_INTERVAL_SEC (a separate fix) raised the
   effective floor to 75s, a full escalation needs 4 advances x 75s =
   300s ALONE, leaving zero room for any story's offsetSec — and in
   run-orderings where this step executes before tier1/2/3 (e.g. run1's
   reversed order), elapsedSec is still ~0 when it starts, so the loop
   fell a few seconds short and PLEASE STAND BY was never reached.

2. Even with enough virtual time, the standby flash is only visible for
   ~2900ms of app-time before its own auto-hide timer fires. Sampling at
   25s chunk boundaries meant the entire visible window could open and
   close inside a single chunk and never get observed — verified
   empirically: with (1) fixed alone, allConcluded reliably went true but
   caught stayed false.

Fix: read MIN_STAGE_INTERVAL_SEC live from the page instead of
re-hardcoding a number that can drift out of sync with the app, size the
loop off it with headroom, and sample every 1s (well under the flash's
visible window) instead of every 25s. Verified end-to-end against the
exact worst-case ordering (elapsedSec~3 at loop start): caught=true,
allConcluded=true, ~0.8-3.5s real wall-clock overhead.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019yVgDG93UFMN6sNbRaUfzd
1ce86db · 2026-09-24 · Fix Chaos Index reading ~51% on fresh load — exclude single-stage real-news from the escalation gauge
computeChaos() scored every story's stageIndex/(stages-1), with a `span>0 ? … : 1`
fallback that returned FULL chaos for a single-stage story. After the "one feed"
real-news merge, ~42 of 82 stories are single-stage (real news doesn't escalate),
so each was counted as maximally escalated — pinning a fresh channel at ~51%
"Concerning" and making the Nominal band unreachable on load.

Compute the gauge over escalatable (multi-stage) stories only. Verified: fresh
load 0% Nominal, climbs to 100% Post-Journalism at true meltdown, klaxon +10
bump preserved, 0 console/page errors.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BkfgaotGs6PaEBcnKxnfZG
5643bfe · 2026-09-24 · One feed: invented satire + real Google News together
fetch-real-news.mjs had overwritten stories-data.js, deleting the 37 invented
stories. Real news now lives in real-news-data.js (P24_REAL_STORIES); the
invented set is restored from 195e22c. Saved browser lists pick up any
default story they've never seen, while admin deletions stay deleted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLjoHsyGTDeVCa1rdrAxnk
6018a55 · 2026-09-24 · Remove [CORRECTION] headline stamp from concluded stories
At high chaos, concluded stories were stamped [CORRECTION], which on real
Google News headlines reads as if the outlet issued a correction.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLjoHsyGTDeVCa1rdrAxnk
4d10d98 · 2026-09-24 · 5x: final report, Cody SHIP IT on 2472ae0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLjoHsyGTDeVCa1rdrAxnk
2472ae0 · 2026-09-24 · 5x sweep 5: route every home link through goHome() via one delegated handler
The empty-state 'All Categories' link added in b868846 still native-navigated
to '#/', recreating the two-home-URLs bug. Replaced the per-link listeners
with a single delegated handler for a[href="#/"] so no home link can miss it.
Modified clicks (cmd/ctrl/shift/middle) are left to the browser.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLjoHsyGTDeVCa1rdrAxnk
b868846 · 2026-09-24 · 5x sweep 3: Cody's 3 verified findings — article back/Escape returns to its own category (not Home), one canonical home URL, empty-state link is real
- goBackToGrid() now derives its target from the OPEN ARTICLE's own category
  (works the same for a direct deep link), not from a since-changed shared
  variable — fixes the regression Cody's proposed one-liner would have
  introduced (Escape/back-link on a category page with no article open would
  have silently done nothing, since state.category already equals the target).
- New goHome() is the single path to hash="": the logo and the category
  page's "All Categories" link both route through it now, instead of the
  logo native-navigating to a second, non-canonical "#/" URL.
- Escape now closes one layer per press (article -> its category -> Home),
  matching the UI's own depth instead of collapsing two steps into one.
- The category-empty-state's "All Categories" text is a real link now,
  not inert bold text next to a working one two lines up.

Verified: composed category->article->back/Escape journeys, deep-linked
article back, categoryBackLink always-home even mid-category, second-Escape
depth, logo->home canonical hash, empty-state link href. 0 console errors,
390/1440/reduced-motion clean.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLjoHsyGTDeVCa1rdrAxnk
0466ef4 · 2026-09-24 · Slow the breaking-news ticker to a constant readable ~55-70 px/s
Loop duration was fixed (60s -> 24s by chaos tier) while the loop grew to
40+ headlines, so the crawl hit ~1,600 px/s. Duration is now computed from
the track length so the speed stays readable at any headline count.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLjoHsyGTDeVCa1rdrAxnk
40beaff · 2026-09-24 · 5x: sweep 1 (category-page fix) and sweep 2 (clean) notes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLjoHsyGTDeVCa1rdrAxnk
d7c494a · 2026-09-24 · Add scripts/fetch-real-news.mjs: real Google News RSS per category, $0
index.html is static with no server, so it can't fetch news.google.com
itself (CORS). This is the offline refresh step (run manually or via
cron) that pulls current headlines from Google News RSS — no API key,
no spend — and writes them into stories-data.js as
window.P24_EXTRA_STORIES, replacing the invented satire that lived
there before.

- politics/weather -> Google News search RSS (no topic feed exists)
- scitech/sports/entertainment/business/uncategorized -> topic feeds
  (TECHNOLOGY/SPORTS/ENTERTAINMENT/BUSINESS/WORLD)
- Dependency-free XML parsing (regex + a small entity decoder); Google's
  <description> is XML-entity-encoded HTML, so entities are decoded
  BEFORE tags are stripped (stripping first leaves literal escaped tags
  sitting in the "stripped" text — caught and fixed during verification).
  Topic-feed descriptions are a related-coverage <ol><li> list; <li>
  becomes a bullet separator instead of one run-on line.
- Each story ships with exactly ONE stage (stageIndex 0), so tick()'s
  alreadyMax check holds it there forever -- real news never escalates
  into the satirical spiral (dovetails with the Ask-1 slowdown/pause).
- Carries sourceUrl/sourceName so the article view's new outbound-link
  block (previous commit) renders a real, working link to the source.

Ran live: 42 real, current, correctly-categorized headlines across all
7 categories (politics/weather/scitech/sports/entertainment/business/
uncategorized), verified via Playwright against a fresh page load --
each category filter shows its real stories, the outbound link opens
the real news.google.com redirect URL in a new tab with rel=noopener,
zero console errors.

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

File tree

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

Other build journals

← Crazy News Channel  ·  all 4 projects  ·  Crcp Pitch Video →

Export

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

rendered in 3ms