Skip to content

2 · Intermediate

Goal: stop writing straight lines. Split work across branches, bring it back together deliberately, loop over lists, put limits on what a run may do, and watch long server jobs from the terminal.

Every example at this level runs without an agent except where noted.


A server job keeps running after you close the tab. The agent-free teaching graph is a ◷ Delay for about a minute:

Terminal window
threadle --no-open
threadle run detached-delay --detach
threadle jobs
threadle attach <jobId>

Reopen the workflow later — statuses and the output sync from the job.

▶ Example: Detached delay

See Detached runs · CLI.


One node can feed several. Wire a prompt into two different converters and both fire — the graph is a DAG, not a line.

What bites people is the other direction: several wires into one node. By default those texts are joined with blank lines, silently. That’s fine for two short strings and terrible for anything you care about. Which brings us to the knot.


A Knot node makes fan-in an explicit decision:

StrategyBehavior
concatJoin candidates with a separator
firstTake the first inbound text
majorityMost common answer wins
synthesizeBuild a labeled merge prompt — optionally run a model on the node to write the synthesis

majority and synthesize are what turn “ask three agents” into “ask three agents and get one answer”.

▶ Examples: Knot concat, Knot first-wins

See Knot.


2.4 ∀ Iterator — one graph, many items

Section titled “2.4 ∀ Iterator — one graph, many items”

An Iterator splits inbound text into items — by lines, by blank-line-separated blocks, or by parsing a JSON array — with an optional cap. A downstream agent then runs once per item, sequentially in one session, and the outputs are collected.

This is how a checklist becomes N runs without N copies of the graph.

▶ Example: Iterator lines

See Iterator.


2.5 Mute and bypass — editing a graph without rewiring

Section titled “2.5 Mute and bypass — editing a graph without rewiring”

Two per-node toggles, borrowed from ComfyUI:

ToggleEffect
MuteNode is skipped entirely; downstream starves
BypassNode doesn’t execute; its inbound text passes straight through

Bypass is how you A/B a converter or take an agent out of a chain for a moment without deleting anything.

▶ Example: Mute & bypass


2.6 ‡ Tripwire — automatic circuit breakers

Section titled “2.6 ‡ Tripwire — automatic circuit breakers”

A tripwire watches a wire and fires when a condition is met. Two of the five modes matter most at this level:

ModeTrips when
contentText is empty, shorter than a minimum, or matches (or fails to match) a regex
spendRun spend crosses a dollar threshold

And three possible reactions:

ActionEffect
abortStop the run
skipFail this node, starve the branch, let the rest continue
parkPause for a human — same editable dock as an approval gate

A content tripwire that parks on /ERROR/ is the cheapest quality gate you will ever build.

There’s also a graph-wide spend ceiling in ≔ params, checked between waves — a seatbelt independent of any node.

▶ Examples: Content tripwire, Min-chars tripwire, Spend tripwire

See Tripwire.


The bottom dock has three tabs:

  • Run log — what happened, in order, with per-node timing and cost lines
  • ✗ Issues — hard readiness problems that block ▶ / ≫ (missing model, unwired required ports, …)
  • ⌀ Loose ends — always-on soft lint: dangling outputs, unreachable nodes, unused params, muted nodes

Issues block a run. Loose ends never do — they’re a map of everything you probably didn’t mean.

See Bottom dock and Loose ends.


  • you can start a detached run and inspect it with threadle attach / jobs
  • you reach for a knot instead of letting wires silently concatenate
  • you can fan a prompt to two agents and merge by majority
  • you can explain the difference between mute and bypass without thinking
  • every unattended graph you build has a ceiling or a tripwire on it

3 · Advanced — parallelism, pipelines, and headless runs.