@@ -1201,8 +1201,7 @@ inline rows (`c4c68ca`, #20660).
12011201
12021202### Notable fixes in 17.6.0
12031203
1204- These are the patch-level entries an upgrading deployment is most likely to
1205- notice. Everything else is in the per-package ` CHANGELOG.md ` files, which is
1204+ These are the fixes an upgrading deployment is most likely to notice. Everything else is in the per-package ` CHANGELOG.md ` files, which is
12061205what they are for.
12071206
12081207** Security.**
@@ -1242,10 +1241,10 @@ what they are for.
12421241 restart, and re-enabling the ledger bit of a flow whose ` status ` is still
12431242 ` obsolete ` / ` invalid ` no longer arms it (` defc7f7 ` , #20702 ). A trigger-fired
12441243 run refused because its flow is disabled logs at ` info ` , not ` ERROR ` .
1245- - For a flow name a managed package ships, ` GET /api/v1/meta/ flow/: name` , its
1246- ` /layers ` and ` /published ` reads and startup hydration all serve the
1247- package's flow (` 25f2e64 ` , #20994 ; ` 94990a2 ` , #21043 ; ` 514001a ` , # 21116 ;
1248- ` 75519e1 ` , #20942 ).
1244+ - For a flow name a managed package ships, the flow list and the by- name,
1245+ ` /layers ` and ` /published ` reads all serve the package's flow, and every
1246+ startup step arms it (` 25f2e64 ` , #20994 ; ` 94990a2 ` , #21043 ; ` 514001a ` ,
1247+ # 21116 ; ` 75519e1 ` , #20942 ).
12491248
12501249** Drivers and databases.**
12511250
@@ -1268,8 +1267,9 @@ what they are for.
12681267 (` f8178ff ` , #20984 ), and ` sum ` / ` avg ` use compensated summation
12691268 (` b785c3b ` , #20739 ).
12701269- ** Dates before year 100** are read as written, not as 1900–1999, wherever the
1271- platform builds a UTC instant from parts (` a6866da ` , #20746 ), and exports
1272- write four-digit years so such rows re-import (` 67c1b11 ` , #20688 ).
1270+ platform builds a UTC instant from parts (` a6866da ` , #20746 ). Exports write
1271+ four-digit years, so a ` date ` in 0001–0999 re-imports; a ` datetime ` before
1272+ 1000 is still refused (` 67c1b11 ` , #20688 ).
12731273- The first boot of a new SQL database, and ` os migrate plan ` on a database
12741274 that does not exist yet, no longer print spurious ` DATABASE_ERROR ` lines
12751275 (` 810d42b ` , #20818 ; ` cf0346e ` , #21093 ).
@@ -1278,8 +1278,8 @@ what they are for.
12781278whenever the statement joins a related object, fixing ambiguous-column ` 500 ` s
12791279on cubes that declare no join (` 2791138 ` , #21266 ). On PostgreSQL, measures come
12801280back as JSON numbers, not strings (` d1633f3 ` , #21040 ), ` sum ` / ` avg ` accumulate
1281- in double, a boolean aggregand no longer answers ` 500 ` , and an all-NULL ` sum `
1282- answers ` 0 ` (` 097ef80 ` , #21209 ). ` $not ` , ` $notContains ` and null tests over a
1281+ in double, and a boolean aggregand no longer answers ` 500 ` ; on every dialect an
1282+ all-NULL ` sum ` answers ` 0 ` (` 097ef80 ` , #21209 ). ` $not ` , ` $notContains ` and null tests over a
12831283multi-valued lookup return rows on the engine-aggregate path instead of ` 400 `
12841284(` 5dbeb7d ` , #21036 ). Date-bucket keys spell four-digit years at every
12851285granularity (` 856321f ` , #20865 ; ` 525b813 ` , #20971 ).
@@ -1313,8 +1313,8 @@ converts objects built with `ObjectSchema.create(…)` instead of stopping at lo
13131313 platform labels that contradicted their English source are re-translated
13141314 (` f4ce10c ` , #20652 ; ` 5757463 ` , #20707 ; ` 7184436 ` , #20684 ).
13151315- ` security/explain ` resolves the explained user in the organization
1316- enforcement resolves them in, refuses a cross-class field-to-field policy as
1317- enforcement does, and answers a classified refusal with its own 4xx instead of
1316+ enforcement resolves them in, refuses a cross-class field-to-field policy at
1317+ the object level too, as enforcement does, and answers a classified refusal with its own 4xx instead of
13181318 ` 500 EXPLAIN_FAILED ` (` 889139c ` , #20614 ; ` cd901d7 ` , #20629 ; ` 72f8c38 ` ,
13191319 #20858 ).
13201320- Setup and Studio carry navigation entries for the Audit Log Browser and
@@ -1337,12 +1337,13 @@ per-commit lists are in `packages/console/CHANGELOG.md` under `## 17.6.0`.
13371337⚠️ ** Console hosts and authors:** 23 of those entries are declared breaking
13381338upstream (6, 5 and 12). They are objectui's own surfaces — they matter to a host
13391339that builds on ` @object-ui/* ` packages or authors objectui page JSON directly.
1340- Three of them mirror ObjectStack keys already retired in 17.5.0
1341- (` assignedProfiles ` on a page, ` chartConfig.aria ` , ` aria ` on an action), and
1342- none registers a new ADR-0087 migration.
1340+ Four of them mirror ObjectStack keys already retired in 17.5.0
1341+ (` assignedProfiles ` on a page, ` chartConfig.aria ` , ` aria ` on an action,
1342+ ` quickAdd ` on ` object-kanban ` ), and none registers a new ADR-0087 migration.
13431343
1344- - ** Studio works again with the 17.6.0 spec.** The previous pin bundled
1345- objectui's zod 4.4.3 beside the injected spec's 4.6.1, which broke Studio's
1344+ - ** Studio works again with the 17.6.0 spec.** The previous pin bundled a
1345+ second zod instance (objectui's 4.6.5) beside the injected spec's 4.6.1,
1346+ which broke Studio's
13461347 spec-derived forms: the New Package dialog could not create a package and the
13471348 dashboard and report inspectors showed no schema. The console now bundles one
13481349 zod instance (objectui #11353 , in ` 0d42104 ` ).
@@ -1417,19 +1418,20 @@ on 17.5.0 already runs them, and nothing here changes when it moves to 17.6.0.
14171418They are listed again because the 17.5.0 version commit ` 8c87d26a ` did not
14181419consume their changesets:
14191420
1420- - ** Eight commits landed after the version commit** and before the publish ran
1421- from ` 0f6dcac5 ` : ` 6e3aa75 ` (#20584 ), ` a093ce3 ` (#20582 ), ` 92fe081 ` (#20458 ),
1421+ - ** Eight commits follow the version commit** in first-parent order, before
1422+ the publish ran from ` 0f6dcac5 ` : ` 6e3aa75 ` (#20584 ), ` a093ce3 ` (#20582 ), ` 92fe081 ` (#20458 ),
14221423 ` 3a89d45 ` (#20591 ), ` 7001918 ` (#20598 ), ` c96beb2 ` (#20585 ), ` ba4648d `
14231424 (#20605 ) and ` 0f6dcac ` (#20606 ). The 17.5.0 notes already describe them under
14241425 [ Also shipped in
14251426 17.5.0] ( /docs/releases/v17/17-5#also-shipped-in-1750--not-in-its-changelog ) ,
14261427 including the migration for the retired cube member ` name ` . The pipeline
14271428 defect that let a publish run past its version commit is fixed in this
14281429 release (#20625 , #20613 ).
1429- - ** Seven commits landed on ` main ` between 04:09 and 05:37 UTC on 2026-09-29,
1430- before the version commit at 06:17** , but were not yet in the version PR when
1431- it merged, so their changesets stayed unconsumed. The 17.5.0 notes do not mention them.
1432- Three are breaking:
1430+ - ** Seven commits are ancestors of the version commit** — they landed on
1431+ ` main ` between 04:09 and 05:36 UTC on 2026-09-29 — but were not yet in the
1432+ version PR when it merged, so their changesets stayed unconsumed. The 17.5.0
1433+ notes do not mention them. Two are breaking, and one makes `os validate
1434+ --strict` fail:
14331435 - ** ` RealtimeEventType ` lists only the events the engine publishes**
14341436 (` e73ee2d ` , #20567 ): ` data.record.created ` , ` data.record.updated ` ,
14351437 ` data.record.deleted ` , ` data.records.updated ` and ` data.records.deleted ` .
@@ -1467,8 +1469,9 @@ walked](/docs/releases/v17#upgrade-checklists).
14671469### 17.6.0
14681470
14691471⛔ ** Nobody has walked 17.5.0 → 17.6.0.** Every line below is derived from a
1470- change's own ** Migration** note in [ Breaking changes & migration in
1471- 17.6.0] ( #breaking-changes--migration-in-1760 ) and is marked ** not exercised** :
1472+ ** Migration** note in [ Breaking changes & migration in
1473+ 17.6.0] ( #breaking-changes--migration-in-1760 ) or from a changeset of this
1474+ release, and is marked ** not exercised** :
14721475accurate about what changed, unproven about what it costs to cross. A step
14731476nobody has run, presented beside steps that were, is how a reader finishes a
14741477checklist and believes they are done — so this list claims nothing it has not
@@ -1534,8 +1537,9 @@ been given.
15341537- ** Fix the new author-time refusals:** a ` picklist ` or ` picklistExtensions `
15351538 entry naming no declared list, an ` api ` flow with no ` config.secret ` , action
15361539 translation keys for undeclared outcomes or result fields, dimensions over
1537- JSON-stored or multi-value fields, and multi-measure ` pie ` / ` donut ` /
1538- ` funnel ` / ` scatter ` / ` radar ` / ` treemap ` / ` sankey ` widgets. * Not
1540+ JSON-stored or multi-value fields, and dimensionless ` pie ` / ` donut ` /
1541+ ` funnel ` / ` scatter ` / ` radar ` / ` treemap ` / ` sankey ` widgets with two or
1542+ more ` values ` . * Not
15391543 exercised.*
15401544- ** Write ` time ` defaults and values as a bare wall clock** (` "10:00" ` ); rewrite
15411545 by hand the stored ` time ` defaults with a non-zero offset that
@@ -1567,8 +1571,8 @@ been given.
15671571 an html page that gained a plugin component are refused from Studio; use the
15681572 metadata API or source for them. * Not exercised.*
15691573- ** If you override ` validation.field.invalid_date ` or ` invalid_datetime ` ,**
1570- also define ` invalid_date_range ` / ` invalid_datetime_range ` . * Not
1571- exercised.*
1574+ also define ` invalid_date_range ` / ` invalid_datetime_range ` ( ` f6ccca4 ` ,
1575+ # 20952 ). * Not exercised.*
15721576
15731577** Application code, hooks and flows**
15741578
@@ -1578,15 +1582,17 @@ been given.
15781582 with ` _ ` . * Not exercised.*
15791583- ** Make sure every ` http ` node's ` signingSecret ` renders to a value** , or
15801584 write ` signingSecret: '' ` to send unsigned on purpose. * Not exercised.*
1581- - ** Stop sending ` formula ` values** , read a submitted formula value from
1585+ - ** Stop sending ` formula ` values when you pass ` strictReadonlyWrites ` **
1586+ (otherwise they are stripped), read a submitted formula value from
15821587 ` ctx.submitted ` , and handle ` reason: 'computed' ` in ` DroppedFieldsEvent `
15831588 branches. * Not exercised.*
15841589- ** Import the migration-chain names from ` @objectstack/spec/migrations ` ** ;
15851590 remove ` --clone-from ` and ` clone_from_environment_id ` ; use `os dev
15861591 --no-watch` ; test ` nextUtcCalendarDay` answers with ` isUnboundedAbove`. * Not
15871592 exercised.*
15881593- ** Custom hosts and drivers:** pass ` getReadableFields ` , ` getQueryableFields `
1589- and ` hasObjectMiddleware ` to a hand-built ` AnalyticsService ` ; implement
1594+ and (with ` executeRawSql ` ) ` hasObjectMiddleware ` to a hand-built
1595+ ` AnalyticsService ` ; implement
15901596 ` findOne ` on stand-ins for ` MigrationFlagEngine ` / ` SeedTenancyLedger ` ; lower
15911597 filters with ` lowerFilterCondition ` before a direct driver call; answer
15921598 ` false ` and the deny filter from an ` ISecurityService ` for a caller with no
0 commit comments