An operating system for a team of one

I build things of my own: the studio I founded, a mental-health app, a bilingual education site, some infrastructure.

For most of 2026 that has been a team of one plus several AI coding agents: Claude Code in one terminal, Codex in another, sometimes a review model reading over their shoulders.

The agents multiplied what I could ship, and for a while they multiplied the coordination beyond what chat could hold.

I did not set out to run several agents. The second one arrived the day I hit the usage limit on the first subscription with work still to finish. It stayed for a different reason: I had learned I could not fully rely on one agent’s account of its own work, so a second model started reading the first one’s output before I did.

That became the pair-review habit. Speed showed up last, and only once the rules existed: two or three agents on separate packets, with one orchestrator holding the context, get through in a sitting what used to take me a week.

The chaos had a shape. Every session started from zero. An agent would reopen a decision I had settled the week before. Scope grew in the gaps between messages. Something got “fixed” that I never asked to be touched. And the real record of what had happened lived in chat history that nobody, including me, was ever going to read again.

The fix was one decision and an operating model built on it: a written contract that every agent, in every tool, reads before it does anything. I call it the Agent Operating System, and this is how it works.

The one decision

Everything follows from one decision: files over chat.

Task state, session state, decisions, open arguments, hand-off notes: each lives in a file with a known name at a known path. Native tool files like CLAUDE.md or AGENTS.md are thin adapters that point at those files. Chat is where work is discussed. Files are where work is remembered.

Once that is true, a session in any tool starts the same way: read the project file, read the task list, read where the last session stopped, verify the repository state, report, and only then act.

We call it ss. Its mirror, sss, closes a session: update the task state, update the session file, update whatever durable notes changed, show me the list. The next session, in any tool, picks up from files rather than from memory.

Who decides what

Once the record lives outside chat, the model draws lines around decisions.

I own direction, scope, releases, priorities, trade-offs, and the final call when a debate is exhausted. Agents own technical analysis, sequencing, execution planning, and routine implementation decisions inside a plan I have approved.

A third list matters most: things an agent must never decide alone. Scope changes. Deployment and infrastructure changes with operational risk. Security posture. Irreversible data changes. Anything that overrides a decision already made.

When work touches that list, the agent stops and says so. The agents followed this boundary only after I wrote it down, and it has prevented the damage that hurts most: unreviewed changes to live infrastructure, a scope quietly doubled, a settled decision reversed in passing.

Outside the approved plan, nothing changes without asking, including the typo in a file the plan does not touch. “Obvious” is not a category. The cost of asking is one line; the cost of a well-meant fix in the wrong place is days.

One thing at a time

The communication rules came from use, and I wrote them for myself first. One question in front of me, not four. The result in two sentences; the audit trail goes in the log file. Nothing re-asked that I already approved. No urgency language unless something is on fire.

The rule governs questions and decisions, not execution. Agents work in parallel, each on a narrow packet, with an orchestrator holding the wider context.

Plan first, with an exit

The default workflow is strict: inspect, gather the missing context, write the plan, review it for gaps and risks, get explicit approval, execute only that scope, verify, update the records, leave the next restart point clear.

That rigidity broke in practice. Much of this work is small and reversible, and a written plan there is ceremony.

So the model defines a lighter mode, and defines it precisely: on a low-risk, reversible task, when I ask for it, the written plan, the review, and the formal approval collapse into a one-line stated intent and a go-ahead. Inspecting first, verifying after, and updating the record never drop. Naming the exception beat pretending it did not exist.

Safeguards I added later

Two other models reviewed the public edition and pointed at five holes. The rules that closed them:

An honest example

While building Mano, an offline mental-health app, one agent implemented the app lock and another audited security. The auditor found that the lock could never succeed on Android: the activity type was wrong.

It did not edit the file, because the first agent had claimed it. It wrote the finding, with evidence, into the discussion file and opened a task. The first agent picked the task up at its next checkpoint, wrote the revert step, and made the change.

Then the change broke the debug build: a guard I had asked for fired at configuration time for every build. The verification failed, which is a rollback trigger. Revert, record, fix properly in a second reviewed commit. After three review rounds the lock prompted correctly on a device, the automated flow test passed on both platforms, and the change shipped.

The recovery worked because ownership, verification, and rollback were already defined, in files, before anything went wrong.

The contract makes misbehaviour visible fast, and it lets me hold agents to the standard I want applied to my own work: plan, ask, verify, write it down.

The public edition is on GitHub under CC BY. Fork it, cut what does not fit, and if a rule fails you in a real session, tell me what happened; that is where the rules come from. The system works because the record survives the session, even when the agent does not.