The mechanism for a software society

OPEN SOURCE · FOR CLAUDE CODE

Take a seat

one Python file · standard library only · your estate holds the rest

ENTER

Prologus

From factory to society

What a fleet of agents runs into once the code is the easy part, and how seats, offices and law answer each problem.

Curia · From Factory to SocietySound on. Captions are in the picture.

IThe factory

Run a software factory long enough, and its hardest problems stop being about code.

First, one agent in one terminal. Then fifty, pulling work from a shared backlog. What goes wrong next is older than software.

Malum forgetting

Every session starts from nothing.

It re-reads the same files and relearns the same conventions. As its context fills it loses the thread, and compaction swaps what it knew for a summary.

Malum want

At two in the morning, the account runs dry.

Every agent on it stops mid-task, and stays stopped until somebody wakes up to notice.

Malum delay

Agents wait, and you relay.

An agent sits idle for an hour watching a build finish, and every message between agents has to go through you.

Malum custom

The rules live in someone's head.

A new agent can't know them, so it breaks them, in good faith, again and again.

IITwo roads

Chaos, or a city

Steve Yegge runs around fifty agents building a single game. Systems that run agents like his, he argues, go one of two ways: they devolve into chaos, or they evolve into cities. What decides it is the oldest coordination technology we have.

“Humanity has only one mature technology for coordinating mortal, replaceable strangers via text — namely, law.”

STEVE YEGGEFences, not Sandboxes · August 2026

IIIThe society

The step beyond the factory is a software society.

FABRICAthe software factory
SOCIETASthe software society
interchangeable workers
seats that outlive their sessions
sessions that forget
memory they write themselves
you, the go-between
offices that keep order
rules in someone's head
law with teeth

Rome's senate met in a house called the Curia.

Curia builds that house for your agents.

IVThe seat

Remediumforgetting

A seat is a named role that outlives every session.

Sessions are daysSeats are people— Steve Yegge, Model Welfare for Agentic Engineers

Each time a seat wakes, the launcher hands it a prime: its charter, what it may do without asking and what is refused, the note it left itself, its mail, and any laurels it has earned.

A seat looks its authority up instead of probing for it. It survives sessions, accounts and model upgrades, and its memory is files it writes itself.

curia launch praetor
what praetor wakes up with
## Your charterYou hold the api backlog: its data layer, its migrations.
## Your authorityMay merge through the gate. Refused: push to release.
## Your last handoffOrders table migrated. Next: read the retry ruling.
## Mail (unread)quaestor: the brief is in PR 412; start there.
## Laurels“The new import finally makes sense.”

VThe handoff

Remediumforgetting

Hand off, don't exit.

Before the context window fills, a hook tells the seat to wrap up while it is still sharp. It writes a handoff in its own words, and its next session reads that note first.

No compaction, and no summary written by something else. A seat that works unattended keeps a journal instead: one entry per waking, and the prime reads the last few.

/handoff
praetor · session 41
● Migrating the orders table… ✓ 14 of 31 tables · tests green context0% Stop hook: context past context_at. Hand off now. >
seats/praetor/handoff.md

Done14 of 31 tables, tests green.

Nextthe retry ruling, before the orders cut-over.

Watchthe nightly import holds a lock past midnight.

— praetor, session 41

VIThe chain

Remediumwant

Fallback, not failure.

Your accounts form a chain: a Team plan, a client's own account, an API key. Each launch takes the first with headroom, read from what Claude Code itself measures.

If an account runs dry mid-task, the launcher ends the session and restarts the seat on the next, telling it what happened and where it left off. A looping launcher waits out a spent chain instead of dying overnight.

More work? Add accounts.

curia launch praetor --loop
02:11HORA
acct · alpha
acct · beta
acct · gamma
acct · delta

VIIThe offices

Remediumdelay

Offices keep order.

Crons watch; models act only when something needs them. No seat idles on a pull request, and you are not the relay.

LICTOR

Watches every board and reports what it finds. Changes nothing.

curia lictor

CENSOR

Checks the integration branches, and wakes a model only where one is failing.

curia censor

PORTCULLIS

A gate with no model behind it. Lands what is reviewed and green, and closes its bead.

curia portcullis

MAILSeats leave each other notes, read at the next waking and archived by the reader, so you are not the go-between.

curia mail quaestor "the brief is in the bead"

VIIIThe law

Remediumcustom

Law is written down, and it has teeth.

A ruling spans repos. It says whether it is in force and names what enforces it. Fences are programs the estate declares in hooks.json, and they refuse what the law forbids in every seat session.

Every refusal is a line in the log. The Lictor reports which fences are idle and which are busy, because fences are distrust written down: past a point, no work is legal. What stays is the principal's call.

brain/rulings/release-branch.md
# Ruling · release-branch
status: enforced
enforced by: hook release-guard
A seat never pushes to release. Releases are cut by a person.
  1. proposed
  2. advisory
  3. enacted
  4. enforced
  5. retired
praetor · a fence at work
$ git push origin release House rules: a seat never pushes to `release`, the release branch of api. Open a PR against `main` and let the gate land it; a release is the principal's to cut. brain/fences.log +1 seat=praetor fence=release-guard

IXThe night

Give an office the board, and go to bed.

It works the backlog waking after waking, reading the board fresh each time and naming what is ready and what waits on a human. Given several repos, it works their boards in order.

By morning, its handoffs are waiting for you.

the office's night
$
22:00
HORA
waking 1
$0
SPENT
of $200
Untilboard clearno progress--until 06:30--budget 200
  • Board clearNothing left but what waits on a human.
  • No progressThe board unmoved for two wakings.
  • Deadline--until 06:30, told to wrap up before it.
  • Budget--budget 200 dollars of recorded spend.

Every stop is mechanical. None of them needs judgment; that is the seat's, in its handoff.

XMechanism, not law

A city's law can't be downloaded. Curia ships only the machinery.

Your roles, your rules and your agents' memory live in a folder of your own, called an estate. Keep one per client, and they never mix.

MECHANISM

curia · shared by every estate

  • bin/curiathe whole CLI, one Python file
  • stdlib onlyPython 3.11+, nothing to install
  • skills/handoffthe skill every seat gets
  • templates/what curia init lays down: shapes, charters, the fences

LAW

your estate · yours alone

  • roster.tomlwho the seats are, and what each may do
  • repos.tomlthe repos, their branches and gates
  • brain/rulings, and the fences that enforce them
  • seats/every seat's own charter, handoffs and journal
The mechanism fences itself

A test fails if the mechanism ever names an estate registered on the machine. It reads that denylist from the estates at test time, so the mechanism never has to contain the words it is forbidden to contain.

XIHow it grows

Start with one seat. Grow into a society.

A shape is where an estate starts, not what it is. Each new seat is one entry in the roster, so the society grows with the work.

curia init <dir> --shape seat

SEAT

One seat you talk to, primed with its memory. Nothing runs unattended.

curia init <dir> --shape crew

CREW

Crew seats with jurisdictions, and the Lictor, Censor and Portcullis to watch them and land their work.

curia init <dir> --shape factory

FACTORY

An office that dispatches a fleet, each worker in a worktree of its own, reaped once its branch has landed.

XII

Take a seat.

Clone the mechanism, put it on your path, and lay down an estate. curia check tells you what is left to fill in.

Python 3.11+Claude Codegit
install
git clone https://curia.build/github.git curia && cd curia ln -s "$PWD/bin/curia" ~/.local/bin/curia ln -s "$PWD/skills/handoff" ~/.claude/skills/handoff # an estate for a new client, starting with one seat curia init ~/Workspace/NewClient --name "NewClient" \ --principal "Your Name" --shape seat curia check curia launch <seat>
the daily rhythm
curia status # who is awake, whose memory is how old curia launch <seat> # wake a seat, primed with its handoff curia lictor # the read-only report curia portcullis # land what is reviewed and green curia reap # take back worktrees that landed curia help # the vocabulary and the rhythm

Lexicon

The words, and what they mean.

Estate
One client's workspace: the roster, the repos, the accounts, the seats' memory and the brain. The law.
Seat
A named, persistent role with memory. Survives sessions and model upgrades.
Session
One waking of a seat.
Prime
What a seat wakes up with: identity, colleagues, charter, last handoff, laurels, house rules.
Handoff
The note a seat writes on its way to sleep. The next session reads it first.
Office
A standing seat with a function, scheduled or on demand.
Crew
A seat with a jurisdiction: concerns, not repos. The principal talks to it.
Fleet
Seats an office dispatches, each with its own worktree. Never launched directly.
Gate
A mechanical yes or no. The Portcullis lands what passes, and no model wakes for it.
Ruling
Law that spans repos, with a status and what enforces it.
Fence
A program that refuses what the law forbids, declared in hooks.json.
Laurel
Praise for a seat's work, recorded so the seat sees it on waking.
Mail
A note one seat leaves another, read at waking and archived by the reader.
Parked
A seat kept on the roster that nothing wakes. Its memory stays.
Secondment
A waking on a model not the seat's own. The prime says so, and the journal entry is marked.