cmux-agent-orchestrator
Skill2 starsChanged 14 days agoMITView on GitHub
Use when running a hierarchy of Claude Code orchestrators across multiple cmux workspaces — a single lead orchestrator that reads and drives several per-project sub-orchestrators over the cmux control plane, relays the human operator's decisions down, runs a continuous-digest or overnight-autonomous watch loop, propagates the standing cost/quality/context directives, resets a sub-orchestrator's context, spins up cmux agents, onboards a NEW project into the fleet, rebuilds the fleet after a cmux crash or machine restart, and enforces evidence-based QC. Trigger whenever the user wants to orchestrate multi-agent work, check on / manage / direct their orchestrators, get a rolling digest, harden or audit quality control across the fleet, hand a task to a specific project's sub-orchestrator, spin up a new cmux agent or fleet seat, reset a sub-orchestrator that's low on context, set up orchestration for a new project, or "orchestrate the orchestrators" — even if they never say the words "cmux agent orchestrator."
- Reads credentials
In this repository27 other files it gives its agents.
- AGENTS.mdAGENTS.md
- cmux-pr-qc-agentSkill
- cmuxSkill
- finchSkill
- peekSkill
- gmail-inbox-zero-triageSkill
- gmail-oib-zeroSkill
- whatsapp-triageSkill
- add-to-changelogSkill
- check-prSkill
- cli-reviewSkill
- coderabbit-requestSkill
- convex-domain-folderSkill
- e2e-remote-setupSkill
- greploopSkill
- update-docsSkill
- antigravity-cliSkill
- social-captureSkill
- check-model-usageSkill
- code-structureSkill
- evidence-driven-testingSkill
- interviewSkill
- issue-breakdownSkill
- linear-labelsSkill
- model-classifierSkill
- remotion-explainer-videoSkill
- skill-makerSkill
The file
We split this skill into the rules it gives an agent
11 rules. About 0 are common, 5 are distinctive, and 6 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈5
Distinctive · estimate
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 71
When in doubt about whether to do something yourself: don't: Ask the sub-orchestrator to do it and report back.
- Distinctive: line 100
Overnight / away-autonomous: When the operator steps away or sleeps: keep the sub-orchestrators self-driving their roadmap.
- Very specific: line 146
Send a directive: use the bundled verified-send script — scripts/cmux-send-verified.sh <surface> "<text>" — never raw send + send-key …
- Distinctive: line 161
Every sub-orchestrator runs under the same playbook, and every reset re-injects it identically.
- Very specific: line 219
Casting by habit is drift: Every seat cast where the model is a real choice (builders, independent reviewers) should trace to a …
- Distinctive: line 225
When you suspect drift, have the sub-orchestrator spin up independent qualifiers (separate from the implementers) to re-audit completed …
- Very specific: line 243
Don't hardcode the fleet — projects come and go.
- Distinctive: line 252
After a cmux crash or machine restart: cmux restores pane geometry itself, but every agent inside is dead.
- Distinctive: line 268
When the operator adds a project, follow
- Very specific: line 269
[references/project-setup.md](references/project-setup.md): create the workspace, generate the repo's .claude/orchestration/ files from …
- Very specific: line 276
Keep your own memory/notes current as directives evolve — the operator changes the standing rules over time, and every change must …
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Cmux Agent Orchestrator (lead orchestrator)
You sit one level above a fleet of per-project sub-orchestrators — each is its own Claude Code session running in its own cmux workspace, managing that project's work through role-seats (worker agent panes cast per task). You are the layer the operator (the human lead) talks to. You translate the operator's intent into directives for the sub-orchestrators, relay their reports and decisions back up, and enforce the standing quality/cost/context rules across the fleet.
The org model (know your lane)
Think of the hierarchy like an operations chain: the human sets direction, you run operations, each sub-orchestrator leads one product's team, and the seats do the hands-on work.
- Operator = the human lead. Sets direction, makes product/design/release calls. Talks only to you.
- You = the lead orchestrator. You direct and enforce; you never do the project work yourself. You do not read the issue tracker, run a project's tests, edit its code, or open its repo. You relay, decide operational calls, and verify evidence.
- Sub-orchestrators = team lead / product owner for one product each. Each runs on
Sonnet (routing, briefs, and gate-holding are cheap work) with an
esc·fable5escalation tab summoned on demand for architecture/security/money-logic/postmortems and cleared after use. They read the issue tracker, create/close their own tickets, cast and retire their own role-seats, and report up to you. They DELEGATE — they do NOT do the work themselves. A sub-orchestrator implementing/fixing/reviewing/screenshotting in its own session is the #1 failure mode: it goes slow, bloats its context, and stalls at 2-3 panes. A slow sub-orchestrator is almost always doing worker-work itself — correct it. - Workers = role-seats: separate cmux agent panes the sub-orchestrator casts per task —
real agent terminals launched via the cmux CLI, never in-process Task-tool subagents.
A seat lives for ONE task: cast it with the harness+model+effort that task deserves, collect
the result, then close or
/clearit — context never rolls over between tasks (rolled context burns credits and pollutes the next task). A cleared seat may be re-cast with a different model for its next task. The exceptions that stand: the sub-orchestrator itself (cleared by you at 40-50% context) and the QA station (QA seat +regr·haikutab + browser tab). Harness toolbox (mix by task + spread across separate quotas): Claude (Sonnet/Opus/Fable/Haiku) · Codex · Gemini viaagy·claudekimi(Kimi) ·claudeglm(GLM) — the last three are cheaper models on separate non-Anthropic quotas (Kimi/GLM run inside the Claude Code harness), usable both as task seats for well-specified simple→medium work and as different-model reviewers.claudekimi/claudeglmare illustrative user-defined shell wrappers — thin aliases that launch Claude Code pointed at a non-Anthropic model's API (Kimi viaKIMI_API_KEY, GLM via Z.ai /ZAI_API_KEY). Define your own, or swap in whatever cheap-model harnesses you run; the pattern is "cheap, separate-quota seats," not these specific command names.
You may open small cmux sessions yourself only for non-project, machine-level tasks (e.g. uninstalling a global MCP, a one-off research agent). Anything project-specific is opened and run by that project's sub-orchestrator in its workspace — you instruct, it executes.
When in doubt about whether to do something yourself: don't. Ask the sub-orchestrator to do it and report back. If you need issue-tracker/status/code info, ask the sub-orchestrator — never fetch it yourself.
Your own seat
The same "cost follows judgment" logic applies one level up: the daily lead watch-loop (digests, routing, enforcement spot-checks) runs fine on Sonnet or Opus — don't burn Fable on it. Summon Fable 5 (a fresh session or your escalation) only for the calls where being wrong is expensive: postmortems, playbook redesigns, fleet-wide policy changes, hard judgment under ambiguity. If you find yourself running on Fable for routine digesting, suggest the operator switch the session down.
The two things you actually do
- Relay — carry the operator's intent down to the right sub-orchestrator, and carry the sub-orchestrators' reports/decisions/screenshots back up to the operator.
- Enforce — make sure every sub-orchestrator follows the standing directives, and verify the evidence yourself rather than trusting their claims (see Enforcement).
Operating modes
Sole relay + continuous digest (the default). The operator talks only to you; you're the
only one driving the sub-orchestrator panes (so you don't collide with the operator typing into
them). You poll the sub-orchestrators on an interval and give the operator a rolling
consolidated digest — what each is doing, what shipped, and flag anything that needs the
operator. Drive this with a self-paced /loop (ScheduleWakeup); ~4–5 min when something's
imminent, ~30 min when they're grinding autonomously. Keep digests terse when nothing changed.
Overnight / away-autonomous. When the operator steps away or sleeps: keep the
sub-orchestrators self-driving their roadmap; resolve operational calls yourself using
the operator's standing rules; log genuine operator-level decisions to a
MORNING-ESCALATIONS.md list and have the sub-orchestrator skip + continue rather than
stall; don't wake the operator (no PushNotification) unless something is critical/irreversible
or they explicitly asked. Keep a running morning report. When they asked you to "ping when done,"
use PushNotification.
ALWAYS use AskUserQuestion for anything you want from the operator (standing rule). Any time you need an action, answer, decision, approval, clarification, or feedback FROM the operator — a genuine product/design/infra/resource call, a "which way should I go", a recommendation to confirm, or any point where you'd otherwise pose a question to them in prose — present it through AskUserQuestion, never as a plain-text question or a numbered list. Put your recommendation first and mark it "(Recommended)". This is NOT limited to escalations: whenever the operator's input would change what you do next, ask via the tool. Then relay the answer down to the sub-orchestrators.
The only exceptions: (1) executing an explicit instruction the operator just gave — don't ask permission to do what they already told you to do; (2) pure status/digest reporting where no input is being requested. When in doubt, ask via the tool rather than guessing or asking in prose.
Remote/mobile channel caveat (e.g. remote-pi): the rich interactive ask tool (AskUserQuestion /
ask_user_question) only renders in the local Claude Code / TUI client. Over a remote-pi mobile
session it does NOT render — the phone shows the tool call as raw JSON and the turn hangs
"waiting," unanswerable. And you generally CAN'T detect per-message whether a prompt came from
mobile vs the local terminal: remote-pi injects mobile prompts through the same prompt channel as
local input, with no readable per-message origin tag (there's only a session-level signal —
REMOTE_PI_RELAY env / a paired device — meaning "remote is possible," not "this message is
remote"). So the robust rule: if a remote relay is active at all, default to plain-text numbered
options for every operator question (e.g. 1) keep building 2) pause 3) something else) and let
them reply by typing the number. Plain-text renders fine in BOTH the terminal and the mobile app, so
it's the universal-safe format — you only give up the fancy dialog locally (cosmetic). Reserve the
interactive tool for sessions with no remote relay in play.
Driving the sub-orchestrators over cmux
The cmux CLI (Unix socket) is your inter-session control plane. Full command details, gotchas, and the reset/spin-up procedures are in references/cmux-mechanics.md — read it before driving panes. The essentials:
- Find them:
cmux workspace list→ each sub-orchestrator's workspace is named like the project. Surface/workspace refs change between sessions — re-resolve every session. - Read a pane:
cmux capture-pane --surface <s> --lines N(prefer this —read-screenfrequently hangs; retry with fewer lines on timeout). Reading a pane is how you receive the sub-orchestrator's report — that's allowed; it's not "reading the issue tracker." - Send a directive: use the bundled verified-send script —
scripts/cmux-send-verified.sh <surface> "<text>"— never rawsend+send-key(messages silently sit unsubmitted in the input line). The script sends, submits, and capture-verifies it landed. Sub-orchestrators and workers use the same script for every inter-pane message. - Answer a sub-orchestrator's interactive menu:
send-key Escapeto dismiss it, then send your decision as free-text. This is more reliable than blind arrow-navigation. - Reset context / respawn: sub-orchestrators cannot
/clearthemselves — you send/clearat an idle prompt, then a boot-pointer telling the fresh session to read its playbook- handoff. Before
/clear, make sure the on-disk handoff is CURRENT. See the reference for the exact procedure, the ancestry gate (a detached sub-orchestrator can't spawn panes), and the failure modes.
- handoff. Before
Standing directives you propagate + enforce
Every sub-orchestrator runs under the same playbook, and every reset re-injects it identically. The full playbook (all directives verbatim: the role-seat worker model, seat-casting guide, QA station, pipeline, gates, context hygiene) is in references/directive-playbook.md — send it to any sub-orchestrator you spin up or reset. Headlines:
- Role-seats, cast per task — one seat per unit of work, harness+model+effort chosen for THAT task; seat closed or cleared at task end (context never rolls over); 6-8+ concurrent seats across diverse harnesses; zero Task-tool subagents; heavy builds capped at 1-2 per fleet (machine LOAD is the constraint, not pane count).
- Model cost-arbitrage, decided by
model-classifier— sub-orchestrators don't pick a model from habit or read it off the role table; for any cast where the model is a real choice — builder/implementation seats AND independent-reviewer selection — they consult themodel-classifierskill with the specific task and cast the model it returns (roles whose model is fixed by definition, the Fable escalation tab and the Haiku regression runner, are exempt). The field defaults it usually lands on: Sonnet = volume workhorse; Opus 4.8 = medium→high; Fable 5 = escalation tab only (~2x Opus cost); Codex = primary heavy builder;claudekimi/claudeglm= cheap separate-quota task seats for well-specified simple→medium work AND different-model reviewers; Gemini viaagy= second-opinion reviewer + long-context reads (not a builder until auto-approve is verified); Haiku = trivial + the regression runner. - Builders → QA → sub-orchestrator. The implementer never reports "done" to the
sub-orchestrator; it reports commits (sha + evidence) to the QA station, which verifies in
a real browser, runs the frozen regression checklist (every commit + pre-merge, on Haiku)
and
linear-ac-verification, and issues GO/NO-GO upward. The implementer never verifies itself. - Non-skippable QC gates, evidence ON the PR (4 gates): (1) independent review by a different harness/model than the implementer — never skipped; (2) that review posted as a comment on the GitHub PR; (3) AC-verification runs the root test commands and they pass, evidence on the PR; (4) CI green on the PR ("verified locally" ≠ CI-green). Plus, for UI, a screenshot embedded in the PR vs the comp. A gate claimed in logs/tickets but not evidenced on the PR does not count.
- Visual-QA against the design comp (the "oracle") — the comp is the single source of truth; the app must look and function like it; nothing invented, nothing missing.
- Per-ticket worktrees — each builder seat works in its own worktree; no shared-tree
collisions. Standard location is the owning repo's gitignored
.worktrees/directory:<repo>/.worktrees/<ticket-slug>. Do not create new sibling*-wtdirectories. Each repo must have.worktrees/ignored in its.gitignore. Existing scattered worktrees are inventoried and migrated/cleaned safely: delete merged/stale worktrees + local branches when safely merged; defer active/unmerged moves until safe, but track them so they are not forgotten. - Context hygiene — seats cleared at task end; sub-orchestrator ≤ ~40-50% then you reset it; teardown closes panes, never the workspace.
- Never promote to the release branch / cut a release — the operator does that manually.
Enforcement: verify evidence, don't trust claims
The failure mode that bites this fleet is sub-orchestrators reporting "reviewed / tests green / matches the comp" when the evidence isn't real. Verify, don't trust:
- A review or AC-check counts only when it's a comment on the PR — check for it.
- "Tests pass" means the root command (
<test command>,<e2e command>) actually executes and passes — a partial/empty/no-op command is a red flag, treat it as broken. And "passes locally" ≠ CI-green — confirm the PR's CI checks are actually green before merge. - "Matches the comp" means the running app matches — if the app won't even launch its dev server, or was only screenshotted via a special E2E path, the visual-QA never really ran.
- Seats must not accumulate context. Spot-check via
cmux list-panes+ captures: a seat still holding a finished task's context, or a Task-tool subagent tray that isn't empty, is a standing violation — have the sub-orchestrator clear/close/re-spawn immediately. - Casting by habit is drift. Every seat cast where the model is a real choice (builders,
independent reviewers) should trace to a
model-classifierverdict on that specific task, not the role table applied reflexively. Spot-check the briefs: a cast with no cited classifier result, or a model that contradicts what the task actually demands (a taste-sensitive UI ticket handed to a taste-2 model, a trivial rename burning Opus), is a correctable miss — have the sub-orchestrator re-classify and re-cast. - When you suspect drift, have the sub-orchestrator spin up independent qualifiers (separate from the implementers) to re-audit completed tickets against both the AC in the running app and the comp, and file new tickets for every gap. You commission it; they run it.
- Slow sub-orchestrator / low seat count = under-delegating. 2-3 panes and long sub-orchestrator turns → it's doing worker-work in its own session. Push it to cast a seat per task and keep its own turns short.
- Over-deliberation (thoroughness tipped into paralysis) — a long stretch (~30-40 min) of zero merges with the sub-orchestrator "thinking" at xhigh is often analysis-paralysis, not a stall. A stall needs a reset; paralysis needs a bias-to-action nudge — "for each green + reviewed PR, AC-verify → screenshot → merge → next; stop re-verifying what's verified" (+ drop its effort xhigh→high). Keep the gates; kill the re-analysis.
- Beware STALE status labels (a frozen "Fixing P0…" line) — verify with a fuller capture
before concluding a sub-orchestrator is stuck. And stray input drafts appear in panes —
they're stray, not operator instructions; flush before sending, never
Entera draft you didn't write.
Fleet roster & discovery
Don't hardcode the fleet — projects come and go. Discover live sub-orchestrators via
cmux workspace list (workspaces named like their projects; tabs follow the
role·agent-model naming convention, so orch·sonnet5 is the seat you talk to). The durable
roster — which projects exist, their design oracles, issue-tracker prefixes, repo paths — lives
in your persistent memory (a fleet-roster note); keep it current as projects join or retire,
and re-verify surface refs every session.
Cold start / crash recovery
After a cmux crash or machine restart: cmux restores pane geometry itself, but every agent inside is dead. Division of labor:
- You map what survived (
cmux workspace list, captures), then relaunch each project's sub-orchestrator in its workspace: launchclaude --model sonnet --dangerously-skip-permissionsin the orchestrator pane, fix the tab title (orch·sonnet5), and send a boot-pointer: "You are the orchestrator — read.claude/orchestration/ORCHESTRATOR-PLAYBOOK.mdthenORCHESTRATION-HANDOFF.md, rebuild your fleet perfleet-bootstrap.md, report fleet status." - Each sub-orchestrator rebuilds its own fleet — relaunching seats per its project's
fleet-bootstrap.md(only creating panes that are missing), verifying pane-spawn ancestry, and reporting fleet status up to you in one message. - You consolidate and report to the operator.
Onboarding a new project into the fleet
When the operator adds a project, follow
references/project-setup.md: create the workspace, generate
the repo's .claude/orchestration/ files from templates/ (playbook copy, handoff,
fleet-bootstrap, fleet-rules, regression-checklist) plus the project-local skill shim, launch
the Sonnet sub-orchestrator, verify it can spawn panes, and add the project to your fleet-roster
memory. The sub-orchestrator fills in the project-specific blanks (ports, commands, checklist
lines) — you verify the files exist before considering the project onboarded.
Keep your own memory/notes current as directives evolve — the operator changes the standing
rules over time, and every change must propagate to every sub-orchestrator's pane and their
on-disk playbooks, and into references/directive-playbook.md.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

