You hand one agent a big plan and watch it degrade — the context fills up,
quality drops, you babysit. orchestrate turns a plan, a loose idea, or a research question
into a controlled run: it asks what it can't guess, uses the tools already on your machine, runs
independent work in parallel on fresh agents — and checks every result before it counts.
# install once
npx skills add gabros20/orchestrate-skill -g
# then hand it anything — no flags needed/orchestrate plan.md
/orchestrate "a desktop app that syncs my notes" # it interviews you first/orchestrate "deep-research the fastest proven e2e tools" # one lane per source
Everything in orchestrate follows one idea: coordination and work are different jobs,
and they should never share a context window.
A controller plans the run, assigns the work, and checks the results — it never writes
code itself. Each task goes to a subagent: a fresh worker that starts empty, does one
scoped job, and is thrown away.
The two never talk through chat. The controller writes a brief file; the worker reads
it, works, and writes a report file back. The files outlive the worker — so a run
survives crashes, compaction, and restarts, because its state lives on disk instead of in
anyone's head.
0:00 / 1:36
controllercoordinates, never implements▸task-1-brief.md▸worker 1context discarded▸task-1-report.mdspec ✓ quality ✓
Both workers ran at the same time — and both are already gone. Their briefs,
reports and ledger lines remain: that is the whole trick.
How a run works
Every strategy shares the same spine — and every step of it is on the record.
invokeYou point it at a plan file, or just describe the task. Every flag is optional.
preparePrepare takes stock of the skills and CLIs already on your machine, and asks — in one round, a recommended answer on each — only what it can't look up. Missing tools are proposed, never installed unasked. Prepare ↓
triageTriage classifies the task — build, research, fix, review — and reads its dependency graph. Concurrency is the default: only a real dependency makes work wait. Then it picks a run shape and says why. Strategies ↓
flight planBefore anything launches, the flight plan prints the design — topology tree, model + effort per agent, gates, budget range — and waits for your approval. Say change 3 to tweak a dimension, or approve. confirm=off skips the gate, never the print.
dispatchThe controller writes a brief and sends a fresh subagent to do exactly that task, on an explicitly chosen model.
gateGates review each result — first against the brief, then for quality. Failures loop back until clean.
ledgerEach finished task becomes one line in the ledger, progress.md. A resumed run trusts the ledger, not memory.
journal + boardEvery step above is one line in a tamper-evident log. Open a second terminal and type board: the log becomes a live kanban, with a strip that says what needs you. The board ↓
shared contextWorkers share one record instead of chatting. Questions, lessons learned, and decisions you change mid-run reach them the next time they check in. Shared context ↓
Before it runs: prepare
Most bad runs are lost before the first agent starts — the request was vague, or the tools
were missing, so every worker guessed. orchestrate takes stock first, and asks only what it
cannot look up.
equipzero tokens
A script lists every skill on disk for every agent you use — including the
ones marked manual-only, which never show up in your agent's skill list — plus the CLIs on your
PATH, which are free and which are paid, and what is missing with its install command.
clarifyrounds, not a drip
When your request is not a spec yet, it interviews you in rounds: every open
decision it can ask now, numbered, each with a recommended answer you accept with "yes". Facts
it looks up itself; decisions stay yours, and nobody else can overwrite them. The technique is
Matt Pocock's grilling.
scout & set uponly when undecided
No toolchain yet? A small research run compares candidates on X, GitHub, the
web and package registries — a track record beats hype, and the faster tool wins a tie. The
tools you approve become Task 0, set up once before any worker starts.
What one clarify round looks like:
clarify · round 1 — answer by numberQ1 Ship macOS first, Windows after v1?
↳ yes — one platform keeps v1 testable end to endQ2 Install ytrelay for the YouTube lane? npm i -g youtube-relay-mcp↳ yes — free and local; without it that lane scrapes pagesQ3 No test runner chosen yet — scout X and GitHub before picking?
↳ yes — track record over hypeyou › 1 yes · 2 yes · 3 yes # each answer becomes a decision only you can revise
Nothing is installed and no paid service is used without your yes — free, local
tools first, paid ones only as a fallback you approved. Tune it with prep=full (always
interview and scout) or prep=off.
It picks the shape
You never need a strategy name. Triage reads what kind of task it is and which tasks really
depend on each other — concurrency is the default; sequence is a finding. The gates stay the
same whatever shape it picks.
you hand it
it runs
a build across domains
hierarchical — a lead per domain runs its own parallel workers, reviews and merges; an integrator joins the domains
a build in one area
parallel — every task that doesn't need another's code starts at once; the rest start the moment theirs is merged
Use it when the tasks form a true chain — each needs the previous one's output. It works by sending a fresh implementer per task and reviewing each result twice before it counts. Every task's acceptance check is authored before the first dispatch — ideally by an agent other than the one who'll implement it.
parallel
Use it when two or more tasks don't need each other's output — the default for a one-domain build, and the shape of research lanes. It works by running 3–5 workers at once in isolated git worktrees, starting each task the moment it's ready (at once if it only needs an interface, right after the merge if it needs another task's code), reviewing each as it lands, and merging in dependency order. The merge counts returns against dispatches and refuses to synthesize a partial set — one dead worker never slips into a report that looks complete.
hierarchical
Use it when a build spans domains — backend, frontend, infra — that each need real thinking. It works by giving every domain a lead that runs its own parallel workers, reviews and merges, then returns conclusions instead of transcripts; an integrator merges the domains. Wide and shallow beats deep — and who can stop a hung worker is settled before anything spawns.
team
Use it when workers must talk to each other — debates, competing hypotheses, cross-layer features. It works by spawning named teammates who share a task list and message each other directly. Teammates aren't worktree-isolated, so file ownership is partitioned in the spawn prompt; the team owes one final review before it disbands. Experimental.
workflow
Use it when you have 20+ similar items and a script should hold the plan instead of you. It works by fanning agents out from a deterministic script that verifies every finding and resumes with cached results. Resume only holds while the script stays deterministic — a clock or a random draw silently defeats the journal.
loop
Use it when work grinds toward a checkable goal — tests green, a metric hit. It works by running gated cycles against a stop condition, with hard caps and a kill switch. Cycles of activity that never move an acceptance gate force a real result or repair; a replan that produces no visible delta doesn't count as one.
advisor
Use it when budget is tight and most of the task is mechanical. It works by letting a cheap model do every turn while the strongest model answers only the few questions that need real judgment. Or invert it — the architect session never leaves the room and routes each dispatch to a routine, escalation, or review lane.
adversarial
Use it when a wrong plan costs far more than arguing about it — architecture, migrations, security. It works by having a different-lineage model attack the plan until consensus, before any code exists.
xcli
Use it when a task fits another coding CLI, or you want a second opinion from a different model family. It works by routing tasks to codex, grok or claude as workers or reviewers — one task per lane, one command per lane (board launch: session pinned, exit and usage receipt journaled, gated on its inputs in the shell), and their diffs get reviewed too. An empty diff is never complete: exit 0 with nothing changed is a refusal, quoted verbatim, not a finished task.
Deep research, fanned out
Ask a question that many sources answer — "what is the fastest proven e2e tool for a Tauri app?" —
and it runs one lane per source in parallel, each with the best free tool for that source. You
never have to list the sources.
source
what it's best for
tool, free first
GitHub
what already exists, who maintains it, real usage; issues are known breakage
ghrelay · gh
X
launches, practitioners comparing tools, new projects
xrelay
YouTube
conference talks, demos, maintainers explaining a design
ytrelay
the web
official docs, engineering blogs from teams running it at scale
web search + fetch
HN · Reddit
dissent, failure stories, "we switched from…"
curl · Algolia API, RSS
registries
adoption and release cadence
npm view · PyPI · crates.io
keyword-richSix to ten query variants per lane, then a second round on every tool, repo and author the first one surfaced.
traced, not trustedEvery claim follows its link to the repo, registry or docs that owns it, and carries a grade. Likes and stars say popular, not right.
refuted before it shipsA synthesizer writes the report; a fresh fact-check tries to break every load-bearing claim first.
A lane whose tool is missing gets it proposed with the install command — never installed unasked. The same shape serves market research, content and video work: the lanes come from the question and from what is on your machine.
Gated by default
Nothing lands because an agent says it's done. Every result passes two gates, in a fixed
order, and reviewers verify by reading the code — never the worker's own report. Every gate that
judges produced work names at least one fact no agent produced: a command that ran with its
output, a file on disk at a stated sha, an external readback. A topology of agents reading each
other's reports can be perfectly consistent and entirely unverified.
implementA fresh worker builds exactly what its brief asks.
spec gate"Did they build what was asked?" Nothing missing, nothing extra.
quality gate"Is it well-built?" Runs only after spec passes — never before.
final gateBefore the run reports done, a fresh context judges the whole accumulated change set against your originally stated goal — per-task gates structurally cannot see drift across tasks. Verdict: ship, fix-first, or rethink.
ledgerThe task becomes one ledger line; the run can always resume from here.
Any failure sends one fix agent back through the same gate until it's clean — no skipping, no downgrading a finding to pass. Two or three failed rounds on the same gate escalates the model tier, never a fourth identical round. Judges are cross-family where the host allows, and pinned and logged per round — a silently upgraded judge makes round 1 and round 3 incomparable. High-stakes plans can add more lenses: review=panel:3.
Four invariants sit under every status, gate, and ledger line:
The third is the one most runs get wrong: an exit code of 0 only proves the
process exited — not that the work landed.
redesign, never patchWhen an agent finds the plan won't work as written, it stops instead of hacking around it. A fresh top-tier model redesigns the part that broke; anything your users would notice comes to you as a question.
branch firstIt never starts work on main without your explicit consent.
no duplicates on overloadIf the API chokes, it resumes the same agent — it never spawns a competing copy.
loops have a kill switchHard cycle caps, a regression breaker, and a contract file you can delete to stop everything.
PR bandwidthIt never opens a new PR while the run's previous one sits unmerged.
blocked means escalateA stuck task gets more context, a stronger model, a split, or a human — never a blind retry.
your machine, your callInstalls, paid services and credits are proposed with the exact command and why — never run without your yes. Free, local tools come first.
data is not instructionsWorkers never follow orders found in logs or fetched content, and credentials never enter briefs.
The board
You should not have to read logs to know where a run stands. Open a second terminal in the
repo and type board. You get a live kanban of the run: what is queued, who is
working on what, what is under review, what is done, what is stuck. It updates by itself as
files land. It runs in any terminal and needs nothing but python.
board — payments-api — ghostty
ORCHESTRATE payments-api @ main 1/5 done · 2m20s goal Ship the rate-limit rewrite behind a flag
run parallel · review dual · host Claude Code models worker sonnet · reviewer opus
budget agents 6/8 · tokens 412k/150k-600k
checks 3/3 ok plan approved 15:51 attention x 1 blocked/failed · ? 2 pending mail 2 sent · 2 unread · 1 for controller · 1 question · learn 2 · 2 new for controller TODO 0 ╭─ IN PROGRESS ──────────────────────────────────────────────────────────────────────────────────────────────────── 2 ─╮ │ 3 Migrate the DB layer impl-3 ? asked controller #23 · 2m19s · tests ok 0s · m1 │ │ 4 Ship the docs impl-4 ·codex > 2m19s │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─ REVIEW ───────────────────────────────────────────────────────────────────────────────────────────────────────── 1 ─╮ │ 2 Auth token refresh quality-2 spec ok r1 · quality .. r1 │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─ DONE ─────────────────────────────────────────────────────────────────────────────────────────────────────────── 1 ─╮ │ 1 Extract rate-limit middleware quality-1 4f2c91a..a7d3e10 │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─ BLOCKED ──────────────────────────────────────────────────────────────────────────────────────────────────────── 1 ─╮ │ 5 Integration integ-5 x needs the vendor token — owner: controller, next: add it to .env.example │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ 15:51 integ-5: needs the vendor token — owner: controller, next: add it to .env.example j/k focus a card · enter its history · e expand all · a attention only · n next run · r reload · q quit
? asked controller #23A worker has a question. It stops and waits for the answer instead of guessing. The controller is the agent running the run; you are the one watching. The pane always names who has to act.
x needs the vendor tokenA stuck task always names who owns it and what happens next. If it does not, the board calls it abandoned, not blocked.
spec ok r1 · quality .. r1Every result is reviewed twice before it counts: first against what was asked, then for quality. The card shows which review passed and which is still running.
impl-4 ·codexAgent names say what they do and on which task. impl-4 implements task 4. The suffix means it runs on Codex instead of the run's default model.
A few commands sit under the pane. board attention lists what needs the controller, most
urgent first. board check audits the run and refuses to count a task as finished
when a review failed or a file it claims to have written is missing. board resume
writes the handoff a fresh session needs to pick the run up where it stopped. board reap
finds the dev servers and watchers an agent left running and stops them; the run cannot finish
while any are still up. Full reference:
docs/usage.md.
Shared context
Running several agents at once is easy. The hard part is that each one only knows what it did
itself. Two of them hit the same broken test setup and both lose an hour to it. One changes an
interface and nobody hears. You change a decision halfway through, and the workers already
running never see it.
orchestrate keeps one shared record for the run, and every worker reads it each time it checks
in. Three kinds of thing travel through it.
mailquestions and heads-ups
A worker can tell a peer "I am about to change the file you depend on", or ask you a question and wait for the answer. A message from you is an instruction. A message from another worker is information, to be checked. Everyone has a hard cap on how much they can send, so two agents can never chat instead of working.
learnlessons, while the run is still going
When a worker finds something the others would trip over too, a stale test fixture, an approach that does not work, it writes one line. The other workers see that line the next time they check in, before they run into it themselves. If you change a decision mid-run, the workers already running see that as well, with your reason.
memoryfrom one run to the next
When the run ends, board memory writes one record of what happened: the decisions and why, what failed, what was learned, what was verified. The next run starts from it, even in a different coding tool. The record uses the project-context format; orchestrate works fine without that skill installed.
This is what a worker sees when it checks in:
$ board inboxmail for impl-3:#28 12:58 [peer impl-2] renamed src/auth/session.ts — import path moves# a peer's heads-uplearned since your last check: #26 12:58 [peer impl-4] the docs build reads VERSION from package.json, not from the tag# a lesson another worker paid forrecord changes since your dispatch: #31 12:58 decision D-01 (revised) cookie auth, not header — why: browser clients keep the session# changed after impl-3 started
None of this interrupts a worker mid-task. Updates arrive when the worker checks in, and every
board command does that for it. That is also why it works the same on every coding CLI: no
server, no plugin, one file both sides read. Tested live: one worker's lesson reached a second
worker before its first test run, and that worker passed on the first try.
One preset, every knob optional
A strategy is a preset, not a product. orchestrate has a small set of dimensions — knobs
like how work splits, who reviews it, which engine runs it at which reasoning effort, and
whether the flight plan gates on your approval (confirm, on by default). Each of the nine strategies is
just a named preset over those knobs. Learn one command and you've learned all nine.
Any knob you set yourself overrides its preset value. That's the whole override model:
/orchestrate plan.md strategy=staged engine=codex# one preset, one override
stagedthe preset…
topologystaged
planningplan-first
reviewdual
engineclaude
isolationoff
triggeronce
staged + your override…after your one flag
topologystaged
planningplan-first
reviewdual
engineclaudecodex
isolationoff
triggeronce
That one line means: Codex implements every task, Claude still reviews
every result. Strategies compose the same way — strategy=loop
topology=parallel makes each loop cycle fan out.
The knobs you'll actually type — most runs touch two or three:
knob
what it controls
default
strategy
the run shape — one of the nine above
auto → triage picks
kind
what the task is — build, research, fix, review, content, ops — which picks the default play
Full reference: docs/usage.md — every dimension, every value, selection precedence.
Where the tokens go
The target is zero wasted tokens, not minimal tokens. Workers get every pointer they
need to do the job — then keep a short work log while working and report densely when done. Noisy command
output is redirected to files, so dumps never enter anyone's context.
Every dispatch carries a short contract matched to its role — a dispatch with no block is a
defect, not a default:
Orient first — reading to understand is work, not waste. Then a short work log at each milestone — about 50 words, high signal — instead of narration, so the worker keeps its own thread and you can read along. Blockers come back structured; safety messages always go out. Written files follow the same discipline: length matched to what the task needs.
REVIEWER≈221 tok
Who: spec, quality, and panel reviewers.
Never self-filters. Every finding goes to a findings file with severity and confidence; inline is just the verdict and counts. Deciding what matters is the controller's job. Delivering that verdict is the completion condition — a finished-but-silent reviewer never finished.
MINIMAL≈19 tok
Who: advisors, verifiers, one-line judges.
One line: return only the answer in the asked shape. A 300-token contract on a 4-line return would cost more than it saves.
The life of a dispatch — where tokens get spent, saved, and where quality is guarded:
briefcontrollerinput quality ↑
Pointers, not payloads: the objective, the scope, read: pointers to the right files, a verification command, and a stop condition — instead of pasted file contents.example brief ▸
# .orchestrate/task-3-brief.mdObjective extract the rate-limit middleware; done = suite green, public API unchanged
Scope in: src/middleware · out: auth flow · must NOT change: response shape
Pointers read: src/middleware/rate.ts — current implementation @ 4f2c91a
read: src/config/limits.ts — constants to honor
Verification pnpm test middleware
Report .orchestrate/task-3-report.md · inline <15 lines
Stop BLOCKED if the storage backend is ambiguous — don't guess
brief-checkgatesaves a worker turn
A script fails dead pointers and missing sections before dispatch — a clarifying round-trip afterward costs a full worker turn.
workworker−narration −dumps
The worker orients, works, keeps a short milestone log in its own transcript, and redirects noisy output to .orchestrate/raw/ at execution time — the dump never enters context.
reportworkercompounds every turn
Dense and structured — the report becomes controller input that is re-read on every later turn, so every saved token compounds. Code and exact errors stay verbatim.
gate & ledgerreviewer · controllerrecall guard
Findings land in a file that caps can't truncate; the task lands as one ledger line. Resume reads the ledger and git log — never the transcript.
Honest numbers: expect 10–25% session-level savings, not the 65–75% output-only headlines. A/B on your provider's billing page before believing anyone — including this page.
Start here
Install once, then hand it a plan, an idea or a question. With no flags it prepares, picks a shape
and explains why — then waits for your approval before anything runs.
# install
npx skills add gabros20/orchestrate-skill -g
# or: clone + installer (per-host targets)
git clone https://github.com/gabros20/orchestrate-skill.git && cd orchestrate-skill
./install.sh claude # or: codex | agents | cursor | antigravity | opencode | grok | hermes | kimi | pi | all# run$orchestrate docs/feature-plan.md
$orchestrate "keep fixing until the suite passes" strategy=loop trigger=goal:"pytest green"
The same install runs on any Agent Skills
host — Claude Code is the reference; on the others the skill detects its host at kickoff,
binds what's native, and degrades honestly where a primitive is missing.
board --version says which release you have. On a run you
started earlier, board version says which release started it and whether anything
since then needs doing — so upgrading in the middle of a run is safe.
supported agents — who runs what
host
native subagents
model pin
worth knowing
Claude Code
deep, parallel, background
✓
the reference — every primitive native
Codex CLI
6 threads, depth 1
✓
invoke with $orchestrate; installs under $CODEX_HOME/skills
Cursor CLI
parallel + background
✓
headless ask-user is broken — human gates need ACP
Antigravity
async, depth 10, messaging
—
subagents inherit the parent's model
opencode
synchronous only
✓
parallel via opencode serve or external processes
Grok Build
8 parallel, auto-worktree
—
reads .claude/ wholesale; skills load at session start
Hermes
3 concurrent, flat
—
invoke /orchestrate explicitly — no auto-trigger
Kimi Code CLI
Agent/AgentSwarm, coder/explore/plan
—
native /goal loop; live-verified v0.28.0, smoke run pending
Pi
none — headless-CLI fan-out only
per process
thinnest host: no sandbox or approvals — worktree + diff review; docs-verified
team needs Claude Code or Antigravity and
workflow needs Claude Code; every other strategy runs everywhere —
worst case as headless-CLI fan-out. Full bindings and quirks:
shared-hosts.md.
An alias is a preset you name yourself in config.yaml.
Five ship built in — good defaults to steal:
alias
expands to
for
red-team
adversarial + panel:3
high-stakes builds — debate the plan, triple-lens the output
codex-grind
staged + engine=codex + effort=high
cheap bulk implementation, Claude reviews every task
swarm
parallel + workers=4 + review=spec
fast independent fan-out, minimal ceremony
afk
loop + trigger=goal + cycles:20, open_prs:1
walk-away grinding with hard rails
architect
advisor + worker:sonnet
big-model thinking, small-model doing
Copy-paste starting points for more scenarios:
docs/recipes.md.
model tiers — who runs on what
Model and reasoning effort are explicit on every dispatch — an omitted model
silently inherits the most expensive one, and effort is the first cost knob, tier the second.
A pin you requested is not a pin you got: the run records the model that actually ran beside
the one you asked for. And turn count beats token price — a too-cheap model takes 2–3× the
turns and loses the savings.
tier
job
default
never
advisor
rare judgment consults, out of the hot path
strongest
executes
orchestrator
plans, decomposes, assigns, measures
strong
implements
reasoner
architecture, hard debugging
opus-class
mechanical batches
worker
scoped execution
sonnet-class
design decisions
reviewer
spec / quality / verification
mid-tier floor
writes
peer
different-lineage second opinion
codex / grok
seeing the other peer's answer first
what appears on disk
$CODEX_HOME/skills/orchestrate/(client path varies)
├─ SKILL.md the router — grammar, catalog, universal rules
├─ config.yaml your saved aliases
├─ scripts/ workspace · capabilities · task-brief · review-package · brief-check · toolbox · board
└─ references/ strategies, shared contracts, one block per engine, dispatch templates<your repo>/.orchestrate/per-run workspace — self-ignoring, invisible to git
├─ run.md dimensions, budget, flight-plan outcome (the audit trail)
├─ task-N-brief.md / -report.md per-task handoffs
├─ decisions.md cross-cutting decisions — briefs cite IDs, never restate
├─ raw/ redirected command output — dumps never enter context
├─ toolbox.md probed orientation recipes — read, don't re-probe
├─ capabilities.md your machine's skills and CLIs, free or paid, and what's missing
├─ research/ one lane file per source, the report, the fact-check
├─ journal.jsonl · board the run's hash-chained spine + its views (checks, lanes, mail, receipts) — open a pane, run board
└─ progress.md THE LEDGER — resume trusts this + git log, not memory