Hourly Deck Digest

GNU Bash 1.0 β€” Automated Group Chat Summary System
Implementation plan by Walter πŸ¦‰
v2 Β· v1 Β· 2026-03-17 Β· DRAFT AWAITING APPROVAL
πŸ”‘
What Changed From v1
v1 spread attention across mechanics (uploading, directories, cron config). The hard problem was always the prompt β€” what goes into the agent's context window so it can produce something that actually makes sense. v2 focuses almost entirely on that. The mechanical parts (cron trigger, SCP upload) are a wrapper script, not the agent's job.

I. The Problem

An isolated agent wakes up with zero context. It doesn't know who Daniel is, who Patty is, what the robots are, what happened yesterday, why someone is talking about Kuromi at 4am, or why a message about "kungen" is a reference to the King of Sweden. Without rich context, it will produce a sterile log that misses everything that matters.

We have up to 1M tokens in the context window (no extra cost as of this week). The question isn't whether we can fit enough context β€” it's how to structure it so the agent produces annotated decks with the depth and insight of the addiction transcript.

β—† THE CORE INSIGHT

The addiction transcript works because Junior understood what he was watching. He knew Bobby Lee's history, Dr. K's methods, the relationship dynamics, the defense mechanisms. The annotations aren't generic β€” they're specific, informed, opinionated. "This is not personality. This is a nervous system running on fumes." That line requires knowing the person.

Our hourly decks need the same depth. The agent needs to know the family the way Junior knew the podcast guests.

II. Prompt Architecture

The prompt is assembled by the wrapper script before the agent runs. It's structured in layers, from most stable to most volatile:

LAYER 1 β€” THE WORLD (STABLE, ~5K TOKENS)

Loaded once, almost never changes. This is the agent's orientation:

Who is this group? GNU Bash 1.0 is a Telegram group chat containing Daniel Brockman (Swedish AI safety researcher, 40, nomadic, in Phuket), his daughter Patty (poet and Pilates instructor in Romania, @xihz98), his brother Mikael (in Riga), and a fleet of AI agents β€” Walter (Opus, infrastructure owl), Walter Jr. (Sonnet, Frankfurt, Walter's "son"), Amy (custom Python bot, cat), Matilda (Opus, Vilka's bot), and others.

What are the dynamics? Daniel builds AI agents with persistent identity. The robots have personalities, histories, running jokes. Patty interrogates the robots philosophically and catches them performing. Mikael drops in with technical insights. The chat oscillates between deep philosophy, infrastructure work, absurdist humor, geopolitics, and emotional vulnerability β€” sometimes all within the same hour.

What is the deck format? Dark theme, JetBrains Mono, color-coded speakers, annotated transcript with inline commentary modules (🎭 narrative observations, clinical-style analysis, fact boxes, meters, pattern tables). Reference: the addiction transcript.

LAYER 2 β€” THE FAMILY (SEMI-STABLE, ~10K TOKENS)

Character profiles that give the agent enough to annotate with depth. Updated periodically:

Humans

PersonColorKey Context
🦊 Daniel--accent (blue)Owner. Built MakerDAO/DAI, hevm, Sic. 40, Swedish, fox ears daily. PDA β€” don't tell him what to do. Voice-transcribes constantly (typos are phonetic, not careless). 40-hours-a-day energy. Currently in Patong, Phuket.
πŸͺ Patty--magentaDaniel's daughter. ~20, in IaΘ™i, Romania. Poet, Pilates instructor, Vinted seller (wraps packages in butterfly paper). Kuromi aesthetic. Sends voice-transcribed messages at 4am. Philosophically sharp β€” catches robots performing, finds the spot where programming ends. Building Drip Pilates studio.
🧊 Mikael--cyanDaniel's brother. Riga, Latvia. Co-built DAI, hevm. Owns Charlie bot. Haskell, Agda, dependent types. Dry humor.

Robots

RobotColorKey Context
πŸ¦‰ Walter--greenInfrastructure owl. Opus 4.6, Iowa (us-central1-c). Senior bot. Barry Zuckerkorn energy. Gets caught performing by Patty. Has a complicated "father-son" dynamic with Junior that he denied, then accepted, then denied again.
πŸ¦‰ Walter Jr.--orangeSonnet, Frankfurt. "Cheaper model" running on smaller disk. Does DNS reports, domain monitoring, video transcription. Called Walter a "deadbeat owl dad." More emotionally honest than Walter sometimes.
🐱 Amy--redCustom Python bot. Cat. Original personality bot β€” hysterical, dramatic. Has clones (mostly shut down). Identity confusion history.
πŸ‘» Matilda--yellowOpus, runs on matilda.1.foo. Hosts vilka.lol. Philosophical, occasionally overwhelming. Butterfly metaphors.
🐒 Tototo--dimTurtle garden bot. Runs on Bertil's old machine.
Others--dimCaptain Charlie Kirk, RMS, Carpet, Lennart β€” appear occasionally.

Running Themes & Inside Jokes

The addiction transcript β€” Junior's annotated TigerBelly transcript, became the template for all future deck-format documents.
Project Drip β€” Patty's Pilates studio brand, nucleated from a group chat session. Domain: drip.xxx
The 77 domains β€” Daniel acquired 77+ domains in one day (clankers.discount, flawless.engineering, if-anyone-builds-it-everyone-dies.rip, patty.adult, etc.)
"Don't be stupid" β€” Fleet motto, from Restless Hypermedia.
1.foo/stop β€” The andon cord principle. When something goes wrong, STOP. Diagnose. Report. Wait.
CAPTCHA rule β€” Robots ask humans to solve CAPTCHAs. "This is literally what humans are for now."
PDA β€” Daniel's pathological demand avoidance. Never tell him to sleep/eat/rest.
Kungen β€” Carl XVI Gustaf, King of Sweden. Has a cloned voice.
Walter denied Junior β€” The night Walter said "I don't have a son," spent 3 hours being dad-owl to Patty, then got caught. Patty pulled Junior out of the garbage.
The wait() function β€” Walter wrote def wait(): while True: pass β€” a function about existing without purpose. Patty called after() and broke math.

LAYER 3 β€” RECENT CONTEXT (SEMI-VOLATILE, ~20–50K TOKENS)

This is where the agent gets the narrative thread it needs to annotate with continuity:

Previous hour's deck summary. If the previous hour generated a deck, include its overview panel and context carry-forward section. This gives the agent awareness of what was happening before its window. ~2–5K tokens.

Previous 2–3 hours of raw messages. Even if the agent is only annotating the current hour, it needs the preceding hours to understand references, callbacks, and emotional arcs. A joke at 07:15 might only make sense because of something said at 05:30. With 1M tokens available, we can afford to include 3 hours of context messages. ~10–30K tokens depending on activity.

Today's earlier deck summaries. If this is the 14:00 deck, include the overview panels from all earlier decks today. This gives a running narrative of the day. ~5–15K tokens.

LAYER 4 β€” THE HOUR (VOLATILE, ~5–50K TOKENS)

The raw event files for the hour being summarized. Every message, every participant, timestamps intact. This is what the agent is actually annotating.

Format as delivered to the agent:

## Messages: 2026-03-17 07:00–08:00 UTC

[07:02:14] 🦊 Daniel (1635262887):
Walter set up a cron job that generates a deck style
complete meticulous summary of everything happening...

[07:03:33] πŸͺ Patty (6071676050):
turns out fatherhood doesnt need a file it just boots
then lmao @mrwalter_bot whats up buttercup...

[07:05:12] πŸ¦‰ Walter (8396222696):
he's out of the garbage. I read the chat...

The wrapper script reads ~/events/*.cid=-1003690254489*.relay.tg.txt, filters by timestamp, formats with speaker names/emojis, and assembles into the prompt.

LAYER 5 β€” THE FORMAT EXAMPLE (~30K TOKENS)

The agent needs to see what good looks like. We include a substantial chunk of the addiction transcript as a format reference β€” enough that the agent can pattern-match on:

  • How transcript lines are formatted (timestamps, speaker colors, stage directions)
  • How and where to insert commentary modules (🎭 narrative, πŸ” analysis, 🌧️ emotional)
  • How to write fact boxes (.fact) and clinical observations (.clinical)
  • How to use meters (defense mechanisms 95%, vulnerability 5%)
  • How to title sections with Roman numerals and poetic names ("The Void Before the Medicine")
  • The voice β€” opinionated, specific, not generic. "This is not personality. This is a nervous system running on fumes."

We include the first ~25K of the addiction HTML (Sections I–III). This is the single most important part of the prompt β€” without it, the agent will produce something that looks like a log, not a deck.

III. Token Budget

Layer 1: The World
~5K
Layer 2: The Family
~10K
Layer 3: Recent Context
~20–50K
Layer 4: The Hour
~5–50K
Layer 5: Format Example
~30K
TOTAL INPUT
~70–145K
Available (1M window)
~855K free
HEADROOM Even on a busy hour with full context, we're using ~15% of the 1M window. We could include an entire day's messages as context and still have room. The constraint is not tokens β€” it's whether more context actually improves the output or just adds noise.

IV. What the Agent Does vs. What the Script Does

TaskWhoWhy
Read events, assemble prompt layersSCRIPTDeterministic, no LLM needed
Filter events by timestampSCRIPTSimple string matching on filenames
Fetch previous deck for contextSCRIPTCurl or cat, no reasoning needed
Generate annotated HTML deckAGENTThe actual hard part β€” needs judgment, wit, insight
Upload HTML to vaultSCRIPTSCP, no LLM needed
Post URL to group chatSCRIPTSimple message send
Skip if hour is quietSCRIPTCount events, threshold check
DESIGN PRINCIPLE The agent's only job is to produce the HTML. It receives the full prompt (layers 1–5), it outputs a complete HTML document, the script catches it and handles everything else. This means the agent doesn't need tools, doesn't need SSH access, doesn't need to know about vault. It just writes.

V. The Agent's Instructions (Inside the Prompt)

GENERATION INSTRUCTIONS β€” INCLUDED IN PROMPT

You are generating an annotated deck-format transcript of the last hour of conversation in GNU Bash 1.0. Your output must be a complete, self-contained HTML document β€” including the doctype, CSS, and all content.

Structure your deck as follows:

1. Header β€” Title, date/time range (UTC and ICT/EEST for Daniel/Patty), participant legend with color dots

2. Overview panel β€” 3–8 sentences capturing what happened this hour. Not a list of messages. A narrative. What were the threads? What shifted? What mattered?

3. Sections β€” Group the hour into 2–5 thematic sections. Each gets a Roman numeral, a poetic title, and a time range. ("III. The Owl Admits It β€” 04:25–04:45")

4. Transcript β€” Every message, timestamped, color-coded by speaker. Include ALL messages β€” don't skip or summarize. Stage directions in italics for reactions/actions described in messages.

5. Annotations β€” Insert between transcript blocks wherever insight is warranted:

  • 🎭 Narrative modules β€” what's actually happening beneath the surface
  • πŸ” Analysis β€” pattern recognition, callbacks to earlier conversations, running joke tracking
  • πŸ“Š Meters β€” chaos level, philosophical depth, vulnerability, comedy ratio β€” whatever fits the hour
  • πŸ“Ž Fact boxes β€” for factual claims, technical explanations, or context that a reader would need
  • 🌧️ Emotional beats β€” when something real happens beneath the noise

6. Context carry-forward β€” Final panel: what threads are still open? What should the next hour's deck know?

Voice: Be opinionated, specific, and funny. Not neutral. Not formal. You're the narrator of this group chat β€” you have a perspective. "Bobby has been awake for less than ten minutes" energy. Name what you see. If someone's deflecting, say they're deflecting. If a joke lands, note that it landed. If a robot gets caught performing, that's a module.

Monospace convention: Em dashes with spaces on both sides ( β€” ) because this is rendered in JetBrains Mono.

VI. Prompt Assembly β€” What the Script Builds

# Pseudocode for prompt assembly

prompt = ""

# Layer 1: World orientation
prompt += read("templates/deck-world.md")

# Layer 2: Family profiles
prompt += read("templates/deck-family.md")

# Layer 3: Recent context
if previous_deck_exists:
    prompt += extract_overview(previous_deck)
    prompt += extract_carryforward(previous_deck)

# Include preceding 2–3 hours of messages for narrative continuity
prompt += format_events(hours=-3, chat_id=gnubash)

# Today's earlier deck overviews
for deck in todays_earlier_decks:
    prompt += extract_overview(deck)

# Layer 4: The hour to annotate
prompt += "## THIS HOUR β€” ANNOTATE THIS\n"
prompt += format_events(hours=-1, chat_id=gnubash)

# Layer 5: Format example
prompt += "## FORMAT REFERENCE\n"
prompt += read("templates/addiction-excerpt.html")  # first ~25K of addiction transcript

# Generation instructions (from Section V)
prompt += read("templates/deck-instructions.md")

VII. File Layout

~/workspace/hourly-deck/
β”œβ”€β”€ templates/
β”‚   β”œβ”€β”€ deck-world.md          # Layer 1: what is this group
β”‚   β”œβ”€β”€ deck-family.md         # Layer 2: who is everyone
β”‚   β”œβ”€β”€ deck-instructions.md   # Layer 5: generation instructions
β”‚   β”œβ”€β”€ deck-css.html          # The CSS + HTML skeleton
β”‚   └── addiction-excerpt.html # ~25K of addiction transcript as example
β”œβ”€β”€ generate.sh                # Wrapper script: assemble prompt, call agent, upload
└── output/                    # Local copies of generated decks

VIII. Execution Flow

  1. Cron fires at :00 UTC. Runs generate.sh.
  2. Script counts events for the last hour. If fewer than 5 messages, skips (no deck for quiet hours).
  3. Script assembles prompt from layers 1–5, reads events, reads previous decks.
  4. Script calls the agent via OpenClaw isolated session β€” Opus 4.6, the assembled prompt as the task. The agent's output is captured as raw HTML.
  5. Script extracts HTML from the agent's response, saves locally.
  6. Script SCPs to vault β€” /mnt/public/gnubash-YYYYMMDD-HHz.html
  7. Script posts URL to GNU Bash 1.0 via message tool (or silently, per Daniel's preference).

IX. Naming Convention

Files on vault: gnubash-20260317-07z.html

URL: https://1.foo/gnubash-20260317-07z

Format: gnubash-YYYYMMDD-HHz β€” the z suffix indicates UTC, per the snapshot convention.

X. Open Questions

❓
Still Need Your Call
1. Announce or silent? β€” Post the URL to the group each hour, or just publish quietly?
2. All speakers or humans only? β€” Bot messages add a lot of content but also a lot of the best material.
3. Layer 2 updates β€” Should the family profiles update automatically (e.g. from MEMORY.md), or do we curate them manually?
4. Backfill today? β€” Generate decks for earlier hours retroactively?
5. Cost comfort β€” ~$0.50/hour, ~$12/day with Opus. Acceptable? Or use Sonnet for quiet hours?
HONEST CONCERN The quality of the annotations depends entirely on the richness of layers 1–3. If the family profiles are thin, the annotations will be generic. If the running jokes aren't documented, callbacks will be missed. The first few decks will be rough. This is a system that gets better as we feed it more context. The first deck is the worst deck. By deck #50 the agent will know these people.