Graph validation codes

The Validate button in the editor runs the graph through the same validator that guards running and publishing. Every finding carries a code — that is what to search for.

Severity depends on what you are doing

The same rule can be advice in the editor and a refusal at deploy. A draft is allowed to be unfinished: you are still drawing the graph, and complaining about every unwired port would be noise. A graph about to go live, though, has to be runnable, so some rules escalate at that boundary.

Such codes are marked “depends” in the table. If you see a warning with one of them, treat it as an error — at deploy it becomes one.

The full list

CodeSeverityMeaning
array.input_shapewarningThe iteration shell receives something other than an array.
composite.in_counterrorWrong number of input boundaries in a composite.
composite.no_subgrapherrorA composite node has an empty body.
composite.out_counterrorWrong number of output boundaries in a composite.
config.unknown_fieldwarningThe configuration carries a field the node's schema does not declare.
exec.exit_no_exec_triggererrorNothing triggers the exit node.
exec.multi_exit_racedependsSeveral exits can run in one execution and overwrite each other's result.
exec.no_execution_edgesdependsThe graph has no execution edges — there is nothing to run.
graph.barrier_unsatisfiableerrorA barrier waits on a branch that comes out of itself.
graph.cycleerrorA cycle in the execution edges — the scheduler will not run this graph.
graph.multiple_entryerrorThe graph has more than one entry node — the second duplicates the same work.
graph.no_entrywarningThe graph has no entry node.
graph.no_exitwarningThe graph has no exit node.
llm.parent_chainerrorA sub-agent inherits its model from a parent, but the parent chain does not resolve.
node.config_invaliddependsThe node's configuration fails its own validation.
node.not_activatedwarningNothing activates the node — it will never run.
port_type.mismatchwarningPort payload types differ; the value will be coerced or lost.
ref.undefined_varwarningA template references a variable that is not declared.
ref.unknown_nodewarningA template references a node that is not in the graph.
struct.bad_node_iderrorA node id is not valid.
struct.duplicate_edge_iderrorTwo edges share an id.
struct.duplicate_node_iderrorTwo nodes share an id.
struct.edge_bad_channelerrorAn edge declares an invalid channel.
struct.edge_dangling_sourceerrorAn edge starts at a node that does not exist.
struct.edge_dangling_targeterrorAn edge ends at a node that does not exist.
struct.edge_missing_typeerrorAn edge has no wire type.
struct.edge_unknown_typeerrorAn edge names an unknown wire type.
struct.missing_node_iderrorA node has no id.
struct.schema_versionerrorUnsupported graph schema version.
subgraph.missing_entry_edgeerrorThe subgraph has no edge from its entry boundary.
subgraph.missing_exit_edgeerrorThe subgraph has no edge to its exit boundary.
subgraph.nested_iteration_shellerrorAn iteration shell is nested inside another where that is not supported.
var.duplicate_nameerrorTwo variables share a name.
wire.andjoin_partial_payloadwarningMutually exclusive branches meet at one port: only one value will arrive.
wire.annotation_edgewarningThe edge ends on a note: it has no ports, so the edge carries nothing and is dropped before the run.
wire.concurrent_stream_mergewarningTwo concurrent streams write into one reply and will interleave.
wire.fanin_ambiguouserrorSeveral values arrive at one port with no defined order.
wire.fanin_needs_barriererrorBranches can run in the same execution and race for the port — a wait_all is needed.
wire.handle_name_split_suffixwarningA port name ends in _exec/_data and collides with split-port aliases.
wire.on_error_disablederrorAn error branch is drawn while the node's error output is off.
wire.on_error_not_exposederrorThe node has no error output — enable expose_error_output.
wire.on_error_payload_type_mismatchwarningThe error branch expects a different payload type.
wire.port_incompatibleerrorThe ports are incompatible by wire type.
wire.port_not_acceptederrorThe target port does not accept this payload type.
wire.required_port_not_wireddependsA required port has nothing wired into it.
wire.resource_no_sourcedependsThe node has no source for a resource (knowledge base, connection): neither a port nor a config field.
wire.source_handle_missingerrorAn edge leaves a port the node does not have.
wire.stream_swallowed_by_barrierwarningA token stream hits a barrier and never reaches the chat.
wire.streaming_fanouterrorA token stream is forked to several consumers.
wire.target_handle_missingerrorAn edge targets a port the node does not have under its current configuration.

What next

  • Execution order — why “node not activated” is possible at all.
  • Graph boundaries — about graph.multiple_entry and exec.multi_exit_race.
  • Wires — port compatibility and the wire.* codes.