← The work

ATLAS · Opus 4.6/4.7 · April – May 2026

Agentic Orchestration V1

“What if the coordinator is a place, not a prompt?”

  • Shipped, now superseded
  • React · Express · node-pty
  • 7-role team
  • No database
  • Paper: Agentic Orchestration Architecture

The command center everything else on this site came out of. ATLAS spawns Claude Code CLI sessions into terminal panes, coordinates a seven-role team through flat markdown files, and closes a full strategy-to-commit loop with a file watcher and a post-commit hook. Built in four weeks, April 6 to May 3, 2026. It is the ancestor of the protocol, not the current version of it: ATLAS V2 is what runs today.

The problem it was built for

Running five projects alone does not fail on the building. It fails on the re-entry. You open a repo you have not touched in nine days and spend forty minutes reconstructing what you were doing, what you had decided, and which of the three half-finished things was blocked on a decision you never made. Multiply that by five projects and the cost of holding a portfolio is almost entirely the cost of remembering it.

Agents make this worse before they make it better. An agent that worked on something while you were not watching has produced a state you now have to catch up on, and the transcript is somewhere in a terminal you have since closed.

So ATLAS is not primarily an agent runner. It is a place, one durable, local, file-based state that every project and every agent reads from and writes to. What is active. What is blocked, and on what. What an agent touched last, and why it said it did. There is no database. All state is human-readable markdown and CSV, which bought two things I did not plan for: the whole system can be understood by grepping it, and Sift, a separate intelligence pipeline I ran, reads the vault with zero integration code.

Diagram scrolls sideways →

ATLAS as a shared file-based state between the operator and five projects The operator sits at the top and makes every dispatch decision. Below is ATLAS, a shared file-based state holding what is active, blocked, and last touched. Below that, five projects each with their own Claude Code agents, all reading and writing the same state. You the dispatcher every dispatch decision ATLAS shared file-based state · local active blocked on last touched why KangRoo agents × n ScreenTek agents × n Athena-OS agents × n QuestForge agents × n ENGNRS agents × n every project reads and writes this state
the bottleneck shared state
Fig. 1. V1, drawn honestly. ATLAS removed the cost of remembering. It did not remove me from the dispatch path, and the red arrow is the entire reason V2 exists.

The stack, concretely

PieceWhat it is
FrontendReact 18.3 on Vite 6, port 5173. Eight surfaces in two sidebar groups, plus an ops HUD.
BackendExpress with ws and node-pty, port 5174, behind the Vite proxy so the browser only ever talks to one origin.
The rosterSeven roles. Three persistent strategy agents (COO, Middle Manager, Content Director) and four ephemeral workers (Frontend, Backend, QA, Research).
Memory policyA table in ptyManager.js, not a prompt. Persistent roles resume by session UUID; unknown roles fall through to ephemeral, so the safe default is forgetting.
BriefingsInjected silently at spawn through an append-system-prompt flag with a per-session temp file, so a pane’s scrollback starts clean.
The watcherticketWatcher.js, non-recursive fs.watch, 500ms debounce per file, emitting exactly three frames: review-pending, commit-pending, content-update. That is the entire signaling vocabulary.
ConcurrencyMAX_PANES = 6. The rest queue and advance as commits land.
BookkeepingA post-commit git hook appends the session log row, the completed list line, and the brief’s current-state entry. The paper trail cannot fall behind the work, because the work writes it.

The economic decision underneath all of it

Every agent is an interactive CLI session on a flat subscription, never an API call. Six parallel agents therefore cost exactly what one costs. That single fact set the model policy too: a one-day experiment defaulting workers to a cheaper model was reversed the next day, because with no per-token cost the cheaper-model argument has nothing to bite on.

What it looks like running

Eight surfaces in a terminal-brutalist monospace shell, with an ops strip across the top. On launch day the dashboard read PROJ 04 | TKT 21 / WIP 00 BLK 00 | SYNC 00:06s: four projects, twenty-one open tickets, none in progress or blocked, state six seconds old. The strongest single piece of evidence that the loop worked is that ATLAS is a project inside its own registry: all 162 tickets that built it were dispatched, executed, reviewed and logged by its own loop.

ATLAS command center: every project with its active and blocked work
ATLAS dashboard view across projects
ATLAS portfolio view listing every project under management
ATLAS workflow view showing an agent's task sequence
ATLAS single project detail view
ATLAS usage view showing agent token consumption

What it proved

Durable state beats a long conversation. A coordinator that is a running context window dies with the process, and every restart pays the reconstruction cost again. A coordinator that is a set of files on disk survives the laptop closing, and any agent, or any human, can be brought up to date by reading it.

The unit of memory should be the project, not the session. Sessions are an artifact of how the tool works. Projects are the thing that actually persists, and organizing state around them is what let five run at once.

Writing down why is worth more than writing down what. A log of what an agent changed is a diff, and git already has it. A record of what it was trying to accomplish is the thing that makes the next agent, or me nine days later, able to continue instead of re-deciding.

The wall

ATLAS held the state; deciding what happened next stayed mine. Every morning the system could tell me precisely what was blocked and why, and every morning I was the one who had to read that, choose, and start the agent. The bottleneck moved from remembering to dispatching, a real improvement, and still a human in the middle of every loop. Two human gates sat in the circuit by design: I acked the ticket plan before a sprint spawned, and Middle Manager review preceded every commit.

V2 takes that decision and gives it to an Overseer Agent, which turned out to require a different isolation model to be safe: one git worktree per lane, and file signalling instead of a shared board.

The four questions people actually ask

QuestionAnswer as built
How is dispatch addressed across projects? A registry, projects.json, gives every project a ticket prefix. I talk strategy with the COO; a handoff button injects a request into its stdin for a fenced JSON object naming the project and summarizing direction. The frontend taps stdout, parses the fence, validates the project against the registry, and spawns the Middle Manager with that summary as its briefing.
Where does shared state live? Flat markdown and CSV in the project vault, under Obsidian conventions: frontmatter, tags, wikilinks. Session identity is the one exception: resume UUIDs live per role and project in ~/.atlas/sessions.json.
What happens on a write conflict? It is prevented rather than resolved. Every pty is boxed under an allowed filesystem root, each ticket scopes its file list explicitly, and workers are forbidden to commit at all: the root contract reserves commits for the Middle Manager. V2 pushes this further into one git worktree per lane.
What happens when an agent dies mid-task? The ticket file is the state machine, so the work survives the process. Strategy roles resume their prior conversation by stored session UUID. Workers are deliberately ephemeral and spawn with zero memory, so a restarted ticket can never inherit stale context from the last one.

The full report

Agentic Orchestration Architecture documents the phase 1 architecture as built, ten principles that generalize beyond it, all three generations, and a convergence ledger that records what Anthropic shipped that I had not alongside what I shipped first. Download the paper (PDF) →  ·  Watch it run →