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
{{ message }}
Repository navigation
Commit 2b3b323
Browse filesBrowse the repository at this point in the historyBrowse files
docs(releases): record the HotCRM 17.4.0 -> 17.5.0 findings on the 17.5.0 notes
- The edge-branched decision flip gets a 17.4.0 -> 17.5.0 table and a
standing warning that flows stored in sys_metadata take the new meaning
unrewritten; its checklist line says to review each offered
mode: 'inclusive' (deleting it where the conditions partition, or
flow-decision-inclusive-overlap follows) and then the --stored list.
- The protocol declarations: 17.5.0 still implements protocol 17 and the
handshake compares only the major, so engines.protocol stays '^17' and a
^17.0.0 specVersion admits 17.5.0; "protocol 18" names the migration
registry's next major, whose shapes the 17.5.0 schemas already refuse.
- Seven checklist lines carry what an upgrade of HotCRM (a 17.4.0 app with
a 17.4.0-created SQLite DB) observed on 2026-09-29; every other line stays
not exercised, and the v17 index callout says the hop was exercised only
in part.
Claude-Session: https://claude.ai/code/session_014VGCS11YUtYAiinRcdqQwL
Co-authored-by: Claude <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: content/docs/releases/v17/17-5.mdx
+87-43Lines changed: 87 additions & 43 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -151,6 +151,11 @@ Most retirements in this release are registered as ADR-0087 conversions under
151
151
conversion exists — since this release `--to` defaults to the highest major the
152
152
installed `@objectstack/spec` has a step for, so the command the refusals
153
153
prescribe no longer answers `✓ Nothing to migrate` (`fb39b38`, #17462).
154
+
"Protocol 18" is the migration registry's next major, not the runtime's:
155
+
17.5.0 still implements protocol 17 (`os migrate meta` prints "this runtime
156
+
implements protocol 17"), and its schemas already refuse every shape those
157
+
steps convert. An app therefore keeps `engines.protocol: '^17'` — see the
158
+
[upgrade checklist](#upgrade-checklist).
154
159
155
160
#### Scheduled work is off until a deployment turns it on (#18198, #17334, #18420)
156
161
@@ -688,23 +693,28 @@ rules. Each refusal is `INVALID_FILTER` / `400` at run time and
688
693
A `decision` node that declares no `config.conditions` and branches on its
689
694
out-edges used to take **every** out-edge whose condition held, one after
690
695
another, while its schema and docs called it an exclusive gateway
691
-
(`0283cb9`, #20344). It is now exclusive: the first out-edge whose condition
692
-
holds, in declaration order, runs, and the next records a `skipped` step.
693
-
`mode: 'inclusive'`, accepted and never read before, now takes every true
694
-
branch. When none holds, the `isDefault` edge runs as before. A `mode` beside a
695
-
non-empty `conditions` list, or outside `'exclusive'` / `'inclusive'`, is
696
-
refused at `registerFlow` and by `os validate`.
696
+
(`0283cb9`, #20344). It is now exclusive, and `mode: 'inclusive'` is how a
697
+
decision asks for every true branch:
698
+
699
+
| an edge-branched `decision` with no `conditions`| 17.4.0 | 17.5.0 |
700
+
|:--|:--|:--|
701
+
| no `mode`, two conditioned out-edges both hold | both successors run, sequentially | the first declared one runs; the second records a `skipped` step |
702
+
|`config: { mode: 'inclusive' }`| accepted, never read | every out-edge whose condition holds runs, sequentially |
703
+
| no condition holds | the `isDefault` edge runs | unchanged |
704
+
|`mode` beside a non-empty `conditions` list, or not `exclusive` / `inclusive`| refused by a direct parse only | refused at `registerFlow` and by `os validate`|
705
+
706
+
⚠️ **A flow stored in `sys_metadata` is not rewritten and silently takes the
707
+
new meaning**: nothing about a stored row says it was saved before the flip,
708
+
so a decision the Studio designer saved runs first-match from the upgrade on.
697
709
698
710
**Migration.**`os migrate meta --from 17` writes `mode: 'inclusive'` onto
699
711
every authored decision with no `conditions` and two or more conditioned
700
712
out-edges, so a migrated flow runs as it did. Then review each written key:
701
713
delete it where the conditions partition (`== 'a'` beside `!= 'a'`, a guard
702
714
beside `isDefault: true`), and keep it where the flow relies on more than one
703
715
branch running. `os validate` reports `flow-decision-inclusive-overlap` on
704
-
every decision that keeps it, so the review list is the lint output. ⚠️ **A
705
-
decision stored in `sys_metadata` is not rewritten** — nothing about a stored
706
-
row says it was saved before the flip — so it runs first-match from the
707
-
upgrade on. `os migrate meta --stored` lists every such node under
716
+
every decision that keeps it, so the review list is the lint output. For the
717
+
stored rows, `os migrate meta --stored` lists every such node under
708
718
`decisionModeReview` and writes nothing for it; add
709
719
`config: { mode: 'inclusive' }` to each one that meant every branch.
0 commit comments