@@ -17,9 +17,10 @@ description: "Release notes and upgrade checklist for 17.5.0 of the v17 line."
1717- ** An edge-branched ` decision ` takes only its first matching branch**
1818 (` 0283cb9 ` , #20344 ). A decision with no ` config.conditions ` used to run every
1919 out-edge whose condition held; it now runs the first one in declaration
20- order, and ` mode: 'inclusive' ` keeps every true branch. ` os migrate meta --from 17 `
21- writes ` mode: 'inclusive' ` into authored sources, but ⚠️ ** a flow stored in
22- ` sys_metadata ` is not rewritten** and switches to first-match on upgrade.
20+ order, and ` mode: 'inclusive' ` keeps every true branch.
21+ ` os migrate meta --from 17 ` writes ` mode: 'inclusive' ` into authored sources,
22+ but ⚠️ ** a flow stored in ` sys_metadata ` is not rewritten** and switches to
23+ first-match on upgrade.
2324- ** Row-level security stops admitting what it cannot enforce.** A policy with
2425 no ` check ` now holds inserts and updates to its ` using ` (` b7c792b ` , #19952 ) —
2526 the documented default that the write gate never applied. Predicates that
@@ -103,8 +104,7 @@ description: "Release notes and upgrade checklist for 17.5.0 of the v17 line."
103104The 69 package ` CHANGELOG.md ` files that carry a 17.5.0 section list them as
1041051,372 per-package entries (703 minor, 669 patch) in 56 of those files, because
105106a changeset that bumps several packages is listed in each; the entries
106- de-duplicate to the same 958. The bundled Console
107- advances four pins,
107+ de-duplicate to the same 958. The bundled Console advances four pins,
108108` 53ded82bf7a4 → 87af769e9a3e → 62597c588072 → f8a9d0fb0596 → dd3f7e1be356 ` .
109109The npm packages also carry eight commits that landed after the version
110110commit and are in no 17.5.0 ` CHANGELOG.md ` entry — see [ Also shipped in
@@ -261,8 +261,8 @@ hook. Compare a field only with a field of the same class — a number with a
261261number, text with text, a date with a date — or with a literal or a
262262` current_user ` value; test a file field with ` != null ` ; and where the two
263263columns really hold comparable values, correct the declaration of the one
264- declared with the wrong type. A ` using ` -only policy that relied on writes landing outside its scope
265- declares a ` check ` that admits them. Remove ` check ` from every ` select ` /
264+ declared with the wrong type. A ` using ` -only policy that relied on writes
265+ landing outside its scope declares a ` check ` that admits them. Remove ` check ` from every ` select ` /
266266` delete ` policy — AND it into ` using ` , or move it to an ` insert ` / ` update ` /
267267` all ` policy. A hook that deliberately writes outside the caller's policy does
268268that write separately under a system context.
@@ -320,11 +320,12 @@ into a logged warning for a migration window.
320320
321321#### Written values are held to the field's declared type
322322
323- Each entry below narrows what a record write accepts. The record validator
324- judges it on insert, update, a multi-row update and ` engine.validate ` (the dry
325- run), before any driver write, and answers ` 400 VALIDATION_FAILED ` with a field
326- code; nothing is stored. Only new writes are judged — a stored value is never
327- re-read — but an update that sends an old value back is refused.
323+ Each entry below narrows what a record write accepts. All but the last are
324+ judged by the record validator on insert, update, a multi-row update and
325+ ` engine.validate ` (the dry run), before any driver write, and answered
326+ ` 400 VALIDATION_FAILED ` with a field code; nothing is stored. Only new writes
327+ are judged — a stored value is never re-read — but an update that sends an old
328+ value back is refused. The last is the ` /import ` door's own cell reader.
328329
329330- ** A ` date ` string must lead with a real ` YYYY-MM-DD ` day** (` b2b6a06 ` ,
330331 #20524 ; ` 92ea760 ` , #20547 ). ` "2026/07/15" ` , ` "07/15/2026" ` or
@@ -617,9 +618,9 @@ rules. Each refusal is `INVALID_FILTER` / `400` at run time and
617618 strings treats them as numbers. ` sum ` over a fractional column and every
618619 ` avg ` now also accumulate in double there, as on SQLite, and the engine's
619620 in-memory rows path adds with SQLite's compensated summation (` fc0db22 ` ,
620- #20486 ; ` 8538edf ` , #20543 ): ` 0.1 + 0.2 ` is ` 0.30000000000000004 ` on every
621- face, so compare a fractional sum with a range, not ` $eq ` . On MySQL this
622- needs 8.0.17 or later.
621+ #20486 ; ` 8538edf ` , #20543 ): ` 0.1 + 0.2 ` is ` 0.30000000000000004 ` on SQLite,
622+ PostgreSQL, MySQL and the rows path alike, so compare a fractional sum with a
623+ range, not ` $eq ` . On MySQL this needs 8.0.17 or later.
623624
624625** Migration.**
625626
@@ -1056,8 +1057,9 @@ Sibling flows still register. Check boot logs after upgrading.
10561057 ` url: 'file:./data/replica.db' ` with the remote in ` syncUrl ` and no ` mode ` .
10571058- ** Remote-mode Turso refuses a missing table or column as local mode does**
10581059 (` 3e8b492 ` , #20461 ): ` DATABASE_ERROR ` / ` 500 ` for an absent table, and
1059- ` INVALID_FIELD ` or ` INVALID_FILTER ` / ` 400 ` for an absent column, where it
1060- answered ` [] ` or ` null ` and schema drift read as "no data". Run schema sync,
1060+ ` INVALID_FIELD ` or ` INVALID_FILTER ` / ` 400 ` for an absent column, where most
1061+ of those reads answered ` [] ` or ` null ` and schema drift read as "no data".
1062+ Run schema sync,
10611063 or name a column the table has. Remote mode now also reads a federated
10621064 object's ` external.remoteName ` table, which it ignored, and refuses an
10631065 ` external.columnMap ` that renames a column with ` NOT_IMPLEMENTED ` / ` 501 `
@@ -1160,7 +1162,8 @@ on metadata that ran — often wrongly — on 17.4.0:
11601162 ` indexes[].fields ` (` 4b2d904 ` , #20479 ): ` error ` in ` os validate ` ,
11611163 ` os build ` and ` os lint ` , and ` 422 ` at the runtime publish door on an object
11621164 write. A misspelt name used to surface only when a user opened the view or
1163- picker, and a misspelt index column skipped a ` unique ` index without a word.
1165+ picker, and a misspelt index column made the SQL driver skip the whole
1166+ index, a ` unique ` one included, with only a warning.
11641167- ` os validate ` and ` os build ` refuse a ` views: ` container whose own ` name `
11651168 disagrees with the object it binds to (` c5d6b2b ` , #20391 ; ` acd0095 ` ,
11661169 #20459 ) — a stack the server already refused at boot, and which ` os build `
@@ -1493,8 +1496,8 @@ on the Invite user dialog among them (`9bf5e67`, #20490; `6427e2c`, #20530).
14931496(` ca31ff6 ` ), and ` nodemailer ` a major, to ` ^10.0.2 ` (` f572a7e ` , #20564 ), for
14941497GHSA-6vj9 -mwq6-2f5v — nodemailer's process-global DNS cache could give a
14951498second SMTPS transport to the same host the first one's SNI and certificate
1496- identity, sending its credentials to the wrong TLS virtual host. Every release from
1497- 5.0.0 through 10.0.1 is affected, so the 9.x line has no fix. ⚠️ From
1499+ identity, sending its credentials to the wrong TLS virtual host. Every release
1500+ from 5.0.0 through 10.0.1 is affected, so the 9.x line has no fix. ⚠️ From
14981501nodemailer 10.0.12, the version a fresh install resolves, ` requireTLS ` wins
14991502over ` ignoreTLS ` / ` opportunisticTLS ` , and ` SmtpTransport ` sets ` requireTLS `
15001503whenever TLS is on and the port is not 465. A
@@ -1650,8 +1653,10 @@ walked](/docs/releases/v17#upgrade-checklists).
16501653
16511654⛔ ** Nobody has walked 17.4.0 → 17.5.0.** Every line below is derived from a
16521655change's own ** Migration** note in [ Breaking changes & migration in
1653- 17.5.0] ( #breaking-changes--migration-in-1750 ) and is marked ** not exercised** :
1654- accurate about what changed, unproven about what it costs to cross. A step
1656+ 17.5.0] ( #breaking-changes--migration-in-1750 ) — or, for the cube member
1657+ ` name ` , in [ Also shipped in 17.5.0] ( #also-shipped-in-1750--not-in-its-changelog )
1658+ — and is marked ** not exercised** : accurate about what changed, unproven about
1659+ what it costs to cross. A step
16551660nobody has run, presented beside steps that were, is how a reader finishes a
16561661checklist and believes they are done — so this list claims nothing it has not
16571662been given.
0 commit comments