Skip to content

Commit cb5a4f9

Browse files
committed
test(lint,service-automation): re-spell fixtures that used the retired loose config location; docs: name the refusal
Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011ZyGVR3TdcTDLhuzyEbkBN
1 parent b8622ad commit cb5a4f9

4 files changed

Lines changed: 9 additions & 9 deletions

File tree

‎content/docs/automation/flows.mdx‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,11 @@ Each node performs a specific action in the flow.
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 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` |
140140
| `label` | `string` | ✅ | Display label |
141141
| `config` | `object` | optional | Type-specific configuration — its node type owns its shape. On every built-in node type with an executor contract, a key that contract does not declare is refused at the flow parse, at the key's path; on a plugin node type, a key the published `configSchema` does not declare is rejected at `registerFlow()`. An `approval` node's config is judged whole against its declared contract at the flow parse, and the built-in executors `parse()` the value against their Zod contract before running |
142-
| `connectorConfig` | `object` | ✅ on `connector_action` | `{ connectorId, actionId, input }` — the only input a `connector_action` node's executor reads. `FlowSchema` refuses a `connector_action` node without it, and one whose `connectorId` or `actionId` is blank (empty or whitespace only), at any depth including a region body. `connectorId` is the registered connector's `name`, `actionId` one of the action keys it declares; `input` is optional |
142+
| `connectorConfig` | `object` | ✅ on `connector_action` | `{ connectorId, actionId, input }` — the only input a `connector_action` node's executor reads. `FlowSchema` refuses a `connector_action` node without it, and one whose `connectorId` or `actionId` is blank (empty or whitespace only), at any depth including a region body. `connectorId` is the registered connector's `name`, `actionId` one of the action keys it declares; `input` is optional. The same three keys written under the node's `config` are refused (since 18), each naming its `connectorConfig` key |
143143
| `position` | `{ x, y }` | optional | Visual position on canvas |
144144
| `timeoutMs` | `number` | optional | Per-node execution timeout |
145145
| `inputSchema` | `object` | optional | Declared input parameter types, for Studio form generation and runtime validation |
146-
| `waitEventConfig` | `object` | ✅ on `wait` | `wait`-node event descriptor (`eventType`, `timerDuration`, `signalName`). `FlowSchema` refuses a `wait` node without it; `eventType` has no default, and `eventType: 'timer'` requires a non-blank `timerDuration`. `timeoutMs` / `onTimeout` were removed in 17 (#4158) — `wait` has no timeout; `timerDuration` is a string, and a quoted bare number (`'60000'`) is read as milliseconds |
146+
| `waitEventConfig` | `object` | ✅ on `wait` | `wait`-node event descriptor (`eventType`, `timerDuration`, `signalName`). `FlowSchema` refuses a `wait` node without it; `eventType` has no default, and `eventType: 'timer'` requires a non-blank `timerDuration`. `timeoutMs` / `onTimeout` were removed in 17 (#4158) — `wait` has no timeout; `timerDuration` is a string, and a quoted bare number (`'60000'`) is read as milliseconds. Event keys written under the node's `config` instead (`eventType`, `timerDuration` or `duration`, `signalName` or `signal`, `timeoutMs`) are refused (since 18), each naming its `waitEventConfig` key |
147147
| `boundaryConfig` | `object` | ✅ on `boundary_event` | BPMN boundary-event descriptor (interop). `FlowSchema` refuses a `boundary_event` node without it |
148148

149149
<Callout type="info">

‎packages/lint/src/lint-flow-patterns.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ describe('lintFlowPatterns — approval revise loop (ADR-0044)', () => {
287287
) => {
288288
const stack = approvalFlow(edges) as any;
289289
stack.flows[0].nodes = stack.flows[0].nodes.map((n: any) =>
290-
n.id === 'wait' ? { id: 'wait', type: 'wait', config: { eventType: 'signal' } } : n,
290+
n.id === 'wait' ? { id: 'wait', type: 'wait', waitEventConfig: { eventType: 'signal' } } : n,
291291
);
292292
return stack;
293293
};
@@ -2089,7 +2089,7 @@ describe('per-iteration containment (#13681 / #14394)', () => {
20892089
{ id: 'n4', type: 'delete_record', label: 'Delete', config: { objectName: 'task', filter: { case_id: CEL('currentCase.id') } } },
20902090
{ id: 'n5', type: 'http', label: 'Call', config: { url: 'https://example.test' } },
20912091
{ id: 'n6', type: 'notify', label: 'Notify', config: { title: 'x' } },
2092-
{ id: 'n7', type: 'connector_action', label: 'Connector', config: { connectorId: 'c', action: 'a' } },
2092+
{ id: 'n7', type: 'connector_action', label: 'Connector', connectorConfig: { connectorId: 'c', actionId: 'a' } },
20932093
{ id: 'n8', type: 'script', label: 'Script', config: { function: 'f' } },
20942094
{ id: 'n9', type: 'subflow', label: 'Subflow', config: { flowName: 'child' } },
20952095
{ id: 'n10', type: 'map', label: 'Map', config: { collection: { dialect: 'cel', source: 'items' } } },

‎packages/lint/src/validate-expressions.flow-cel-root.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,8 @@ describe('controls — one per binding kind the run has', () => {
209209
describe('the door stands down where the run can bind a name it cannot see', () => {
210210
it.each<[string, AnyRec]>([
211211
['a `script` (its function gets the live variable map)', { id: 'fn', type: 'script', config: { function: 'enrich' } }],
212-
['a `connector_action` (its handler gets the live variable map)', { id: 'push', type: 'connector_action', config: { connectorId: 'slack', actionId: 'post' } }],
213-
['a `wait` (a resume folds the caller\'s bag)', { id: 'hold', type: 'wait', config: { eventType: 'signal', signalName: 'go' } }],
212+
['a `connector_action` (its handler gets the live variable map)', { id: 'push', type: 'connector_action', connectorConfig: { connectorId: 'slack', actionId: 'post' } }],
213+
['a `wait` (a resume folds the caller\'s bag)', { id: 'hold', type: 'wait', waitEventConfig: { eventType: 'signal', signalName: 'go' } }],
214214
['a `subflow` (a resume folds the caller\'s bag)', { id: 'child', type: 'subflow', config: { flowName: 'other' } }],
215215
['a `map` (a resume folds the caller\'s bag)', { id: 'each', type: 'map', config: { collection: { dialect: 'cel', source: 'rows' }, flowName: 'other' } }],
216216
['a plugin node type', { id: 'ai', type: 'ai_classify', config: {} }],

‎packages/services/service-automation/src/run-summary.test.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -943,7 +943,7 @@ describe('uncountable effects (#4354 follow-up)', () => {
943943
name: 'f', label: 'f', type: 'autolaunched',
944944
nodes: [
945945
{ id: 'start', type: 'start', label: 'S' },
946-
{ id: 'push', type: 'connector_action', label: 'P', config: { connectorId: 'crm', actionId: 'push', input: {} } },
946+
{ id: 'push', type: 'connector_action', label: 'P', connectorConfig: { connectorId: 'crm', actionId: 'push', input: {} } },
947947
{ id: 'end', type: 'end', label: 'E' },
948948
],
949949
edges: [{ id: 'e1', source: 'start', target: 'push' }, { id: 'e2', source: 'push', target: 'end' }],
@@ -977,7 +977,7 @@ describe('uncountable effects (#4354 follow-up)', () => {
977977
name: 'f', label: 'f', type: 'autolaunched',
978978
nodes: [
979979
{ id: 'start', type: 'start', label: 'S' },
980-
{ id: 'push', type: 'connector_action', label: 'P', config: { connectorId: 'crm', actionId: 'push', input: {} } },
980+
{ id: 'push', type: 'connector_action', label: 'P', connectorConfig: { connectorId: 'crm', actionId: 'push', input: {} } },
981981
{ id: 'end', type: 'end', label: 'E' },
982982
],
983983
edges: [{ id: 'e1', source: 'start', target: 'push' }, { id: 'e2', source: 'push', target: 'end' }],
@@ -1003,7 +1003,7 @@ describe('uncountable effects (#4354 follow-up)', () => {
10031003
name: 'child', label: 'child', type: 'autolaunched',
10041004
nodes: [
10051005
{ id: 'start', type: 'start', label: 'S' },
1006-
{ id: 'push', type: 'connector_action', label: 'P', config: { connectorId: 'crm', actionId: 'push', input: {} } },
1006+
{ id: 'push', type: 'connector_action', label: 'P', connectorConfig: { connectorId: 'crm', actionId: 'push', input: {} } },
10071007
{ id: 'end', type: 'end', label: 'E' },
10081008
],
10091009
edges: [{ id: 'e1', source: 'start', target: 'push' }, { id: 'e2', source: 'push', target: 'end' }],

0 commit comments

Comments
 (0)