Skip to content
Like what we’re building? Star on GitHub

Iterion .bot property reference ​

The same iterion dsl spec --write command generates Monaco's lexical keywords, properties per kind and enum values per property in iterDsl.generated.ts, and the author JSON Schema of the YAML twin of a .bot (lot 5 of #1010): iterion-author.v1.schema.json, iterion-author.v2.schema.json, one per syntax profile, and iterion-author.schema.json, which dispatches on the required dsl: key. The lexer supplies its keyword table; this registry supplies the properties, the header and entry shapes, and the forms the schema renders. task dsl:check verifies the module and the three schema files alongside this reference.

Every declaration kind, node kind and block of the DSL, with the properties each accepts, the shape of every value and one line on what it means. This page is generated from the parser's property registry (pkg/dsl/spec) by iterion dsl spec --write (task dsl:gen): the registry is held to the real parser by a conformance test in both directions — every property listed here is accepted by the parser, every property the parser accepts is listed here — and task dsl:check fails when this page no longer matches the registry. The same registry gives an unknown property its remedy (iterion validate's fix: line: the closest accepted name, the block a name belongs to, the kind's own list) and feeds the property section of the authoring skills.

The readable grammar is dsl-grammar.md; the semantics of each property live in the DSL guide. The value forms:

FormWritten as
stringa quoted string: "…", a backtick raw string, or a | block scalar — or one plain bare word, which is the string it spells
identa bare name: a declared prompt, schema or node, or an accepted word; a quoted string is refused
dotted identa bare name, dotted when it addresses a group instance's node, a node's field or a plugin's kind (r1.look, node.field); a quoted string is refused
string|identeither of the two, a bare name dotted (github.com) allowed
string|numbera quoted string, a bare word, or a number with its unit attached (30s, 3)
prompt name, or its text as a stringa declared prompt's name, bare — or the prompt's own text, quoted or as a | block scalar: an inline prompt
int, number, boolan unquoted literal (3, 0.8, true)
one of …one of the listed words, bare or quoted; a word outside the list is refused
one of …, or a quoted ${VAR:-default} stringa listed word, or any quoted string kept as written and substituted at run time
json valueone JSON value on one line: "text", 12, true, null, [...], {key: value} — no signed number, no exponent
ident list, string list, tool list, skill listan inline [a, b] list, or one - item per indented line; an element of an ident list is a bare name; tool refs may be dotted (mcp.server.*), a quoted element is the literal name
map{ KEY: "v" } inline, or an indented KEY: v block
with { … }with { key: "value", … }; a number or a bool is the string it spells
block → kindan indented block whose lines are that kind's properties

A block made of author-named entries (vars:, schema, resources:, fallbacks:, …) shows the shape of one entry line — the name, then each part in its own spelling, an optional part in brackets — and, when the line has several parts, a table of the parts; a use or a group shows the parts of its header line the same way. The parts' forms are the ones above plus literal (a quoted string, an integer, a float or a bool), type (a builtin type or a declared schema's name, [] suffixes allowed) and the unions the entry itself names.

Generated from the parser's property registry (pkg/dsl/spec) by iterion dsl spec --write; do not edit by hand. A conformance test holds the registry to the parser in both directions.

prompt ​

A named text block, referenced by system: / user: / instructions:; its body is free text with {{…}} references and {{include "file"}} directives, the first line's indentation stripped from every line. Blank lines in the body are dropped by the lexer in profile 1 and kept as paragraph breaks in profile 2; a bare header declares an empty prompt.

A top-level declaration: prompt <name>:.

The body is free text, one indented block.

schema ​

A structured-output shape; a bare header declares an empty schema.

A top-level declaration: schema <name>:.

Entries: <field>: string | bool | int | float | json | string[] | file [enum: "a", "b"] — One field per line; file is valid only on the output schema of a human node whose interaction collects operator bytes (C129); the enum constraint applies to strings.

Entry partValueMeaning
typeone of string, bool, int, float, json, string[], fileThe field's type
enumstring listThe values a string field may take, quoted — optional

cursor ​

A prompt-engineering dial: an enum (values:) or a numeric band map (bands:) over [0, 1], each entry carrying a prompt fragment (C083–C086).

A top-level declaration: cursor <name>:.

PropertyValueMeaning
descriptionstringFree-text description shown by the studio and the reports
valuesblock → cursor.valuesEnum form: one name: "fragment" per line, order preserved
bandsblock → cursor.bandsNumeric form: one "lo..hi": "fragment" per line

cursor.values ​

The enum values of a cursor.

A block opened by values: inside cursor.

Entries: <name>: "prompt fragment" — Order is the position a numeric invocation snaps to.

cursor.bands ​

The numeric bands of a cursor.

A block opened by bands: inside cursor.

Entries: "<lo..hi>": "prompt fragment" — The range is parsed by the compiler (C085 when malformed).

supervisor ​

A concurrent LLM watcher of agent nodes that enqueues steering messages the watched node reads at its next turn (docs/supervisors.md); run metadata, not a graph node. An empty model follows the watched nodes' provider family.

A top-level declaration: supervisor <name>:.

PropertyValueMeaning
watchesident listAgent nodes the supervisor is armed for
modelstringModel id the backend serves, e.g. "anthropic/claude-opus-5"; empty takes the backend's default; a {{vars.x}} reference resolves (vars only), then $
systemprompt name, or its text as a stringThe system prompt: a declared prompt's name, or the text itself as a string (an inline prompt, named after its body)
cooldownstringMinimum delay between two evaluations, e.g. "2m"
max_evalsintUpper bound on evaluations per run
monitorsstring listEvent patterns armed from the first event (the CLI --monitor grammar)

mcp_server ​

An MCP server the workflow may activate: stdio (command/args) or http/sse (url), optionally OAuth2.

A top-level declaration: mcp_server <name>:.

PropertyValueMeaning
transportone of stdio, http, sseHow the server is reached
commandstringstdio: the executable
argsstring liststdio: its arguments
urlstringhttp / sse: the endpoint
authblock → authOAuth2 authorization-code/PKCE settings

auth ​

OAuth2 settings of an MCP server (only authorization-code/PKCE is wired).

A block opened by auth: inside mcp_server.

PropertyValueMeaning
typestring"oauth2"
auth_urlstringAuthorization endpoint
token_urlstringToken endpoint
revoke_urlstringRevocation endpoint (optional)
client_idstringOAuth client id
scopesstring listScopes requested

group ​

A reusable node cluster with parameters, whose body holds agent/judge/router/human/tool/compute declarations and edges; instantiated by use, expanded at compile time (C141 warns on a use of an empty group). Prompts read {{params.name}}; nodes are addressed as <prefix>.<node> once instantiated.

A top-level declaration: group <name>(<param>, …):.

Header partValueMeaning
paramsident listThe parameters a use binds with its with map; prompts read {{params.<name>}} — optional

The body holds agent, judge, router, human, tool, compute declarations and edge lines.

use ​

One instance of a group, on a single line with no body: the name after use is the group's, as gives the instance its prefix, the with map binds the group's parameters.

A top-level declaration: use <group> as <prefix> [with { <param>: "value", … }].

Header partValueMeaning
asidentThe prefix the instance's nodes are addressed by (<prefix>.<node>)
withwith { … }The parameter bindings; a number or a bool is the string it spells — optional

vars ​

Typed run parameters, overridable with --var and presets.

A block opened by vars: inside the top level, workflow.

Entries: <name>: string | bool | int | float | json | string[] [enum: "a", "b"] [matching: "<re>"] [= <default>] — One var per line; the enum and matching constraints apply to strings; a json/string[] default is a quoted JSON text.

Entry partValueMeaning
typeone of string, bool, int, float, json, string[]The var's type
enumstring listThe values a string var may take, quoted — optional
matchingquoted stringAn RE2 pattern a string var's value must match, checked at launch against --var and payload values; beside enum in either order, at most one of each — optional
defaultliteralThe value the run starts with when no --var or preset sets one; a json or string[] default is written as a quoted JSON text — optional

presets ​

Named bundles of var values selected with --preset.

A block opened by presets: inside the top level.

Entries: <name>: (indented) <var>: <literal> — Each entry is a preset name whose indented lines set one var each.

Each entry's indented lines: Entries: <var>: <literal> — A var of the file and the literal it takes under this preset.

attachments ​

Operator-supplied files and images the run receives.

A block opened by attachments: inside the top level, workflow.

Entries: <name>: file | image — An entry may open an indented sub-block; an entry's sub-block is a attachment.

attachment ​

The optional sub-block of one attachment.

An entry opened by attachments: inside attachments.

PropertyValueMeaning
descriptionstringFree-text description shown by the studio and the reports
accept_mimestring listMIME types accepted
requiredboolThe run cannot start without it

secrets ​

Secrets the run resolves by name from the team's or the local store (docs/secrets.md).

A block opened by secrets: inside the top level.

Entries: <name>: ["value"] — The value on the header line is optional: a bare name: (with or without a sub-block) resolves the stored secret by name; an entry's sub-block is a secret.

secret ​

The optional sub-block of one secret.

An entry opened by secrets: inside secrets.

PropertyValueMeaning
valuestringInline value — prefer the stored secret, resolved by name
asstring|ident — value, fileHow the secret is materialised: value (env/template) or file
mount_pathstringas: file — the path inside the sandbox
envstring|identEnvironment variable that receives the value
optionalboolA missing secret does not fail the launch
hostsstring listHosts the secret may be sent to
sinksstring listMaterialization sinks the secret may reach — prompt, agent, command, params, file, egress; omitted = every sink (docs/secrets.md)
descriptionstringFree-text description shown by the studio and the reports

agent ​

An LLM node with tools, structured I/O and any backend.

A node: agent <name>: at the top level or inside a group.

PropertyValueMeaning
descriptionstringFree-text description shown by the studio and the reports
modelstringModel id the backend serves, e.g. "anthropic/claude-opus-5"; empty takes the backend's default; a {{vars.x}} reference resolves (vars only), then $
backendstringExecution backend: claw, claude_code, codex, pi, kimi, grok or opencode; a {{vars.x}} reference resolves (vars only), then $
providerstringProvider hint for credential resolution, e.g. "anthropic"; a {{vars.x}} reference resolves (vars only), then $
commandstringExecutable that drives a CLI backend, overriding its default binary
inputidentSchema the node's input is validated against
outputidentSchema the node's structured output must match
publishidentArtifact name the output is published under (read back as {{artifacts.<name>}})
artifact_labelstool listLabels stamped on the published artifact; a quoted element is the literal label
deliverablesstring listFiles the node produces that the run collects and serves as downloads: workspace-relative paths, each served under its base name (C317/C318) — the declared twin of the [iterion] attachment= directive
systemprompt name, or its text as a stringThe system prompt: a declared prompt's name, or the text itself as a string (an inline prompt, named after its body)
userprompt name, or its text as a stringThe user message: a declared prompt's name, or the text itself as a string (an inline prompt, named after its body)
sessionone of fresh, inherit, inherit_if_available, fork, artifacts_only, persistHow the node's LLM session relates to the previous node's
session_slotidentNamed durable session slot; requires session: persist; must not be named like another node (C314)
toolstool listTools the node may call; tools: [] declares NO tools, no line at all leaves it undeclared. Restricts claw (C135 on a name it lacks, C159 on a name it holds but cannot serve); on claude_code it becomes --disallowedTools over that CLI's native roster, on codex a sandbox mode; pi/kimi/grok never receive it (C270)
tool_policytool listTool-policy entries applied on top of tools
capabilitiestool listBoard capabilities opened to the node: board.create, board.move, board.read, … (C080/C081). capabilities: [] declares NO capability — it overrides the workflow's list; no line at all inherits it
skillsskill listSkill-library skills mirrored into the run's .claude/skills
tool_max_stepsintUpper bound on tool-call rounds in one execution
max_tokensintOutput-token cap per call
reasoning_effortone of none, low, medium, high, xhigh, max, ultracode, or a quoted ${VAR:-default} stringReasoning effort; none disables reasoning on the models that carry it (GPT-6 Sol/Luna) — elsewhere the behaviour is per-route: claw and claude_code clamp it to the lowest real level (low), pi spells it off, codex's CLI refuses it on a model without it, opencode passes it through; ultracode is xhigh plus multi-agent orchestration, reliable on Opus 4.8 and the Claude 5 family (Opus 5, Fable 5.1) only (C089 warns elsewhere); a quoted string is env-substituted at runtime
timeoutstringDuration the node may run, e.g. "20m"
readonlyboolDeclares the node mutates no workspace file, so it may run beside another branch
full_accessboolGrants the backend its full tool access
imagesstring listImage paths sent with the prompt
interactionone of none, human, llm, llm_or_human, review, async, human_or_hostHow the node asks the operator (ADR-081); human_or_host lets the host application answer in the operator's place, whichever comes first (docs/assistant-dock.md, C212)
interaction_promptidentPrompt the llm interaction mode answers with in the operator's place
interaction_modelstringModel the llm interaction mode uses; a {{vars.x}} reference resolves (vars only), then $
awaitone of wait_all, best_effortConvergence rule when several incoming branches reach the node
compressident — on, ultra, offCommand-output compression: on, ultra or off (C102)
auto_memoryident — on, offThe backend's own auto-memory: on or off (C131/C132)
ambient_contextident — none, workspace, operator, allWhat the node inherits besides its prompt: the repository's instruction files (workspace, the default), the operator's setup (operator), both (all) or nothing (none) — ADR-119 (C184/C185/C187)
permissionident — off, ask, denyTool-permission gate: off, ask or deny (C110–C112)
allowstring listPermission rules always allowed on this node, Tool(pattern) syntax; a non-empty list REPLACES the workflow's allow: (C154 refuses an unreadable rule, C111 warns when nothing gated reads the list)
askstring listPermission rules that pause for approval on this node; a non-empty list REPLACES the workflow's ask: (C154/C111; C136 and C176 screen the node's routes against it)
denystring listPermission rules always blocked on this node; a non-empty list REPLACES the workflow's deny: (C154/C111)
needsident | ident listResource(s) leased from the workflow's resources: block for the node's duration
fallbacksblock → fallbacksOrdered, NAMED alternative routes taken when the primary fails (ADR-087); a chain with no route is refused
mcpblock → mcpMCP servers active for the node
compactionblock → compactionContext-compaction thresholds of the node's session
memoryblock → memoryiterion's shared-memory tools and scopes for the node
sandboxone of none, auto, or a block → sandboxSandbox for this scope: a bare mode (none, auto) or an indented block — the inline form, which needs image: or build: (C044)
cursorsblock → cursorsPrompt-engineering dials activated on the node (docs/cursors.md)

judge ​

An LLM node producing verdicts; same surface as an agent, typically without tools.

A node: judge <name>: at the top level or inside a group.

PropertyValueMeaning
descriptionstringFree-text description shown by the studio and the reports
modelstringModel id the backend serves, e.g. "anthropic/claude-opus-5"; empty takes the backend's default; a {{vars.x}} reference resolves (vars only), then $
backendstringExecution backend: claw, claude_code, codex, pi, kimi, grok or opencode; a {{vars.x}} reference resolves (vars only), then $
providerstringProvider hint for credential resolution, e.g. "anthropic"; a {{vars.x}} reference resolves (vars only), then $
commandstringExecutable that drives a CLI backend, overriding its default binary
inputidentSchema the node's input is validated against
outputidentSchema the node's structured output must match
publishidentArtifact name the output is published under (read back as {{artifacts.<name>}})
artifact_labelstool listLabels stamped on the published artifact; a quoted element is the literal label
deliverablesstring listFiles the node produces that the run collects and serves as downloads: workspace-relative paths, each served under its base name (C317/C318) — the declared twin of the [iterion] attachment= directive
systemprompt name, or its text as a stringThe system prompt: a declared prompt's name, or the text itself as a string (an inline prompt, named after its body)
userprompt name, or its text as a stringThe user message: a declared prompt's name, or the text itself as a string (an inline prompt, named after its body)
sessionone of fresh, inherit, inherit_if_available, fork, artifacts_only, persistHow the node's LLM session relates to the previous node's
session_slotidentNamed durable session slot; requires session: persist; must not be named like another node (C314)
toolstool listTools the node may call; tools: [] declares NO tools, no line at all leaves it undeclared. Restricts claw (C135 on a name it lacks, C159 on a name it holds but cannot serve); on claude_code it becomes --disallowedTools over that CLI's native roster, on codex a sandbox mode; pi/kimi/grok never receive it (C270)
tool_policytool listTool-policy entries applied on top of tools
capabilitiestool listBoard capabilities opened to the node: board.create, board.move, board.read, … (C080/C081). capabilities: [] declares NO capability — it overrides the workflow's list; no line at all inherits it
skillsskill listSkill-library skills mirrored into the run's .claude/skills
tool_max_stepsintUpper bound on tool-call rounds in one execution
max_tokensintOutput-token cap per call
reasoning_effortone of none, low, medium, high, xhigh, max, ultracode, or a quoted ${VAR:-default} stringReasoning effort; none disables reasoning on the models that carry it (GPT-6 Sol/Luna) — elsewhere the behaviour is per-route: claw and claude_code clamp it to the lowest real level (low), pi spells it off, codex's CLI refuses it on a model without it, opencode passes it through; ultracode is xhigh plus multi-agent orchestration, reliable on Opus 4.8 and the Claude 5 family (Opus 5, Fable 5.1) only (C089 warns elsewhere); a quoted string is env-substituted at runtime
timeoutstringDuration the node may run, e.g. "20m"
readonlyboolDeclares the node mutates no workspace file, so it may run beside another branch
full_accessboolGrants the backend its full tool access
imagesstring listImage paths sent with the prompt
interactionone of none, human, llm, llm_or_human, review, async, human_or_hostHow the node asks the operator (ADR-081); human_or_host lets the host application answer in the operator's place, whichever comes first (docs/assistant-dock.md, C212)
interaction_promptidentPrompt the llm interaction mode answers with in the operator's place
interaction_modelstringModel the llm interaction mode uses; a {{vars.x}} reference resolves (vars only), then $
awaitone of wait_all, best_effortConvergence rule when several incoming branches reach the node
compressident — on, ultra, offCommand-output compression: on, ultra or off (C102)
auto_memoryident — on, offThe backend's own auto-memory: on or off (C131/C132)
ambient_contextident — none, workspace, operator, allWhat the node inherits besides its prompt: the repository's instruction files (workspace, the default), the operator's setup (operator), both (all) or nothing (none) — ADR-119 (C184/C185/C187)
permissionident — off, ask, denyTool-permission gate: off, ask or deny (C110–C112)
allowstring listPermission rules always allowed on this node, Tool(pattern) syntax; a non-empty list REPLACES the workflow's allow: (C154 refuses an unreadable rule, C111 warns when nothing gated reads the list)
askstring listPermission rules that pause for approval on this node; a non-empty list REPLACES the workflow's ask: (C154/C111; C136 and C176 screen the node's routes against it)
denystring listPermission rules always blocked on this node; a non-empty list REPLACES the workflow's deny: (C154/C111)
needsident | ident listResource(s) leased from the workflow's resources: block for the node's duration
fallbacksblock → fallbacksOrdered, NAMED alternative routes taken when the primary fails (ADR-087); a chain with no route is refused
mcpblock → mcpMCP servers active for the node
compactionblock → compactionContext-compaction thresholds of the node's session
memoryblock → memoryiterion's shared-memory tools and scopes for the node
sandboxone of none, auto, or a block → sandboxSandbox for this scope: a bare mode (none, auto) or an indented block — the inline form, which needs image: or build: (C044)
cursorsblock → cursorsPrompt-engineering dials activated on the node (docs/cursors.md)

router ​

A routing node: fan_out_all, fan_out_each, condition, round_robin or llm (docs/routers.md). Never takes await.

A node: router <name>: at the top level or inside a group.

PropertyValueMeaning
descriptionstringFree-text description shown by the studio and the reports
modeone of fan_out_all, fan_out_each, condition, round_robin, llmRouting mode
modelstringllm mode only (C023 otherwise): Model id the backend serves, e.g. "anthropic/claude-opus-5"; empty takes the backend's default; a {{vars.x}} reference resolves (vars only), then $
backendstringllm mode only (C023 otherwise): Execution backend: claw, claude_code, codex, pi, kimi, grok or opencode; a {{vars.x}} reference resolves (vars only), then $
providerstringProvider hint for credential resolution, e.g. "anthropic"; a {{vars.x}} reference resolves (vars only), then $
systemprompt name, or its text as a stringllm mode only (C023 otherwise): The system prompt: a declared prompt's name, or the text itself as a string (an inline prompt, named after its body)
userprompt name, or its text as a stringllm mode only (C023 otherwise): The user message: a declared prompt's name, or the text itself as a string (an inline prompt, named after its body)
multiboolllm mode only (C023 otherwise): the model may select several outgoing edges
reasoning_effortone of none, low, medium, high, xhigh, max, ultracode, or a quoted ${VAR:-default} stringllm mode only (C023 otherwise): Reasoning effort; none disables reasoning on the models that carry it (GPT-6 Sol/Luna) — elsewhere the behaviour is per-route: claw and claude_code clamp it to the lowest real level (low), pi spells it off, codex's CLI refuses it on a model without it, opencode passes it through; ultracode is xhigh plus multi-agent orchestration, reliable on Opus 4.8 and the Claude 5 family (Opus 5, Fable 5.1) only (C089 warns elsewhere); a quoted string is env-substituted at runtime
overstringfan_out_each: expression naming the collection to iterate
asidentfan_out_each: alias each item is bound to ({{each.<as>}})
keyidentfan_out_each: item field that names each branch
depends_onidentfan_out_each: item field naming the branch this one waits for (requires key)
needsident | ident listResource(s) leased from the workflow's resources: block for the node's duration

human ​

A pause point the operator answers (interaction human, the default), an LLM answers (llm / llm_or_human), the host application may answer (human_or_host), or a review gate (review).

A node: human <name>: at the top level or inside a group.

PropertyValueMeaning
descriptionstringFree-text description shown by the studio and the reports
inputidentSchema the node's input is validated against
outputidentSchema the node's structured output must match
publishidentArtifact name the output is published under (read back as {{artifacts.<name>}})
artifact_labelstool listLabels stamped on the published artifact; a quoted element is the literal label
instructionsprompt name, or its text as a stringPrompt shown to the operator as the question: a declared prompt's name, or the text itself as a string
systemprompt name, or its text as a stringThe system prompt: a declared prompt's name, or the text itself as a string (an inline prompt, named after its body)
modelstringModel id the backend serves, e.g. "anthropic/claude-opus-5"; empty takes the backend's default; a {{vars.x}} reference resolves (vars only), then $
interactionone of none, human, llm, llm_or_human, review, async, human_or_hostHow the node asks the operator (ADR-081); human_or_host lets the host application answer in the operator's place, whichever comes first (docs/assistant-dock.md, C212)
interaction_promptidentPrompt the llm interaction mode answers with in the operator's place
interaction_modelstringModel the llm interaction mode uses; a {{vars.x}} reference resolves (vars only), then $
min_answersintAnswers required before the node resumes
awaitone of wait_all, best_effortConvergence rule when several incoming branches reach the node
review_urlstringreview: the PR/MR the gate reviews (a {{…}} reference is accepted)
posturestring|ident — human_required, agent_verdict_okreview: who may merge — human_required (default) or agent_verdict_ok; another word is refused at compile (C156)
merge_strategystring|ident — squash, mergereview: squash (default) or merge; another word is refused at compile (C156)
merge_intostring|identreview: current (default), none or a branch name
max_turnsintreview: conversation turns before the gate escalates

tool ​

The deterministic node, no LLM. One of three recipes: command: runs through bash -c, script: through the interpreter language: names, action: calls a connector operation (ADR-098). With output: a command prints schema-shaped JSON on stdout. A Verified Action adds goal + postcondition + policy + recovery (ADR-044), which an action: refuses (C262/C263).

A node: tool <name>: at the top level or inside a group.

PropertyValueMeaning
descriptionstringFree-text description shown by the studio and the reports
commandstringShell command, run through bash -c (exclusive with script)
scriptstringInline script run by the interpreter language: names
languageident — js, node, py, python, python3, sh, bashInterpreter for script:
env_expansionident — braced, noneWhat the engine expands in this node's bodies before they run: the braced environment forms (braced, the default) or nothing (none), which hands ${NAME} and ${NAME:-default} to the body's own reader as written — ADR-130; another word, or the property on an action: node that has no body, is refused (C004)
inputidentSchema the node's input is validated against
outputidentSchema the node's structured output must match
publishidentArtifact name the output is published under (read back as {{artifacts.<name>}})
artifact_labelstool listLabels stamped on the published artifact; a quoted element is the literal label
deliverablesstring listFiles the node produces that the run collects and serves as downloads: workspace-relative paths, each served under its base name (C317/C318) — the declared twin of the [iterion] attachment= directive
awaitone of wait_all, best_effortConvergence rule when several incoming branches reach the node
sandboxone of none, auto, or a block → sandboxSandbox for this scope: a bare mode (none, auto) or an indented block — the inline form, which needs image: or build: (C044)
compressident — on, ultra, offCommand-output compression: on, ultra or off (C102)
permissionidentParsed for symmetry but NOT enforced on a tool node (C112 warns): the command runs directly, the gate is an agent's
needsident | ident listResource(s) leased from the workflow's resources: block for the node's duration
parallel_safeboolDeclares the node safe to run beside a mutating branch
goalstringVerified action: what the command is for, in one line
postconditionstringVerified action: command whose exit code is the truth oracle at every rung
policyident — required, recover, best_effortVerified action: required (default), recover or best_effort (C103–C106)
recoveryblock → recoveryVerified action: the self-heal ladder's bounds
actionstring|identConnector operation to call, connector.resource.verb, bare or quoted — exclusive with command:/script: (ADR-098, C260)
connectionstring|identThe connection binding that authenticates the action, bare or quoted (an alias may carry a dash) (C261)
paramsblock → paramsThe action's arguments, by the operation's own parameter keys
retrystring|numberAction: how many EXTRA attempts, e.g. 3; a duration is refused and empty means none (C265). Inert without action: (C266)
timeoutstring|numberAction: bound on one call, e.g. 30s (C265). Inert without action: (C266)

params ​

The arguments of a connector action, keyed by the operation's own parameter names.

A block opened by params: inside tool.

Entries: <key>: "value" — The key is the operation's own parameter name, quoted when it is not an identifier ("user-id"); a {{…}} template is rendered and then coerced to the type the operation declares, so an integer field receives a number.

recovery ​

Bounds of a Verified Action's recovery ladder (idempotent-skip → recipe → self-repair → agent → policy).

A block opened by recovery: inside tool.

PropertyValueMeaning
max_repair_attemptsintSelf-repair rungs before the agent rung
max_agent_attemptsintAgent rungs before the policy decides
modelstringModel id the backend serves, e.g. "anthropic/claude-opus-5"; empty takes the backend's default; a {{vars.x}} reference resolves (vars only), then $
agent_toolstool listTools the recovery agent may call

compute ​

A deterministic expression node: each expr entry is evaluated by the bounded expression language into an output field.

A node: compute <name>: at the top level or inside a group.

PropertyValueMeaning
descriptionstringFree-text description shown by the studio and the reports
inputidentSchema the node's input is validated against
outputidentSchema the node's structured output must match
publishidentArtifact name the output is published under (read back as {{artifacts.<name>}})
artifact_labelstool listLabels stamped on the published artifact; a quoted element is the literal label
awaitone of wait_all, best_effortConvergence rule when several incoming branches reach the node
exprblock → exprOne field: "expression" per output field

expr ​

The expressions of a compute node.

A block opened by expr: inside compute.

Entries: <field>: "expression" — An expression over vars, input, outputs, artifacts, loop and run — not a {{template}}.

subbot ​

Runs another .bot as a nested child run; its outputs read back as {{outputs.<subbot>.<field>}} (C119).

A node: subbot <name>: at the top level or inside a group.

PropertyValueMeaning
descriptionstringFree-text description shown by the studio and the reports
sourcestringPath of the child .bot, relative to this file
withwith { … }Child vars; {{…}} references are allowed in the values
outputidentSchema the node's structured output must match
needsident | ident listResource(s) leased from the workflow's resources: block for the node's duration
isolatedboolAsserts the child runs in its own workspace
auto_mergeboolLands the child when its own workflow completes: its own worktree finalization merges its branch; refused at launch where the child owns no worktree (worktree: none, or a run store with no filesystem root); requires isolated (C329)
merge_strategystring|identauto_merge: squash (default) or merge; another word is refused at compile
merge_intostring|identauto_merge: current (default), none or a branch name; read only under auto_merge (C330)

emit ​

Publishes a named run-scoped event with an immutable payload (ADR-051).

A node: emit <name>: at the top level or inside a group.

PropertyValueMeaning
descriptionstringFree-text description shown by the studio and the reports
eventstringEvent name
withwith { … }Payload fields

wait ​

Blocks its branch until the named event fires; the timeout is mandatory (ADR-051, C196–C198).

A node: wait <name>: at the top level or inside a group.

PropertyValueMeaning
descriptionstringFree-text description shown by the studio and the reports
eventstringEvent name awaited
timeoutstringDuration after which the wait fails, e.g. "30s" (mandatory)
outputidentSchema the node's structured output must match

await_answers ​

Parks its branch until every pending ask_user_async question of from: (or the whole run) is answered; output {answers: […]} (ADR-081, C241/C242).

A node: await_answers <name>: at the top level or inside a group.

PropertyValueMeaning
descriptionstringFree-text description shown by the studio and the reports
fromstring|identNode whose async questions are awaited; omit for the whole run
timeoutstringDuration after which the node fails, e.g. "30m" (mandatory)

fail ​

A named terminal failure with a typed code and a message (C247 checks the UPPER_SNAKE code, C248 refuses a reserved one).

A node: fail <name>: at the top level or inside a group.

PropertyValueMeaning
descriptionstringFree-text description shown by the studio and the reports
codestring|identError code, UPPER_SNAKE (bare or quoted)
messagestringMessage; {{…}} references are rendered
resumableboolLeaves the run failed_resumable instead of failed

workflow ​

The graph: entry, edges (src -> dst [when …|else] [as loop(N)] [with {…}]), and the run-wide settings; a bare header declares an empty workflow (C008).

A top-level declaration: workflow <name>:.

PropertyValueMeaning
entrydotted identNode the run starts at; a dotted name addresses a group instance's node
contractidentThe bot's public contract (a top-level contract declaration), bound to the program (C300–C304)
varsblock → varsWorkflow-scoped vars (merged with the file's)
attachmentsblock → attachmentsWorkflow-scoped attachments
budgetblock → budgetRun caps, each overridable by the matching run flag
resourcesblock → resourcesNamed semaphores and pools nodes lease with needs:
mcpblock → mcpMCP servers active for the run
compactionblock → compactionDefault compaction thresholds
sandboxone of none, auto, or a block → sandboxSandbox for this scope: a bare mode (none, auto) or an indented block — the inline form, which needs image: or build: (C044)
worktreeident — auto, noneauto runs the workflow in a fresh git worktree, finalised into a branch; none runs in place
default_backendstringBackend for nodes that name none; a {{vars.x}} reference resolves (vars only), then $
compressident — on, ultra, offCommand-output compression: on, ultra or off (C102)
auto_memoryident — on, offThe backend's own auto-memory: on or off (C131/C132)
ambient_contextident — none, workspace, operator, allWhat the node inherits besides its prompt: the repository's instruction files (workspace, the default), the operator's setup (operator), both (all) or nothing (none) — ADR-119 (C184/C185/C187)
loop_budget_guardident — on, offDecline a loop's back-edge the budget cannot fund: on (default) or off (C133)
repo_devboxident — on, offLoad the target repo's devbox.json toolchain: on (default) or off (C134)
workspace_checkpointident — on, offMid-run preservation of a copy-based sandbox's workspace as a checkpoint branch pushed to the run's own remote: on (default) or off (C139)
permissionident — off, ask, denyTool-permission gate: off, ask or deny (C110–C112)
allowstring listPermission rules always allowed, Tool(pattern) syntax
askstring listPermission rules that pause for approval
denystring listPermission rules always blocked
tool_policytool listRun-wide tool-policy entries
capabilitiestool listRun-wide board capabilities; a node's own capabilities: replaces them — capabilities: [] on the node holds none
skillsskill listRun-wide skill-library skills
interactionone of none, human, llm, llm_or_human, review, async, human_or_hostDefault interaction mode for the run's nodes that set none

budget ​

Run caps; a zero or absent cap is the engine default, and each is overridable per run without editing the .bot.

A block opened by budget: inside workflow.

PropertyValueMeaning
max_parallel_branchesintConcurrent branches (0 = engine default)
max_durationstringWall-clock cap, e.g. "4h"
max_cost_usdnumberSpend cap in USD
max_tokensintTotal token cap
warn_tokensintAdvisory: crossing it emits budget_warning
max_iterationsintTotal node executions; also the fuel of an unbounded loop (C097)
on_exceededone of fail, pauseWhat a reached cap does on the run's own flow: fail (default) ends the run resumably; pause parks it paused_operator until an operator raises the budget (C311 names an unknown word)

resources ​

Named resources nodes lease with needs:.

A block opened by resources: inside workflow.

Entries: <name>: <int> | ["member-a", "member-b"] — A count is a semaphore; a quoted list is a pool whose members are leased one at a time.

compaction ​

When and how a session's context is compacted.

A block opened by compaction: inside workflow, agent, judge.

PropertyValueMeaning
thresholdnumberContext fraction (0–1) that triggers compaction
preserve_recentintRecent messages kept verbatim

memory ​

iterion's shared-memory tools for a node (docs/memory-and-knowledge.md); distinct from auto_memory.

A block opened by memory: inside agent, judge.

PropertyValueMeaning
enabledboolOpen the memory tools to the node
scopestringMemory scope the tools read and write
autoloadstring listDocuments injected at node start
readboolAllow memory_read
writeboolAllow memory_write
pre_compact_injectboolRe-inject memory before a compaction
project_rootboolKey the space on the repository root rather than the working directory (legacy; exclusive with visibility) — profile 1 only (removed in profile 2)
visibilitystring — bot, project, cross_project, user, org, globalWho sees the space (C170); quoted

mcp ​

Which MCP servers are active; an empty block wires nothing (C135 stays an error).

A block opened by mcp: inside workflow, agent, judge.

PropertyValueMeaning
autoload_projectboolWorkflow scope: load the repository's .mcp.json servers (default true)
inheritboolNode scope: inherit the workflow's active servers (default true)
serversident listmcp_server declarations activated
disableident listServers removed from the ambient set

sandbox ​

Per-run container isolation (docs/sandbox.md): the short form names a mode, the block form is inline and needs image: or build: (C044).

A block opened by sandbox: inside workflow, agent, judge, tool.

PropertyValueMeaning
modeident — none, auto, inlinenone, auto (devcontainer.json or the published slim image) or inline (C044 on another word)
imagestringContainer image (exclusive with build): a full reference (registry/repo:tag), or a bare stock-class name (slim, full, sec, browser, rgaa) resolved at launch to the published variant — an unknown bare word passes through verbatim, with C325
buildblock → sandbox.buildDockerfile build, local docker only (V2-6)
userstringContainer user
workspace_folderstringMount point of the workspace inside the container
host_stateident — auto, noneMount ~/.iterion and ~/.claude into the container: auto or none
post_createstringCommand run once after the container starts
envmapEnvironment variables
mountsstring|ident listExtra bind mounts
networkblock → sandbox.networkEgress policy (open by default)

sandbox.build ​

A Dockerfile build of the sandbox image (docker driver only).

A block opened by build: inside sandbox.

PropertyValueMeaning
dockerfilestringDockerfile path
contextstringBuild context
argsmapBuild arguments

sandbox.network ​

Network egress of the sandbox, enforced by a CONNECT proxy on the host.

A block opened by network: inside sandbox.

PropertyValueMeaning
modeident — open, allowlist, denylistopen (no proxy), allowlist or denylist (C044 on another word)
presetstring|identRule preset, e.g. "iterion-default"
inheritident — replace, appendHow a node's rules compose with the workflow's: omit to merge (the default), or replace / append (C044 on another word)
rulesstring|ident listHosts and globs; a leading ! negates

cursors ​

Cursor activation on a node: the reserved enabled: key plus one setting per declared cursor.

A block opened by cursors: inside agent, judge.

PropertyValueMeaning
enabledboolGate for the whole block (an explicit block opts in)

Entries: <cursor_name>: ident | number | "string" — A value name, a position in [0, 1], or a quoted string for ${VAR} substitution.

fallbacks ​

The named alternative routes of a node, tried in declaration order when the primary fails (ADR-087/ADR-091); the one block that may not stand bare — a chain with no route is refused.

A block opened by fallbacks: inside agent, judge.

Entries: <route>: — One named route per entry, its settings in the indented sub-block; order is the try order; an entry's sub-block is a fallback.

fallback ​

One named route of a fallbacks: chain (ADR-087/ADR-091), tried in declaration order.

An entry opened by fallbacks: inside fallbacks.

PropertyValueMeaning
backendstringExecution backend: claw, claude_code, codex, pi, kimi, grok or opencode; a {{vars.x}} reference resolves (vars only), then $
modelstringModel id the backend serves, e.g. "anthropic/claude-opus-5"; empty takes the backend's default; a {{vars.x}} reference resolves (vars only), then $
providerstringProvider hint for credential resolution, e.g. "anthropic"; a {{vars.x}} reference resolves (vars only), then $
onident list over usage_window, auth, unavailable, transient_exhausted, anyFailure classes that take this route (default usage_window, unavailable; never any or auth by default)
meteredboolThe route spends a metered API key (credential hint)
actionstring|ident — skipskip: complete the node with a zero-value output stamped _skipped instead of failing
whenstringExpression over vars that gates the route

contract ​

The public interface of a bot, named by the workflow's contract:; no prompts, tools or provider configuration. A bare header followed by a blank line or the end of the file declares an empty contract.

A top-level declaration: contract <name>:.

PropertyValueMeaning
display_namestringExplicit human-readable name
responsibilitystringThe single responsibility this bot fulfils
versionintPublic contract version, 1 or more (C300); defaults to 1
inputsblock → contract.portsNamed typed values and files the bot takes; each one is a declared var (C300)
outputsblock → contract.portsNamed typed values and files the bot produces on success; each one names the node and field that produce it (C301)
criteriablock → contract.criteriaDeterministic registered checks on a port; prose is not executable
effectsblock → contract.effectsVisible effects, including paid operations

contract.ports ​

Public input or output ports, in declaration order.

A block opened by inputs / outputs: inside contract.

Entries: <name>: <type> — One port per line, its properties in the optional indented sub-block; an entry's sub-block is a contract.port.

contract.port ​

One named typed port. Missing, null and [] remain different values.

An entry opened by inputs / outputs: inside contract.ports.

PropertyValueMeaning
descriptionstringMeaning of the value
requiredboolMandatory port (default true). An input mirrors its var — required exactly when the var has no default — and a written value that disagrees is refused (C300)
nullableboolPermit an explicit null value (default false); on an input whose var has no default, the one way to be optional — omitted, the var is null (C300)
defaultjson valueTyped default of an optional input: the var's default, read as the launch reads a value of its type (a string[] or json var's text as a list or an object) — written, it must be the var's (C300); omitted, the var's is the port's. One JSON value on one line — "text", 12, true, null, [...], {key: value} — with no signed number and no exponent, which the text cannot write and the compiler refuses from a document (C302)
min_itemsintMinimum array cardinality (C300 on an input, C301 on an output)
max_itemsintMaximum array cardinality (C300 on an input, C301 on an output)
fromdotted identProducer of an output: node.field for a value, node for a file (C301); refused on an input (C300)
fileblock → contract.fileProperties of a delivered or consumed file; existence and provenance are the runtime's checks

contract.file ​

Verifiable properties of a produced or consumed file.

A block opened by file: inside contract.port.

PropertyValueMeaning
media_typestringExpected media type
min_bytesintMinimum file size
schemaidentSchema of structured file contents

contract.criteria ​

Deterministic acceptance checks on the ports, each a registered evaluator with JSON parameters — never prose.

A block opened by criteria: inside contract.

Entries: <name>: — A named deterministic acceptance check, described in its indented sub-block; an entry's sub-block is a contract.criterion.

contract.criterion ​

One named check: an evaluator, the port it reads, its parameters. A bare header declares a check nothing evaluates yet.

An entry opened by criteria: inside contract.criteria.

PropertyValueMeaning
kinddotted identRegistered deterministic validator (see the criteria table; a plugin's may be dotted); an unregistered kind is declared but not evaluated (C303)
portdotted identChecked port, singular: input.<name> or output.<name> (C302)
paramsjson valueParameters validated against the criterion's parameter declaration (C302): one JSON object on one line, e.g. {min: 2}

contract.effects ​

The bot's externally visible operations, documented; an effect grants nothing — the sandbox, the allow-lists and the verified actions keep the admission.

A block opened by effects: inside contract.

Entries: <name>: — A visible effect of the bot, described in its indented sub-block; an entry's sub-block is a contract.effect.

contract.effect ​

One named effect and whether it may cost money.

An entry opened by effects: inside contract.effects.

PropertyValueMeaning
descriptionstringExternally visible operation
paidboolThe operation may incur a charge; unknown cost remains unknown

Deterministic public criteria ​

A contract's criteria: name one of these evaluators by kind:; a kind this table does not have is declared and rendered but not evaluated (C303). Parameters are JSON data.

CriterionPort typesParametersMeaning
min_lengthstring, arraymin: int (required)Minimum Unicode character or array element count
patternstringpattern: string (required)String matches a Go regular expression