Skip to content

Commit c07ea32

Browse files
committed
docs(automation): the flow authoring guide states the one node-id space (#16134)
`flows.mdx` said `id` was a "Unique node identifier" with no scope and called a region "self-contained" with no id caveat — the two places an author would now meet the parse refusal without warning. Both now say node ids are one space across the top-level `nodes[]` and every region body, refused at parse. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016N6xmWt5hYm94ffVEwGH8x
1 parent 38c0589 commit c07ea32

1 file changed

Lines changed: 6 additions & 2 deletions

File tree

content/docs/automation/flows.mdx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ Each node performs a specific action in the flow.
134134

135135
| Property | Type | Required | Description |
136136
| :--- | :--- | :--- | :--- |
137-
| `id` | `string` || Unique node identifier |
137+
| `id` | `string` || Unique node identifier — unique across the **whole flow**: the top-level `nodes[]` and every region body (`loop.body`, `parallel.branches[]`, `try_catch.try` / `.catch`, at any depth) share one id space, and `FlowSchema` refuses a reused id at parse (`Duplicate node id …`, naming both locations) |
138138
| `type` | `string` || Node type — a built-in id from the table above **or** a plugin-registered one. Per ADR-0018 the spec does not gate this with a closed enum; it is checked against the live action registry once that registry is complete — plugins contribute node types while they start, so flows registered during boot are checked in one pass when the vocabulary closes (all plugins started), and anything registered after that (Studio publish, dev reload) is checked immediately. Unknown types warn, never reject; executing one fails with `NO_EXECUTOR` |
139139
| `label` | `string` || Display label |
140140
| `config` | `object` | optional | Type-specific configuration — the registered executor's `configSchema` owns its shape. Keys that schema does not declare are rejected at `registerFlow()`, and the built-in executors `parse()` the value against their Zod contract before running (#4277) |
@@ -496,7 +496,11 @@ a malformed construct is rejected before the flow can run.
496496
A region runs in the **enclosing variable scope** (the iterator value and any
497497
body mutations are visible to the surrounding flow) — it is *not* a separate
498498
`subflow` invocation. The container node's ordinary out-edges are the
499-
"after-loop / after-block" continuation.
499+
"after-loop / after-block" continuation. "Self-contained" describes control
500+
flow and variable scope, not ids: node ids are **one space across the whole
501+
flow**, so a region node may not reuse an id declared at the top level or in
502+
any other region — the collision is refused at parse (see `id` under
503+
[Node Structure](#node-structure)).
500504

501505
### Loop container
502506

0 commit comments

Comments
 (0)