You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The contract half of the #10025 ruling (maintainer 2026-08-20, Option B taken
whole): a definition-level input-schema refusal is non-retryable and receives
its own ADR-0112 code as a never-dispatched exit, mirroring FLOW_DISABLED /
FLOW_NO_START_NODE (#9378 classification).
- spec: AutomationResult.code gains 'FLOW_INPUT_SCHEMA_INVALID', documented as
a trigger-time refusal classified BEFORE dispatch (no status; transport maps
it to 422 like FLOW_NO_START_NODE — unexecutable stored definition).
- ledger: one ERROR_CODE_LEDGER row under @objectstack/runtime with the
required TSDoc justification: never-dispatched semantics, non-retryable per
the #10025 ruling, one refusal row instead of 1 + maxRetries identical
failed rows; registered ahead of its producer by design (the #10413 to
#10576 split shape) — the emitting half is #10025's and asserts this exact
string by value.
- tests: ErrorCode.parse / ledger-containment / no-synonym pins in
error-code-ledger.test.ts; a compile-level union pin plus the
status-absent never-dispatched shape in automation-service.test.ts.
- generated: contract.mdx / error-code-ledger.mdx regenerated via gen:docs.
- changeset (minor): states plainly that retry accounting and run-log volume
change for affected flows once the services half lands (N identical failed
rows become one).
Claude-Session: https://claude.ai/code/session_012xGvxcwPRTJfA7RfjXEYA4
Co-authored-by: Claude <noreply@anthropic.com>
feat(spec): register `FLOW_INPUT_SCHEMA_INVALID` — the definition-level input-schema refusal becomes a never-dispatched exit with its own ADR-0112 code (#11504, the contract half of the #10025 ruling)
6
+
7
+
`AutomationResult.code` gains `'FLOW_INPUT_SCHEMA_INVALID'`, and the code is
8
+
registered in the ADR-0112 error-code ledger under `@objectstack/runtime`
9
+
beside `FLOW_DISABLED` / `FLOW_NO_START_NODE`. Semantics: a node's static
10
+
`config` violates the `inputSchema` its own flow definition declares, so the
11
+
engine refuses to dispatch — nothing runs, nothing is written, the result
12
+
carries the code and NO `status` (the #9378 never-dispatched class), and a
13
+
transport maps it to **422** (unexecutable stored definition, exactly as
14
+
`FLOW_NO_START_NODE`).
15
+
16
+
Ruled by #10025 (maintainer, 2026-08-20): the refusal is **non-retryable** —
17
+
the guard's verdict is a pure function of the flow definition, so re-running
18
+
it cannot change the answer. This release ships only the contract vocabulary;
19
+
the engine behaviour change is #10025's services half and lands separately.
20
+
21
+
**Operator-visible consequence once that services half lands, stated
22
+
plainly:** retry accounting and run-log volume change for affected flows. A
23
+
`strategy: 'retry'` flow whose node `config` violates its declared
24
+
`inputSchema` today burns its whole retry budget (including configured
Copy file name to clipboardExpand all lines: content/docs/references/api/contract.mdx
+2-1Lines changed: 2 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -27,7 +27,7 @@ const result = ApiErrorSchema.parse(data);
27
27
28
28
| Property | Type | Required | Description |
29
29
| :--- | :--- | :--- | :--- |
30
-
|**code**|`Enum<'VALIDATION_ERROR' \| 'INVALID_FIELD' \| 'MISSING_REQUIRED_FIELD' \| 'INVALID_FORMAT' \| 'VALUE_TOO_LONG' \| 'VALUE_TOO_SHORT' \| 'VALUE_OUT_OF_RANGE' \| … +289 more>`| ✅ | Error code (e.g. VALIDATION_ERROR; StandardErrorCode ∪ the ledger the serving side registers — ERROR_CODE_LEDGER for framework packages) |
30
+
|**code**|`Enum<'VALIDATION_ERROR' \| 'INVALID_FIELD' \| 'MISSING_REQUIRED_FIELD' \| 'INVALID_FORMAT' \| 'VALUE_TOO_LONG' \| 'VALUE_TOO_SHORT' \| 'VALUE_OUT_OF_RANGE' \| … +290 more>`| ✅ | Error code (e.g. VALIDATION_ERROR; StandardErrorCode ∪ the ledger the serving side registers — ERROR_CODE_LEDGER for framework packages) |
31
31
|**declaredCode**|`string`| optional | The producer-declared code, verbatim, when it is not a member of the closed `code` vocabulary — the open, author-authored channel (app-specific spellings; ADR-0112, #9106) |
|**userMessage**|`string`| optional | Producer-marked user-facing refusal text, verbatim (#9934). Present exactly when the producer opted in at throw time; consumers render it to end users and keep their generic substitution (#3821) for anything unmarked. Status-agnostic; never replaces `message`. |
@@ -182,6 +182,7 @@ const result = ApiErrorSchema.parse(data);
0 commit comments