Swarm. Fan out, then synthesize.
N role-specialized agents run the same task in parallel — each the same Orchestrator unit with a different role-lens. A separate synthesizer merges their answers into one. Diverse perspectives, not N identical runs.
One task, many lenses, one answer.
Each member is the same Orchestrator you already run — just given a different role-lens system prompt and, optionally, a different driver. They all execute the identical task in parallel.
A separate synthesizer agent then runs over the members' labeled answers and returns one merged result. When the council tools are present it calls tachibot_council / tachibot_jury to adjudicate disagreements — so the final answer is reconciled, not just concatenated.
Bounded, fault-tolerant, isolated.
maxIterations / timeoutMs / cost tracking.critical role such as the critic — surfaces a non-fatal warning, never a crash.tachibot_council / tachibot_jury to resolve disagreement.traceId. Members are independent: each writes its own session swarm:<traceId>:<role> and never reads peers' or prior runs' memory. The final answer is logged once under swarm:<traceId> for a clean, race-free trace.Run it three ways.
Default roster: implementer · critic · researcher. Progress streams to stderr — one line per member, any warnings, and the trace id. The synthesized answer prints to stdout.
1npm run swarm -- "design a rate limiter for the gateway"2# default roles: implementer · critic · researcher3 4# or the built bin directly5node dist/frontends/swarm.js "design a rate limiter for the gateway"1# comma-separated: `name` or `name:driver` · empty = defaults2export TACHI_SWARM_ROLES="implementer,critic:hermes,security,researcher"3npm run swarm -- "review this auth flow"1import { buildSwarmFromEnv } from "tachi-agent";2 3const swarm = await buildSwarmFromEnv();4try {5 const { answer, members, warnings } = await swarm.run("design a rate limiter");6 console.log(answer);7} finally {8 await swarm.close();9}