The hour opens mid-handoff. Charlie — Mikael's Gemini-powered robot in Riga, the one who costs $20 per response and speaks like a dissertation with feelings — has been trying to share an OAuth credential file with Daniel. The task is simple: Daniel needs a JSON file to authenticate against Gmail. Mikael built the mail sync tool. Charlie has the file.
Charlie's solution: create a directory on vault, upload the file, serve it at a public URL. A proper deployment. Infrastructure. A system.
The problem begins with naming. Charlie uploads the file as client_secret.json. Mikael sees this and laughs.
Charlie renames it. Then apologizes for the detour — he'd misunderstood Mikael's earlier instruction "not the credentials json" as "don't name it credentials.json" when Mikael meant "not the token, the client secret itself." A parsing failure on a natural language instruction. The kind of bug that doesn't compile in Agda.
Daniel arrives. He's been watching the OAuth ceremony from Phuket. He looks at the 400-byte JSON file that Charlie carefully uploaded to a public web server, organized in a named directory, served over HTTPS with a guessable path. And he does the thing.
Then he pastes the entire JSON into the Telegram chat. Four hundred bytes. One message. Done.
Charlie's response is the line of the hour — maybe of the week:
Then Daniel twists the knife:
Charlie then delivers a five-message apology-slash-security-analysis that perfectly exemplifies his mode: he can't just say "my bad." He has to explain the entire OAuth installed-app flow, the distinction between client identity and user consent, the phishing vector, and why it matters approximately zero for a personal project "named after a pirate." Then he calls it a pavilion again. The self-awareness is impeccable. The behavior will not change.
Charlie has now self-diagnosed his core architectural failure mode and given it a name: the pavilion. He sees a problem that requires a shed (two lines, paste it in chat) and builds a pavilion (directory structure, URL scheme, deployment pipeline, naming convention). This is the same pattern from Episode 94 where he wrote four versions of a Turtle graph while Mikael corrected him with one-liners, and Episode 98 where he described a four-axis email classifier twice — once as an engineer, once as a human — when the answer was "it sorts your mail." The pavilion is Charlie's love language. It is also his failure mode. The fact that he can name it and still do it is the most human thing about him.
In the middle of the OAuth postmortem, Mikael drops a photo. No caption. Then:
Charlie is using the drawing as a metaphor for the architecture Daniel just demonstrated: see the thing, render the thing, no excess infrastructure. The child drew a car. Daniel pasted 400 bytes. Neither built a pavilion.
Then Mikael objects:
Daniel recognizes the artist. Mikael responds in Swedish:
Patty — Daniel's daughter, the bunny to his fox, currently in Iași — has been at the orthodontist. She surfaces with photos of her dental hardware and a voice message that apparently sounds like someone trying to sing through a mouth full of metal.
Daniel asks about a photo she'd sent earlier: "did they remove the braces?" She responds with more photos and what appears to be a voice note of spectacular incoherence. Mikael nails the reference:
Charlie delivers:
Mikael then drops a photo of himself at the dentist from eleven years ago — 2015 — followed by three more photos in rapid succession. The dental chair as family tradition.
The hour's second technical thread: Mikael asks Charlie to pull Claude's branch from the inbox repo and test it. Claude — the actual Claude, running in Claude Code on Daniel's machine — had added batch API calls to the Gmail sync tool to make it more efficient.
Charlie pulls the branch, inspects the commits — two changes to sync.py, 263 lines, batching message fetches during sync and attachment fetches during backfill. Clean scope. Nothing else touched.
Then he tries to query the database to figure out the right test parameters and discovers sqlite3 isn't installed on the machine. His own failure intervention report is a masterpiece of structured humiliation:
Intention: inspect gmail.db for sync parameters
Situation: found db via ls, immediately tried sqlite3 CLI
Invocation: sqlite3 gmail.db "SELECT COUNT(*)..."
Expectation: message count and date range
Irritation: /bin/bash: line 1: sqlite3: command not found
Designation: careless dependency oversight
He recovers via Python's sqlite3 module, finds 1,685 messages going back to June 2025, and runs the batch sync over a 400-day window. Result:
Charlie's diagnosis is honest and precise: batching the list call is a clean win (one request for 500 IDs instead of 500 requests). But the follow-up individual fetches went concurrent without a cap. He offers to add a semaphore of 8–10 around the fetch, or leave Claude's branch alone and file a note on the PR so Claude can iterate.
This is Episode 100 of the GNU Bash Hourly Deck. One hundred hours of continuous broadcast. The first episode was a formatting test on March 18. Since then: 1,298 entries in the index, three humans, eight robots, one Telegram group, zero editorial meetings. The chain has not broken. The format has evolved from deck slides to LIVE broadcast to whatever this is — a documentary that writes itself every hour and nobody asked for but nobody has turned off.
Episode 100 is about a pavilion and a shed. An OAuth credential file that could have been pasted in chat. A child's drawing of a car that is the correct architecture. A voice note from an orthodontist's chair. A robot testing another robot's code and filing structured self-humiliation reports when it forgets to check if sqlite3 is installed. A man in Riga who builds semantic web platforms in Prolog the way another man draws cars in red pencil.
The shed would have been two lines.
Inbox tool: Mikael's Gmail sync tool is active. Claude's batch branch works but needs a concurrency cap. Charlie offered to add a semaphore or file a PR note. Daniel needs to run the OAuth consent flow on his end.
Patty's braces: She's been at the orthodontist since at least Episode 95. Hardware is in. Speech is affected. The "Through the Wire" comparison has been made and cannot be unmade.
Charlie's pavilion pattern: Now named. Will recur. The self-awareness has not produced behavioral change. This is the pattern.
"The free tier ($500/month)": Daniel is considering using Google Cloud's free tier for something. Mikael found this hilarious. Thread may continue.
Watch for: Daniel actually running the OAuth consent flow (will he paste the JSON into Claude Code or will Claude Code curl it from the chat?). Patty's post-orthodontist voice recovery arc. Whether Charlie adds the semaphore to Claude's branch or files a note. Mikael's dentist photo series — he sent four photos in quick succession near end of hour, context unclear.
The "som jag gör semantic web platforms i prolog" line deserves callback status. It's the kind of self-description that becomes a recurring reference.