Skip to content

Commit 18cbf4e

Browse files
committed
chore(spec): regenerate the migration registry and the schemaless-node-config reference after the ruling C prose
`gen:migration-registry` concatenates the edited D3 entry into `registry.ts`'s semantic:18 region; `build && gen:docs` re-renders the `mode` describe. `check:generated`: all 15 artifacts up to date on the regenerated tree. Claude-Session: https://claude.ai/code/session_01ARcDurZ5j34RdqsGgc4jgH Co-authored-by: Claude <noreply@anthropic.com>
1 parent 636386b commit 18cbf4e

2 files changed

Lines changed: 18 additions & 11 deletions

File tree

‎content/docs/references/automation/schemaless-node-config.mdx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ const result = DecisionConditionSchema.parse(data);
143143
| Property | Type | Required | Description |
144144
| :--- | :--- | :--- | :--- |
145145
| **conditions** | `{ label: string; expression: string }[]` | optional | Ordered decision branches (first true expression wins; omit to branch purely on edge conditions) |
146-
| **mode** | `Enum<'exclusive' \| 'inclusive'>` | optional | Declares how many out-edges an edge-branched decision takes when more than one out-edge condition holds: 'exclusive' = only the first, in the order the edges are declared (what an omitted mode means; the siblings after it are not evaluated and record a skipped step); 'inclusive' = every one that holds, one after another. When none holds the isDefault edge runs either way. Refused beside a non-empty conditions list, which is first-match on its own: delete mode there, or move the branches onto the out-edges, delete conditions, and keep mode. Flows written while every true branch ran keep that behaviour through the os migrate meta --from 17 conversion, which writes mode: inclusive onto every edge-branched decision with two or more conditioned out-edges. |
146+
| **mode** | `Enum<'exclusive' \| 'inclusive'>` | optional | Declares how many out-edges an edge-branched decision takes when more than one out-edge condition holds: 'exclusive' = only the first, in the order the edges are declared (what an omitted mode means; the siblings after it are not evaluated and record a skipped step); 'inclusive' = every one that holds, one after another. When none holds the isDefault edge runs either way. Refused beside a non-empty conditions list, which is first-match on its own: delete mode there, or move the branches onto the out-edges, delete conditions, and keep mode. Authored sources written while every true branch ran keep that behaviour through the os migrate meta --from 17 conversion, which writes mode: inclusive onto every edge-branched decision with two or more conditioned out-edges; a flow stored in sys_metadata is not rewritten and takes the first-match reading on upgrade (os migrate meta --stored lists those decisions). |
147147

148148
### Nested Shape: `DecisionConfig.conditions[number]`
149149

‎packages/spec/src/migrations/registry.ts‎

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10459,11 +10459,17 @@ const step18: MigrationStep = {
1045910459
+ 'old behaviour was the bug), so the mechanical edit list the chain replay prints is '
1046010460
+ 'where that judgment is made, node by node. And the conversion replays ONLY there: it is a '
1046110461
+ 'default flip, so the authoring funnel never rewrites a source written against the '
10462-
+ 'new contract, the automation engine\'s flow rehydration seam refuses it by id (a '
10463-
+ 'code-shipped flow, a REST body and a Studio save all arrive there undated), and the '
10464-
+ 'stored-row pass (`os migrate meta --stored`) canonicalizes through that same seam — so '
10465-
+ 'a decision saved from the Studio BEFORE this release, with two or more conditioned '
10466-
+ 'out-edges and no `mode`, now runs first-match and is rewritten by nothing.',
10462+
+ 'new contract, and the automation engine\'s flow rehydration seam and the '
10463+
+ 'artifact-ingestion door both refuse it by id (a code-shipped flow, a REST body, a Studio '
10464+
+ 'save and a scaffolded artifact all arrive undated). BREAKING for stored rows, by '
10465+
+ 'maintainer ruling: the promise that a flow keeps its behaviour is kept by authored '
10466+
+ 'sources and built artifacts only. A decision stored in `sys_metadata` '
10467+
+ 'with no `conditions` list, no `mode` and two or more conditioned out-edges takes the new '
10468+
+ 'meaning on upgrade — it evaluates first-match — and nothing rewrites the row: no '
10469+
+ 'stored-row migration, no cutoff, no read-path completion, because nothing about a stored '
10470+
+ 'row says it was saved before the flip. The one-line fix, for a stored node that meant '
10471+
+ 'every branch, is `mode: \'inclusive\'`; `os migrate meta --stored` lists every such node, '
10472+
+ 'report only, so an operator can review the candidates before and after the upgrade.',
1046710473
acceptanceCriteria:
1046810474
'Review every `flow-decision-mode-inclusive-explicit` line the chain replay lists for '
1046910475
+ 'each authored stack: (1) where the two (or more) '
@@ -10475,11 +10481,12 @@ const step18: MigrationStep = {
1047510481
+ 're-run the flow on a record that satisfied both and confirm exactly one successor '
1047610482
+ 'ran — the passed-over branch now leaves a `skipped` step in the run log. `os validate` '
1047710483
+ 'reports `flow-decision-inclusive-overlap` on every decision that keeps the key with '
10478-
+ 'two or more conditioned out-edges, so the review list is the lint output. Then the '
10479-
+ 'half no command reaches: list the `sys_metadata` flow rows of each deployment whose '
10480-
+ 'decision nodes carry two or more conditioned out-edges and no `mode` — the stored '
10481-
+ 'pass reports these rows canonical and rewrites nothing — and declare `mode` on each in '
10482-
+ 'the Studio designer by the same three-way judgment. A decision registering with '
10484+
+ 'two or more conditioned out-edges, so the review list is the lint output. Then each '
10485+
+ 'deployment: `os migrate meta --stored` lists, under `decisionModeReview`, every stored '
10486+
+ 'decision with two or more conditioned out-edges and no `mode` — each one already '
10487+
+ 'evaluates first-match, and the pass writes none of them — so where one of those nodes '
10488+
+ 'meant every branch, declare `mode: \'inclusive\'` on it in the designer; a node '
10489+
+ 'that declares `mode` either way leaves the list. A decision registering with '
1048310490
+ '`mode` beside a non-empty `conditions` list, or with a `mode` outside '
1048410491
+ '`\'exclusive\' | \'inclusive\'`, is refused at registration and by `os validate` with the '
1048510492
+ 'schema\'s own sentence; nothing else about `conditions`-list decisions changes. '

0 commit comments

Comments
 (0)