Every attribute on nodes
Unknown attributes are errors everywhere. A complete graph declares at least graph [version="1", entry="hello"]. Entry must name a node or an import placeholder. Node IDs are unique; imported IDs acquire a dotted prefix during loading.
Graph attributes
Section titled “Graph attributes”| Attribute | Meaning and default |
|---|---|
version |
Required version string. Use 1 for a new graph. |
entry |
Required first node ID. |
description |
Optional description shown with the graph. |
inputs, defaults |
Declared inputs and literal default values. See context. |
max_visits |
Positive whole-number agent visit budget, default 200. Commands and waits do not spend it. |
default_fidelity |
History detail, default compact. See history and threads. |
permissions |
auto-accept by default, or full. |
harness, model, effort, connection, provider |
Turn configuration, inherited unless overridden. |
profile, profile_<name>, model_stylesheet |
Reusable turn configuration. |
The graph also accepts every harness-specific attribute listed below.
Attributes on every node
Section titled “Attributes on every node”| Attribute | Meaning |
|---|---|
shape |
Node type. See each node type. |
label |
Optional non-empty display text. Changes no identity and no routing. |
class |
Names separated by commas or spaces, for model stylesheet selection. |
max_visits |
Positive whole number counting every visit to that node, of any kind. No limit unless declared. Exceeding it holds for the operator. |
Attributes by node type
Section titled “Attributes by node type”| Attribute | Node type | Constraint |
|---|---|---|
prompt, prompt_file |
Agent, fan-in | Exactly one on an agent; either or neither on a fan-in. prompt_file resolves relative to the graph file. |
outputs |
Agent | Comma-separated name:kind with kinds choice, text, json, work. |
fidelity |
Agent, fan-in | Overrides graph default_fidelity for arrivals at this node. |
thread |
Agent | Session name shared across agent nodes. Forbidden inside parallel branches. |
profile |
Agent | Selects a graph profile. |
probes |
Command | Comma-separated pr, threads, diff, worktree. Excludes script, facts and timeout. |
script, facts |
Command | Appear together. facts declares dotted name:kind with kinds bool, number, text. |
timeout |
Command with script |
Duration, default ten minutes. |
duration |
Wait | Required duration such as 15m. |
action |
Worktree | Required create or remove. |
max_parallel |
Fan-out | Positive integer, default 4. |
outcome |
Terminal | success by default; also failed and aborted. |
import |
Import placeholder | Path to a complete graph, relative to the file naming it. |
Edge attributes
Section titled “Edge attributes”| Attribute | Default and constraint |
|---|---|
condition |
Omitted means fallback, or a branch start on a fan-out. |
weight |
Numeric, default 0. Conditioned edges are tried highest first and cannot share a weight. |
fidelity |
Overrides target node and graph history detail for this arrival. |
loop_restart |
false by default; true clears iteration context and sessions. |
repair_budget, repair_round |
Must appear together. See error handling. |
exit |
Only on edges leaving import placeholders. A normal node cannot use it. |
Turn configuration
Section titled “Turn configuration”Model, connection and provider are non-empty names interpreted by the harness. Supported harness names are claude, codex and opencode. Effort accepts minimal, low, medium, high, xhigh, max and ultra, and each harness accepts only its declared subset. Unsupported resolved settings are rejected before turns start. Claude and Codex support no connection or provider pin; OpenCode supports both.
A graph attribute such as profile_review="harness=codex effort=high" declares a named profile, and profile="review" selects it at graph or agent level. Fields are harness, model, effort, connection and provider. Unknown, duplicated or malformed fields are errors, and unused profiles warn.
model_stylesheet holds CSS-like rules, for example * { effort: medium; } .review { effort: high; }. Selectors match all nodes, a node kind, a class, or a node ID with #, and specificity rises in that order. Later equal-specificity rules win. Unknown properties fail loading; unmatched rules warn.
Each setting resolves independently through the node’s harness-specific value, the node’s unqualified value, the node’s profile, the stylesheet’s harness-specific value, the stylesheet’s unqualified value, the graph’s harness-specific value, the graph’s unqualified value, the graph’s default profile, then the harness default. Overriding effort therefore keeps the inherited model. How to use different models works through an example.
Harness-specific attributes
Section titled “Harness-specific attributes”These are accepted on graphs, agent nodes and stylesheet rules. Invalid names or values are rejected even when that harness is not selected.
| Attribute | Values |
|---|---|
| claude_model, codex_model, opencode_model | Non-empty model name. |
| claude_effort, codex_effort | Effort supported by that harness. |
| claude_setting_sources | Comma-separated user, project, local. Empty disables filesystem settings. |
| codex_sandbox_mode | read-only, workspace-write, danger-full-access. |
| codex_approval_policy | never, on-request, on-failure, untrusted. |
| opencode_connection, opencode_provider | Non-empty configured connection or provider name. |
Permissions defaults to auto-accept; full requests unrestricted approval. This is harness configuration, not an instruction inside the prompt. The transcript records the resolved turn settings.
Inline attribute expressions on this page are syntax fragments. Use the complete attribute wrapper and the linked runnable examples as validation contexts.