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 is

Occupation 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.