[object Object]

← back to Crazy News Channel Shadowman

Give admin-created stories 8 distinct escalation arcs instead of 1 shared template

e4c75194dbb6d3e36c8a47cf55eed9857727be92 · 2026-09-23 18:56:11 -0700 · Steve Abrams

synthesizeStages() previously wrapped every admin headline in the exact same
five wrapper sentences, so any two admin stories were reskins of one Mad Lib.
Added 8 full 5-stage comic arcs (Bureaucratic Spiral, Celebrity Entanglement,
Scientific Overreach, Municipal Feud, Animal Involvement, Cosmic/Metaphysical,
Corporate Rebrand, Grassroots Movement) in the seeded stories' deadpan voice.
pickEscalationArc() selects one deterministically via hashSeed(headline+category),
biased toward category-tagged arcs where sensible, falling back to the full
8-arc pool for "uncategorized". Same headline+category always yields the same
arc; different headlines usually land on different arcs. Stage 0 still echoes
the admin's raw headline verbatim (existing escapeHTML render path unchanged,
so user text is never injected unescaped). Seeded DEFAULT_STORIES untouched.

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

Files touched

Diff

commit e4c75194dbb6d3e36c8a47cf55eed9857727be92
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Sep 23 18:56:11 2026 -0700

    Give admin-created stories 8 distinct escalation arcs instead of 1 shared template
    
    synthesizeStages() previously wrapped every admin headline in the exact same
    five wrapper sentences, so any two admin stories were reskins of one Mad Lib.
    Added 8 full 5-stage comic arcs (Bureaucratic Spiral, Celebrity Entanglement,
    Scientific Overreach, Municipal Feud, Animal Involvement, Cosmic/Metaphysical,
    Corporate Rebrand, Grassroots Movement) in the seeded stories' deadpan voice.
    pickEscalationArc() selects one deterministically via hashSeed(headline+category),
    biased toward category-tagged arcs where sensible, falling back to the full
    8-arc pool for "uncategorized". Same headline+category always yields the same
    arc; different headlines usually land on different arcs. Stage 0 still echoes
    the admin's raw headline verbatim (existing escapeHTML render path unchanged,
    so user text is never injected unescaped). Seeded DEFAULT_STORIES untouched.
    
    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_011iuURMrsPBwAqMc5LgvFLH
---
 index.html | 205 +++++++++++++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 172 insertions(+), 33 deletions(-)

diff --git a/index.html b/index.html
index 66660c8..cad88c9 100644
--- a/index.html
+++ b/index.html
@@ -1515,41 +1515,180 @@ function tick() {
    admin-created stories fully participate in the ticker, the lead/secondary
    hierarchy, and the completion/meltdown logic. */
 
+// Eight distinct 5-stage escalation ARCS an admin headline can ride, each
+// with its own comic throughline (in the seeded stories' deadpan
+// wire-service voice) so admin-created stories no longer all reskin the
+// same five wrapper sentences. synthesizeStages() below picks one
+// deterministically per headline (hash-seeded, biased by category where it
+// fits) — same headline+category always yields the same arc, different
+// headlines usually land on different arcs. Stage 0 keeps the admin's
+// original headline verbatim as the anchor (matching the prior behavior);
+// stages 1-4 diverge per arc.
+const ESCALATION_ARCS = [
+  {
+    name: "Bureaucratic Spiral",
+    categories: ["politics", "scitech", "business"],
+    frames: [
+      { headline: (h) => h,
+        detail: () => "P24 has confirmed initial reports and forwarded them to the appropriate desk, which does not yet exist." },
+      { headline: (h) => `${h}, Confirms Newly Formed Committee Formed to Discuss Whether a Committee Is Needed`,
+        detail: () => "The subcommittee's first official motion was to schedule a meeting about scheduling meetings." },
+      { headline: (h) => `Internal Memo: "${h}" Escalated to a Working Group With No Chair, No Deadline, and No Objection`,
+        detail: () => "Sources say the working group's mandate is currently being drafted by a separate working group." },
+      { headline: (h) => `BULLETIN: ${h} — Now Requires Form 27-B, Which Does Not Yet Exist`,
+        detail: () => "The Office of Interdepartmental Review has requested a 90-day extension to review its own extension request." },
+      { headline: (h) => `${h}: Case Officially Closed, Reopens Immediately on Procedural Grounds`,
+        detail: () => "Historians say this will be, at best, a very long footnote with several attachments.",
+        conclusion: "This story has concluded. Its case number, filed in triplicate, has not." },
+    ],
+  },
+  {
+    name: "Celebrity Entanglement",
+    categories: ["entertainment", "sports", "business"],
+    frames: [
+      { headline: (h) => h,
+        detail: () => "P24 has confirmed initial reports. A publicist has already declined to comment on something no one asked about yet." },
+      { headline: (h) => `${h}, Now Somehow Involves a Minor Celebrity Nobody Can Quite Place`,
+        detail: () => "Reached for comment, the celebrity in question said only, \"Interesting that you'd bring that up,\" and hung up." },
+      { headline: (h) => `Sources: "${h}" Has Triggered a Feud Between Two Influencers Who Have Never Met`,
+        detail: () => "Both parties have posted vague statements \"addressing the situation\" without naming the situation, or each other." },
+      { headline: (h) => `BULLETIN: ${h} — Now Optioned for a Streaming Miniseries, Filming Before It's Actually Over`,
+        detail: () => "Casting is reportedly complete. The role of \"the situation itself\" remains unfilled." },
+      { headline: (h) => `${h}: A-List Narrator Confirmed for Documentary; Real People Involved Reportedly Fine With This`,
+        detail: () => "Historians say this will be, at best, a limited-series footnote with a strong soundtrack.",
+        conclusion: "This story has concluded. The rights have not." },
+    ],
+  },
+  {
+    name: "Scientific Overreach",
+    categories: ["scitech", "weather", "business"],
+    frames: [
+      { headline: (h) => h,
+        detail: () => "P24 has confirmed initial reports. A university press office has already issued a statement using the word \"preliminary\" four times." },
+      { headline: (h) => `Researchers Confirm "${h}" Is Real, Also Somehow Load-Bearing`,
+        detail: () => "The study's authors say more funding is needed, mainly to determine what, exactly, they just funded." },
+      { headline: (h) => `Peer Review Panel Split on Whether "${h}" Violates One or Several Laws of Physics`,
+        detail: () => "A minority report argues the laws in question were \"more like guidelines\" to begin with." },
+      { headline: (h) => `BULLETIN: ${h} — Prompts Emergency Symposium; Nobody Invited Can Attend on Short Notice`,
+        detail: () => "The keynote has been rescheduled twice, most recently \"due to the findings themselves.\"" },
+      { headline: (h) => `${h}: Findings Ruled 'Statistically Significant and Somewhat Alarming'; Follow-Up Study Already Delayed`,
+        detail: () => "Historians say this will be, at best, a footnote in a much stranger textbook.",
+        conclusion: "This story has concluded. Peer review has not." },
+    ],
+  },
+  {
+    name: "Municipal Feud",
+    categories: ["politics", "weather", "sports"],
+    frames: [
+      { headline: (h) => h,
+        detail: () => "P24 has confirmed initial reports. City Hall has scheduled a press conference to discuss scheduling a press conference." },
+      { headline: (h) => `${h} Sparks Rare Public Dispute Between Mayor and Deputy Mayor`,
+        detail: () => "Both officials issued statements agreeing on the facts and disagreeing, forcefully, on the font used to present them." },
+      { headline: (h) => `Neighboring Township Weighs In on "${h}," Somehow Makes It Worse`,
+        detail: () => "A rival town council has passed a nonbinding resolution \"strongly discouraging\" the entire situation." },
+      { headline: (h) => `BULLETIN: ${h} — City Council Meeting Runs Nine Hours, Resolves Nothing, Adjourns Amicably`,
+        detail: () => "Public comment period was extended twice, mostly for one resident with a laminated binder." },
+      { headline: (h) => `${h}: Two Cities Now Claim Jurisdiction; Neither Wants It Anymore`,
+        detail: () => "Historians say this will be, at best, a footnote in next year's zoning report.",
+        conclusion: "This story has concluded. The paperwork has not." },
+    ],
+  },
+  {
+    name: "Animal Involvement",
+    categories: ["weather", "sports"],
+    frames: [
+      { headline: (h) => h,
+        detail: () => "P24 has confirmed initial reports. A local animal has reportedly \"started showing up to things.\"" },
+      { headline: (h) => `${h}, Now Complicated by the Arrival of an Unusually Confident Goose`,
+        detail: () => "The goose has not been formally credentialed but has attended every subsequent briefing regardless." },
+      { headline: (h) => `Sources: Goose Involved in "${h}" May Have Been There First`,
+        detail: () => "Witnesses describe the goose's demeanor as \"proprietary.\" It has not commented, but it also hasn't left." },
+      { headline: (h) => `BULLETIN: ${h} — Animal Control Called, Declines to Get Involved, Cites 'Vibes'`,
+        detail: () => "The responding officer described the scene as \"technically outside our jurisdiction, spiritually.\"" },
+      { headline: (h) => `${h}: Goose Given Honorary Title, Situation Otherwise Unresolved`,
+        detail: () => "Historians say this will be, at best, a footnote next to a photo of the goose.",
+        conclusion: "This story has concluded. The goose has not been informed." },
+    ],
+  },
+  {
+    name: "Cosmic/Metaphysical",
+    categories: ["weather", "scitech", "entertainment"],
+    frames: [
+      { headline: (h) => h,
+        detail: () => "P24 has confirmed initial reports. Several sources describe a \"shift in the air\" that cannot be independently verified." },
+      { headline: (h) => `${h} Prompts Local Philosophy Professor to Ask 'But What Does It Mean, Really'`,
+        detail: () => "The professor has not yet answered his own question, but has scheduled office hours to discuss it further." },
+      { headline: (h) => `Sources: "${h}" May Be a Sign; Nobody Can Agree of What`,
+        detail: () => "A local astrologer says the timing \"checks out.\" A local statistician says it does not, but softly." },
+      { headline: (h) => `BULLETIN: ${h} — Now Being Discussed in Terms Usually Reserved for the Universe Itself`,
+        detail: () => "Analysts have begun using the phrase \"cosmically overdue,\" which nobody has defined but everyone understands." },
+      { headline: (h) => `${h}: Nation Agrees Something Has Shifted; No One Willing to Specify What`,
+        detail: () => "Historians say this will be, at best, a footnote in a much stranger book about the nature of footnotes.",
+        conclusion: "This story has concluded. The universe has declined to comment." },
+    ],
+  },
+  {
+    name: "Corporate Rebrand",
+    categories: ["business", "entertainment", "scitech", "politics"],
+    frames: [
+      { headline: (h) => h,
+        detail: () => "P24 has confirmed initial reports. A company spokesperson has already used the phrase \"exciting next chapter.\"" },
+      { headline: (h) => `${h}, Company Insists This Was 'Always the Plan'`,
+        detail: () => "An internal memo obtained by P24 refers to the plan as \"the plan we're currently coming up with.\"" },
+      { headline: (h) => `Sources: "${h}" To Be Addressed via Full Corporate Rebrand, New Logo Already Leaked`,
+        detail: () => "The new logo is reportedly the old logo, rotated 12 degrees. Focus groups call it \"a bold direction.\"" },
+      { headline: (h) => `BULLETIN: ${h} — Company Announces Restructuring; No One Can Confirm What Changed`,
+        detail: () => "An org chart circulated internally shows the same three boxes, connected by more confident arrows." },
+      { headline: (h) => `${h}: Company Declares Situation 'Resolved,' Unveils Slogan No One Asked For`,
+        detail: () => "Historians say this will be, at best, a footnote on a since-deleted press release.",
+        conclusion: "This story has concluded. The new slogan has not been trademarked." },
+    ],
+  },
+  {
+    name: "Grassroots Movement",
+    categories: ["politics", "sports", "entertainment"],
+    frames: [
+      { headline: (h) => h,
+        detail: () => "P24 has confirmed initial reports. A folding table with a clipboard has already appeared nearby." },
+      { headline: (h) => `${h} Inspires Grassroots Group to Form, Immediately Splinter Into Two Grassroots Groups`,
+        detail: () => "Both factions agree on the core issue and disagree, passionately, on the group's proposed bake sale." },
+      { headline: (h) => `Sources: Petition Regarding "${h}" Passes 10,000 Signatures, Several Belonging to Real People`,
+        detail: () => "Organizers describe momentum as \"undeniable,\" a word also used to describe the group's parking situation." },
+      { headline: (h) => `BULLETIN: ${h} — Peaceful Demonstration Held, Draws Modest Crowd and One Very Good Sign`,
+        detail: () => "The sign, widely praised, has since been credited with \"carrying the whole event.\"" },
+      { headline: (h) => `${h}: Movement Declares Victory; Unclear What, Specifically, Was Won`,
+        detail: () => "Historians say this will be, at best, a footnote next to a photo of the sign.",
+        conclusion: "This story has concluded. The folding table remains." },
+    ],
+  },
+];
+
+// Deterministically picks one of the ESCALATION_ARCS for a given admin
+// headline, biased (not restricted) toward arcs tagged for the chosen
+// category. Same headline + category always resolves to the same arc
+// (hashSeed is a pure function of the string); "uncategorized" or an
+// unrecognized category falls back to the full 8-arc pool.
+function pickEscalationArc(headline, categoryKey) {
+  const pool =
+    categoryKey && categoryKey !== "uncategorized"
+      ? ESCALATION_ARCS.filter((arc) => arc.categories.includes(categoryKey))
+      : [];
+  const candidates = pool.length ? pool : ESCALATION_ARCS;
+  const h = hashSeed(`${headline}|${categoryKey || ""}`);
+  return candidates[h % candidates.length];
+}
+
 // Layers escalating satirical framing onto an arbitrary admin headline so a
 // freeform story still progresses through the same 5-stage ladder in-voice,
 // without hand-authored per-story copy (which isn't possible for arbitrary
-// input). Each stage keeps the admin's original headline as the anchor and
-// wraps it in progressively more unhinged bulletin language.
-function synthesizeStages(headline) {
-  const frames = [
-    {
-      headline: (h) => h,
-      detail: () =>
-        "P24 has confirmed initial reports. Our sources describe the situation as \"developing, technically.\"",
-    },
-    {
-      headline: (h) => `${h} — And It's Already Getting Worse`,
-      detail: () =>
-        "Multiple unnamed officials now confirm what one napkin-based memo predicted hours ago.",
-    },
-    {
-      headline: (h) => `Sources: "${h}" Is Now Somehow Everyone's Problem`,
-      detail: () =>
-        "A task force has been formed to form a task force. Neither has met yet.",
-    },
-    {
-      headline: (h) => `BULLETIN: ${h} — Has Escalated Beyond Any Reasonable Framework`,
-      detail: () =>
-        "Analysts are reaching for words that don't normally appear in a weekday broadcast.",
-    },
-    {
-      headline: (h) => `${h}: Nation Agrees This Is Somehow Fine Now`,
-      detail: () =>
-        "Historians say this will be, at best, a footnote in a much stranger book.",
-      conclusion: "This story has concluded. Reality has not yet followed up.",
-    },
-  ];
-  return frames.map((f) => {
+// input). Picks one of the 8 ESCALATION_ARCS deterministically (see
+// pickEscalationArc) so different admin stories escalate in genuinely
+// different comic directions instead of one shared template. Each stage
+// keeps the admin's original headline as the anchor and wraps it in
+// progressively more unhinged bulletin language specific to the chosen arc.
+function synthesizeStages(headline, categoryKey) {
+  const arc = pickEscalationArc(headline, categoryKey);
+  return arc.frames.map((f) => {
     const stage = { headline: f.headline(headline), detail: f.detail(headline) };
     if (f.conclusion) stage.conclusion = f.conclusion;
     return stage;
@@ -1622,7 +1761,7 @@ function createStory(headline, categoryKey, opts) {
     offsetSec: state.elapsedSec,
     stageIndex: 0,
     lastUpdated: new Date().toLocaleTimeString(),
-    stages: synthesizeStages(headline),
+    stages: synthesizeStages(headline, categoryKey),
     article: { dek, photoCaption: "P24 illustration.", paragraphs },
   };
 }

← de89fd4 Stamp lastUpdated at state-entry, not in render; clear grid  ·  back to Crazy News Channel Shadowman  ·  Fix escalation-arc grammar: no run-on headline frames, no do 512c23a →