Tidebase Tidebase GitHub Start self-hosting
Docs

Fan out to subagents with child runs

To run subagents in parallel and rejoin their results durably, use run.fanout(). Each branch becomes a child run with its own checkpoints, joined results are stored in a normal checkpointed step, and a resumed parent reuses its existing children instead of spawning duplicates.

const results = await run.fanout('research-options', [
  { name: 'flights', workflow: researchFlights, input: { destination } },
  { name: 'hotels',  workflow: researchHotels,  input: { destination } },
  { name: 'food',    workflow: researchFood,    input: { destination } }
])

Tidebase is an open-source checkpoint layer for AI agents: wrap your steps, and failed runs resume from the last safe point — in your own Postgres, without moving execution into a new runtime.

Semantics

  • Idempotent by edge name. Child run creation is keyed by parent run + edge name (flights, hotels, food). If the parent crashes and resumes, Tidebase returns the existing child runs — no duplicate subagents, no double work, no double spend.
  • Independent checkpointing. Each child is a full run: its own steps, state, events, and gates, visible in Studio as a parent/child tree.
  • Durable join. The joined result is stored in a checkpointed step named join:<fanout-name>, so a parent resuming after the join doesn’t re-gather children’s results.

Why this matters for agent architectures

Multi-agent systems fail partially: two subagents finish, one dies. Without durable fanout you either rerun everything (slow, expensive, duplicate side effects) or hand-roll per-branch bookkeeping. With parent/child run edges the partial failure is queryable — GET /runs/:runId returns childRuns with per-child status — and resuming the parent re-invokes only the unfinished branch.

See also: Fork and time travel · How to resume a failed run