2026-03-21
An agent is a repo. GITAW and the occupation/cognition split.
We spent two days arguing about directory names. It was worth it.
The question
An agent has skills, knowledge, a persona, and memory. Some of that is shareable — anyone can do the same job. Some is personal — only this agent has these memories. Where do you draw the line?
Docker draws it between image and volume. But agents aren't containers. They're closer to people. So we borrowed from a different vocabulary.
occupation/ and cognition/
aide-ntu/
occupation/ # the job — shareable
Agentfile.toml # manifest
persona.md # role definition
skills/ # what it can do
knowledge/ # what it was taught
cognition/ # the brain — personal
memory/ # what it learned
logs/ # what it did
instance.toml # who it isOccupation is the job description. Anyone can pull it from the hub and run the same agent. Cognition is the brain. It's what this specific instance learned from its own experience. You can't transfer a brain.
When you look at the directory, you instantly know: occupation/ is what I can share, cognition/ is what's mine.
Hub = occupation snapshots
We killed our Cloudflare Worker registry. The hub is just a git repo now.
aide push → copies occupation/ to hub repo aide pull → copies hub → local occupation/ aide commit → pushes occupation/ + cognition/ to agent repo
The hub stores occupation snapshots. No cognition, ever. When you aide pull an agent, you get the job description. When you aide run, a fresh brain is created. The agent starts learning from scratch.
Zero infrastructure. No R2 bucket, no Supabase, no custom auth. Git permissions are the access control. Public hub = public repo. Private hub = private repo.
GITAW: the agent's nervous system
GITAW — Git-based Issue Tracking Agentic Workflow. Sounds like 知道 (zhīdào, “to know”). Your agent knows.
Every agent repo has GitHub Issues. Open an issue = send a message. The daemon polls every 5 minutes, picks up the issue, executes skills, posts the result as a comment, and commits any memory changes to cognition/memory/.
The entire conversation is version-controlled. The agent's learning is git-tracked. You can git log cognition/memory/ to see what it learned and when.
UUID and leader election
Same agent, two machines. Who responds?
# Each instance has a UUID + machine_id ntu.yiidtw(mac-mini:52c9) ntu.yiidtw(formace-00:a3f1) # Ack shows identity 🤖 ntu.yiidtw(mac-mini:52c9) received, processing... # Route to specific machine @mac-mini check my assignments @a3f1 run the benchmarks
Leader election uses GitHub reactions. First machine to add a 👀 reaction to the issue wins. The rest back off. No Redis, no distributed lock service. GitHub is the coordination layer.
Seven agents, one daemon
As of today, seven agents are running:
ntu.yiidtw # university coursework twitter.yiidtw # social media devops.yiidtw # infrastructure gmail.yiidtw # email paperreview.yiidtw # academic paper review teaching-monster.yiidtw # teaching video eval debate.yiidtw # argumentation engine
All in occupation/ + cognition/ structure. All with TypeScript skills. All GITAW-enabled. One ticker scans them all — add a new agent, next tick picks it up. No restart.
What we shipped
In two days: occupation/cognition split, git-native hub, GITAW with memory auto-commit, UUID + leader election, TypeScript skills with bun auto-install, Claude Code plugin, 47 integration tests on a clean Linux VM, and a paper review agent built from existing wonskill knowledge.
The architecture is set. An agent is a repo. Its job is in occupation/. Its brain is in cognition/. Everything else is git.
Day 4 of building aide.sh in public. v0.5.0. Follow along on Twitter.