An agent skill · prepares the run, then runs it

/orchestrate

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

runs onClaude CodeCodexCursorAntigravityopencodeGrok BuildHermesKimi CodePi

The idea

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.

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 number Q1 Ship macOS first, Windows after v1? ↳ yes — one platform keeps v1 testable end to end Q2 Install ytrelay for the YouTube lane? npm i -g youtube-relay-mcp ↳ yes — free and local; without it that lane scrapes pages Q3 No test runner chosen yet — scout X and GitHub before picking? ↳ yes — track record over hype you › 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 itit runs
a build across domainshierarchical — a lead per domain runs its own parallel workers, reviews and merges; an integrator joins the domains
a build in one areaparallel — every task that doesn't need another's code starts at once; the rest start the moment theirs is merged
a true chainstaged — one task after another, each gated
a research questionparallel source lanes → synthesis → fact-check (research ↓)
a bugsolo when the cause is known · a team that debates hypotheses when it isn't · a loop to green
a reviewparallel lenses — security, performance, architecture — votes counted

Or force one yourself — find it by the shape of your task:

controller / strong model worker script external CLI

stagedchains

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

cdxcldgrk
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.

sourcewhat it's best fortool, free first
GitHubwhat already exists, who maintains it, real usage; issues are known breakageghrelay · gh
Xlaunches, practitioners comparing tools, new projectsxrelay
YouTubeconference talks, demos, maintainers explaining a designytrelay
the webofficial docs, engineering blogs from teams running it at scaleweb search + fetch
HN · Redditdissent, failure stories, "we switched from…"curl · Algolia API, RSS
registriesadoption and release cadencenpm view · PyPI · crates.io

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:

observation ≠ transition proposal ≠ authority tool success ≠ accepted progress accepted progress = validation + durable writeback + committed readback

The third is the one most runs get wrong: an exit code of 0 only proves the process exited — not that the work landed.

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.

? 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 inbox mail for impl-3: #28 12:58 [peer impl-2] renamed src/auth/session.ts — import path moves # a peer's heads-up learned 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 for record 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
engineclaude codex
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:

knobwhat it controlsdefault
strategythe run shape — one of the nine aboveauto → triage picks
kindwhat the task is — build, research, fix, review, content, ops — which picks the default playtriage classifies it
preppreparation before triage — interview, tool inventory, install proposals, toolchain scoutauto — interview only when unclear
reviewwhich gates run on each resultdual — spec, then quality
enginewho executes — claude, codex, grok, cursor, agy, opencode, hermes, kimi, pi, or mixedclaude
modelswhich model tier does which jobtier map (appendix)
posturehow much to spend on quality: frontier, balanced or economy — picks a concrete model per role from dated benchmark and price databalanced
effortreasoning level per role — the first cost knob, model tier is the secondpinned per dispatch where the surface allows
isolationwhether workers get their own git worktreeworktree when >1 writer
triggerrun once, on a goal, on an interval, on a scheduleonce
workershow many run at once3–5
budgethard caps — cycles, agents, tokens, open PRsper strategy
confirmwhether the flight plan gates on your approvalon — off still prints the plan
the full command grammar
/orchestrate [plan-file | task description] strategy=auto|staged|parallel|hierarchical|team|workflow|loop|advisor|adversarial|xcli kind=build|research|fix|review|content|ops|other prep=auto|full|off review=dual|spec|quality|panel:N|consensus:N|factcheck|off engine=claude|codex|grok|cursor|agy|opencode|hermes|kimi|pi|mixed models=orchestrator:opus,worker:sonnet,advisor:strongest,… effort=low|medium|high|xhigh|max | worker:low,reviewer:high,… isolation=worktree|branch|off workers=N trigger=once|goal:"tests green"|interval:5m|schedule:"0 6 * * *" budget=cycles|agents|tokens confirm=on|off alias=saved-preset

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:

WORKER≈751 tok

Who: implementers, leads, integrators, researchers, loop executors.
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:

  1. 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.md Objective 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
  2. 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.
  3. 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.
  4. 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.
  5. 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
hostnative subagentsmodel pinworth knowing
Claude Codedeep, parallel, background✓the reference — every primitive native
Codex CLI6 threads, depth 1✓invoke with $orchestrate; installs under $CODEX_HOME/skills
Cursor CLIparallel + background✓headless ask-user is broken — human gates need ACP
Antigravityasync, depth 10, messaging—subagents inherit the parent's model
opencodesynchronous only✓parallel via opencode serve or external processes
Grok Build8 parallel, auto-worktree—reads .claude/ wholesale; skills load at session start
Hermes3 concurrent, flat—invoke /orchestrate explicitly — no auto-trigger
Kimi Code CLIAgent/AgentSwarm, coder/explore/plan—native /goal loop; live-verified v0.28.0, smoke run pending
Pinone — headless-CLI fan-out onlyper processthinnest 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:

aliasexpands tofor
red-teamadversarial + panel:3high-stakes builds — debate the plan, triple-lens the output
codex-grindstaged + engine=codex + effort=highcheap bulk implementation, Claude reviews every task
swarmparallel + workers=4 + review=specfast independent fan-out, minimal ceremony
afkloop + trigger=goal + cycles:20, open_prs:1walk-away grinding with hard rails
architectadvisor + worker:sonnetbig-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.

tierjobdefaultnever
advisorrare judgment consults, out of the hot pathstrongestexecutes
orchestratorplans, decomposes, assigns, measuresstrongimplements
reasonerarchitecture, hard debuggingopus-classmechanical batches
workerscoped executionsonnet-classdesign decisions
reviewerspec / quality / verificationmid-tier floorwrites
peerdifferent-lineage second opinioncodex / grokseeing 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

Layout details: docs/usage.md.