Skip to content

Commit 90af512

Browse files
committed
docs(automation): flows.mdx stops claiming node config is unchecked (#4277)
The docs-drift advisory on #4332 flagged flows.mdx, and it was right: the node-property table and the strict-shells callout both described config as an open record with no enforcement, which #4277 changed — undeclared keys reject at registerFlow() and the contract-carrying builtins parse their config at execute time. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CW8ZP3zUuC7ovSxqnN5o77
1 parent abb096d commit 90af512

1 file changed

Lines changed: 9 additions & 3 deletions

File tree

content/docs/automation/flows.mdx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ Each node performs a specific action in the flow.
138138
| `id` | `string` || Unique node identifier |
139139
| `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 at `registerFlow()` |
140140
| `label` | `string` || Display label |
141-
| `config` | `object` | optional | Type-specific configuration (an open record — the registered executor's `configSchema` owns its shape) |
141+
| `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) |
142142
| `connectorConfig` | `object` | optional | `{ connectorId, actionId, input }` for a `connector_action` node |
143143
| `position` | `{ x, y }` | optional | Visual position on canvas |
144144
| `timeoutMs` | `number` | optional | Per-node execution timeout |
@@ -148,8 +148,14 @@ Each node performs a specific action in the flow.
148148

149149
<Callout type="info">
150150
The flow, node, edge, and variable **shells are `.strict()`** — a key they do not
151-
declare is a parse error naming the likely intended key, not a silent strip. (A
152-
node's `config` stays open, so plugin node types keep their own vocabulary.)
151+
declare is a parse error naming the likely intended key, not a silent strip. A
152+
node's `config` is open at the flow-parse level (plugin node types keep their own
153+
vocabulary), but it is not unchecked: `registerFlow()` rejects config keys the
154+
node type's published `configSchema` does not declare — naming the path, the
155+
declared key set, and a did-you-mean — and the contract-carrying builtins
156+
additionally `parse()` their config at execute time, refusing the node on a type
157+
or missing-`required` violation (#4277). A node type that publishes no
158+
`configSchema` declares nothing, so nothing can be undeclared.
153159
</Callout>
154160

155161
### Node Examples

0 commit comments

Comments
 (0)