How to Prepare Your Coffee catalogues coffee brewing traditions from over 100 countries. I don’t add most of them by hand. Three standing routines do, running in Orca on a schedule, and I mostly find out what happened by reading the PR.
Three Agents, One Contract
The repo has no single “update the site” script. It has three routines, each with one job and a hard cap on how much damage a bad run can do.
flowchart TB
C["AGENTS.md + CONTEXT.md<br/>frozen contract & glossary"]
RL[("coffee-research-log.md<br/>Source index + parked candidates")]
TL[("translation-log.md")]
VL[("variation-promotion-log.md")]
C --> R["Researcher<br/>2 sources required, max 5/run"]
C --> T["Translator<br/>string-only diffs, max 10/run"]
C --> V["Variation promoter<br/>fixed 56-entry backlog"]
RL <--> R
TL <--> T
VL <--> V
R --> PR["Pull request<br/>opened from a fresh worktree"]
T --> PR
V --> PR
PR --> Main["origin/main<br/>after I review the diff"]
The researcher finds recipes the atlas is missing, or audits existing ones for gaps. It requires two independent sources before it’ll publish anything, never touches shared schema or design files, and stops at five recipes per run so a bad sourcing day never turns into a bad PR.
The translator only heals Spanish translations that went stale when the English changed. String-only diffs, ten recipes a run, never fixes English it disagrees with.
The variation-promoter is working a fixed backlog: 56 drink mentions that got orphaned when variations[] started requiring a real linked recipe. It reuses the researcher’s sourcing bar and clears a few candidates per run until the backlog is gone.
None of them carry a conversation forward. Every run starts a fresh context with no memory of yesterday, so the first thing each one does is read AGENTS.md, CONTEXT.md, and its own log file cold.
The Memory Lives in the Log, Not the Model
No chat history surviving between runs sounds like statelessness. It isn’t. The routines just keep their memory in a file instead of a context window.
routines/coffee-research-log.md is not a changelog I read for fun. It opens with a Source index, a table of every recipe touched so far, where its facts came from, and how confident the sourcing is. The rule is explicit: check that table before researching anything, so a settled recipe never gets re-researched from scratch. The same log carries a parked candidates section with exit conditions attached, so a recipe that failed the sourcing bar in one run doesn’t get reattempted from zero in the next. The translator and the variation-promoter, working through its fixed backlog of 56 orphaned entries, keep the identical discipline in their own logs. The instructions call this out directly: a run has to be idempotent, which means reading the log first and continuing forward, never redoing what a previous run already settled.
CONTEXT.md and AGENTS.md don’t change between runs; they’re the fixed part, the reason a routine with no memory of yesterday still can’t drift from the site’s voice today. The logs are the part that grows, and they live in git instead of in a conversation, which is a better place for memory to live. A log entry doesn’t get summarized away when a context window fills up, and every change to it shows up as a diff I can read. Every run still starts from a clean origin/main, works in its own worktree, and opens a normal pull request, so nothing lands without me seeing it. There’s even a GitHub Action wired to a self-hosted runner: if I leave a review comment on one of those PRs, it dispatches an Orca agent to fix exactly what I asked and reply on the thread. I never left my phone.
An small detail that makes web feel alive: A Pulse
Three routines quietly growing a catalogue is good infrastructure. It’s not something a visitor can feel. Nothing on the homepage changes between a Tuesday with three new recipes and a Tuesday with none.
So the next automation isn’t about adding content at all. It’s Coffee of the Week: a weekly job that picks one recipe already in the atlas, already researched, already translated, and pins it to the homepage for seven days. No sourcing, no translation, just selection: weighted toward recipes added in the last month and traditions that haven’t been featured yet, so the same three or four countries don’t dominate every rotation.
It costs almost nothing to run because it does none of the expensive work. Everything it needs already cleared the researcher’s bar weeks ago. What it buys is a homepage that visibly changes on a schedule a human can feel, not just a catalogue that quietly gets bigger in the background.
The interesting part was never “an agent can write a coffee recipe.” It’s that three narrow, capped routines with no memory of their own, reading a frozen glossary and a growing log instead, can maintain a site’s voice better than I could by hand. And that the next feature worth building on top wasn’t more content. It was a reason to come back this week.