Skip to content

Graph & wires

A workflow is a directed graph of nodes joined by wires. Press ▶ Run and threadle executes it in dependency order.

A workflow: a prompt feeds an agent, which feeds an approval gate, which feeds an output. The agent also has a session wired out of it.

The shape almost every workflow starts as. The agent’s session is wired out to the side. That’s what makes the next run continue the same conversation.


  1. Drop nodes from the palette, or drag a wire onto empty canvas and pick from the menu.
  2. Connect output → input. Incompatible pairs are refused while you drag.
  3. Optionally declare params and graph settings (parallelism, spend ceiling).
  4. Run, and watch the bottom dock. Run log for what happened, Issues for what blocks a start, Graph lint for soft hygiene.

The runner is wave-based, not line-by-line:

  1. Sort the graph topologically. A cycle is a hard error. A workflow that can never finish never starts.
  2. Collect every node whose predecessors have all completed. That’s the wave.
  3. Execute up to parallelism of them concurrently.
  4. Check the graph spend ceiling.
  5. Repeat until nothing is left.

A node executes once, when its inputs are ready. Multiple wires into one input are joined with blank lines unless you put a merge there. And only if that handle still has capacity. Built-ins like Delay are 1 in · 1 out. A merge is multi-in · 1 out. custom named ports default to one wire unless the manifest sets maxConnections.


StatusMeaning
idleNot in this run, skipped, or starved
queuedScheduled, waiting its turn
runningExecuting now (the node glows, its inbound wire marches)
successProduced output
errorFailed. See Errors & retries

Right-click any node:

ControlEffect
MuteSkip entirely. Downstream starves
BypassDon’t execute: pass inbound text straight through
RetryExtra attempts with backoff on failure
Continue on errorMark errored but keep the run alive
ClearOn Output nodes: wipe captured content
CopyOn Output. ❐ copies captured text (card + inspector)
Run from this nodePartial run: this node and all descendants
Test this nodePartial run: only this node

Nodes outside a partial run’s scope don’t re-execute. They contribute their last known result, read-only:

NodeContributes
Promptits text
Outputstored content
Contextits materialized payload
Agentthe tail of its linked session
Sessionthe session reference

That’s what makes it safe to fix stage four of a pipeline and re-run only the tail.


Each port is a small circle on the node edge. Hover for a native tooltip:

HintMeaning
inText (or session / context) input
outPrimary success output
err · after retries exhaustedAgent error connector (out:err). Lower red port
out · pass / fail / …Named multi-outs (Judge, Until, custom)
sub · child sessionSubagent attachment

Agent nodes stack out above err. The err wire paints red so fallback arms stay visible next to provider-colored happy-path wires. See Errors & retries · Agents.


Most full-graph ▶ Run presses start a server job (same as ≫). Partial runs and graphs that need interactive gates stay in the tab.

In-tab (gates / partial)Server job (▶ / ≫ / run --detach)
Approval, live handoff, circuit-breaker parkInteractive dockRequires approve-all
Context nodesMaterialize mid-run from a wired session / agent (or reuse Library payload)Same
Result sessionsWired onto the canvasStatuses and outputs persisted to the graph
Survives closing the tabNoYes. Reopen the workflow to resume watching

See Running and Detached runs.


A ▦ group frame is visual by default. Dragging it carries its members. A frame linked to a saved sub-workflow is executable: wires into it resolve to the subgraph’s entry nodes, wires out come from its exit nodes. See Frames & sub-workflows.