Use orchestrate mode#
Orchestrate mode is an opt-in Claude Code plugin for work too large for one
context window. The main session becomes the orchestrator: it holds the
goal, a state file and a map of the work, and delegates the detailed work
to subagents. A goal’s state lives in its own folder outside every
repository and is kept current every turn, so you can /clear at any
moment and lose nothing, and one goal can span several repositories.
Install#
The installer makes this repository’s plugin marketplace, claude-sandbox,
known to Claude through the managed settings, so you do not need to add it.
Installing a plugin from it is your choice. In a sandboxed Claude session:
/plugin install orchestrate@claude-sandbox
Then run /reload-plugins or restart Claude. The plugin lands in your
~/.claude/plugins/, so it persists across container recreation like the
rest of your Claude settings. The sandbox turns Claude’s auto-updates off,
which also stops plugin auto-update: run
/plugin marketplace update claude-sandbox to pick up a newer version.
On an install made before the marketplace was added to the managed
settings, run /plugin marketplace add DiamondLightSource/claude-sandbox
first, or reinstall claude-sandbox.
Use#
You type |
What happens |
|---|---|
|
Claude agrees a one-sentence goal and a slug with you, creates the goal folder and makes it the active goal for this directory. If another goal was active, it is paused. |
|
Carries on the active goal; with none, lists the goals and offers to resume one or start a new one. |
|
The session the clear starts takes the goal over and is handed the state file’s head and a crash check, and carries on. Nothing needs flushing first. |
|
Switches the mode off and keeps the goal, marked |
|
Carries on the active goal in this session, taking it over from any other session. With no active goal, Claude lists the goals and asks which. Resuming a goal pauses any other active one. |
|
Shows every goal and its status ( |
|
Lists the worktrees of every repository in the goal’s map, scratch dirs with their sizes and open PRs in merge order, then closes and archives the goal. Scratch is deleted only when you name it. |
One goal is active at a time, in one session: the session that ran
/orchestrate start or /orchestrate resume, in the directory it ran in
(and below it). Other sessions are untouched, including other sessions in
the same directory: they get no injected state and no reminders to update
it. A /clear in the orchestrating session passes the goal to the session
it starts; /compact and claude --resume keep it. /fork (or
--fork-session) leaves the goal with the original session, not the fork.
Switching to another conversation with /resume leaves the goal with the
conversation you left; it acts again when you resume that one. To carry on
in a new session (after quitting Claude, or a crash), run
/orchestrate resume there; it becomes the orchestrator, the old session
goes quiet, and it is told about a crash or a lost agent as a new session
would be. Start and resume a goal from that launch directory.
After upgrading from plugin version 0.2.0, run /orchestrate resume once in
the orchestrating session: a goal started under 0.2.0 has no owning session
recorded, so the hooks stay silent until it is resumed.
Follow the work in .claude/status.md in that directory, ordered as the
orchestrator’s recommendation of what you do next. It is a real file there,
not a link, because editors and the claude.ai web view refuse files outside
the working directory. In a git repository it is added to
.git/info/exclude, so it is never committed. Each time Claude updates it,
the reply shows the changed headings, one line each. Writes to the goal
folder and the status file are drawn as one dim line instead of a diff.
Design work happens in the foreground, with the orchestrator itself, since
it is the session that sees your editor selection: discuss, shape the
public API together, run a few exploratory tests, then the orchestrator
briefs an agent to write the code and suggests a /clear. If the agent’s
report raises something, the item comes back to the foreground. While you
are designing, background agents keep running and the status file keeps
updating, but nothing interrupts the conversation.
The orchestrator learns how you like work split - what you keep in the foreground, what you want specified for someone else rather than done, when an agent should see the conversation, whether a big job may use Fable - from your corrections and answers, and keeps it in Claude’s auto-memory.
When a session takes the goal over (a /clear, or /orchestrate resume in a
new session) and an agent listed under Now has no report yet, the
orchestrator is told, so an agent lost to a crash is noticed rather than
assumed to be running.
The state file#
The goal’s state.md is written by the orchestrator only, in one format:
## Nowlists what is running, one line per agent, and holds- (nothing running)when idle.## Doneis the last section: one line per finished item,- YYYY-MM-DD HH:MMZ <text>, appended in time order. Agent returns and review rounds go to the log.## Decidedholds rulings only, each ending(<who>, YYYY-MM-DD).
The orchestrator makes the most common edits with goal.sh rather than by
hand: goal.sh now '<entry>' records a launch, goal.sh land <label> ['<done line>'] records a return (and, with a done line, a finished item;
land drops the entry naming -> <label> -> or starting with <label>),
and goal.sh touch sets the updated= time in the first line after any
other edit. Nobody types that time.
The Stop and SessionStart hooks run scripts/state-lint.sh on the file. It
reports drift as lint: <code>: <text> lines: blank or empty Now, a Now
agent whose report already exists, items still pending after they merged or
closed, events or unattributed lines in Decided, Done out of order or
too long, a file over 10 KB or a head over the injected cap, a stale
updated=, and pending sections left unchanged while Done grew. The Stop
hook passes a set of findings on once; the SessionStart block always shows
them. You can run it yourself:
bash <plugin>/scripts/state-lint.sh ~/.claude/orchestrate/<slug>/state.md.
Where things are#
Path |
Holds |
|---|---|
|
The active goal’s slug, launch directory and owning session. |
|
The state file: an injected head and a body read on demand. |
|
Append-only history, one dated bullet per entry. Never injected; agents append to it directly. |
|
Agent briefs, their long reports, and maps of the code. |
|
Agents’ clones, venvs and test runs. |
|
A stopped goal, everything but its scratch. |
Nothing is deleted automatically. A log past 64 KiB is moved into the
goal’s archive/ and the fresh log points at it. A stopped goal’s scratch
stays where it is (it can hold git worktrees, which a move would break), and
once scratch passes 1 GiB in total the orchestrator offers you a cleanup.
Cost when off#
With no active goal the hooks exit at once, reading nothing; in a session that does not own the active goal they print nothing. The skill’s
description adds roughly 60 tokens to every session. Uninstall with
/plugin uninstall orchestrate@claude-sandbox.