Skip to content

Loose ends

⌀ Loose ends is a tab in the bottom dock, beside Run log and Issues. It continuously lints the graph you’re editing and lists everything that looks unintentional — without blocking a run by itself.

Click a row to focus that node on the canvas.


KindMeaning
danglingA node produces text that no wire carries away — the output is dropped
unwiredA node that cannot work without input has none (or a required named port is empty)
unreachableDisconnected from any source, or trapped in a cycle
unused-paramA declared param is never referenced as {{param:name}}
mutedA node is muted and will be skipped on the next run

Loose ends is a map, not a gate. Nothing here stops you from pressing ▶ Run — half these states are legitimate while you’re mid-build.

Hard blockers live on the ✗ Issues tab (same readiness check that runs before ▶ / ≫):

BlockerCause
model not setAn agent node without a model
required input not wiredA node that can’t produce anything
context unusableA context node with no payload and no session source
artifact not pickedA skill or rules node with nothing selected
live handoff unboundNo agent on the node and no inbound session
frame boundaryA linked sub-workflow frame wired in a way that can’t resolve

Wiring / custom-port gaps can appear in both tabs — Issues as the blocker, Loose ends as the hygiene row.


A long list is normal on a graph in progress. The rows worth acting on, in order:

  1. unwired — this will fail (also under Issues)
  2. unreachable — this will never run; often a cycle you didn’t intend
  3. dangling — you built something and forgot to use it
  4. unused-param — usually a renamed placeholder that no longer matches
  5. muted — a reminder, not a problem

Because muting is easy to forget. A workflow that mysteriously skips its review stage a week later is nearly always a mute somebody left on. Listing it costs one row and saves the confusion.