@@ -2046,16 +2046,24 @@ rc.1, and administrators should know what changed:
20462046 the generated upgrade guide and the `spec_changes` MCP tool actually
20472047 report the 16 → 17 chain (they still said 16.0.0).
20482048
2049- ### New in Console — bundled objectui advanced `4a4829d0ef39 → f995a452d2ca `
2049+ ### New in Console — bundled objectui advanced `4a4829d0ef39 → 7d9734d5e321 `
20502050
20512051143 objectui commits across five pin moves, released as **objectui 17.1.0**.
20522052(The pin changesets enumerate 79 of them; one range under-enumerated its own
20532053window and is recorded by `console-bebaebd39ace-backfill` — the fixes it
20542054covers are folded into the list below rather than left to the changelog.)
2055- Two later pin moves carried the bundle on to `f995a452d2ca` — 129 further
2056- commits, enumerated in `console-f5bc4c78be76` and `console-f995a452d2ca`. The
2057- two author-facing breaking migrations in that range are documented under
2058- *Breaking changes & migration* above.
2055+
2056+ **How the Console pin is recorded on this page.** `scripts/bump-objectui.sh`
2057+ advances `.objectui-sha` whenever the bundled Console moves, and every move
2058+ writes a `.changeset/console-<sha >.md` that enumerates its own range. Each
2059+ move is reported under the *Landed since* window that shipped it — never
2060+ folded into an earlier window's range — so the chain reads end to end:
2061+ `4a4829d0ef39 → 7d9734d5e321` here (released as `rc.1`), `→ f5bc4c78be76`
2062+ under *rc.1* (`rc.2`), `→ f995a452d2ca` under *rc.2* (`rc.4`),
2063+ `→ 7dfbeb704e1e` under *rc.4* (`rc.5`), and `→ 0cf8f0f70d10` under *rc.5*,
2064+ which is still open. The two author-facing breaking migrations the bundle
2065+ carries (objectui#3233, objectui#3172) arrived with `f995a452d2ca` and are
2066+ documented under *Breaking changes & migration* above.
20592067
20602068- **The lockstep half of ADR-0110 — release-critical.** The rc.0 pin predates
20612069 the client fix, so the Console it built still posted `action.target` to
@@ -2140,13 +2148,16 @@ two author-facing breaking migrations in that range are documented under
21402148## Landed since 17.0.0-rc.1
21412149
21422150These changes are on `main` after the `rc.1` cut and **roll into 17.0.0-rc.2**.
2143- At the time of writing the window has left 209 changesets pending — 46
2151+ At the time of writing the window had left 209 changesets pending — 46
21442152`major`-class, 74 `minor`, 55 `patch`, and 34 that release nothing (CI, tooling
2145- and docs). The Console pin was `785b8a5d432c` when this window was written and
2146- has since advanced to `f995a452d2ca` in two moves; that delta is carried by the
2147- range on *New in Console* above and enumerated in the two pin changesets. Its
2148- two author-facing breaking migrations are documented with the other breaking
2149- changes above.
2153+ and docs); the cut itself released **166 changesets — 45 `major`-class, 69
2154+ `minor`, 52 `patch`**, counted across the `17.0.0-rc.2` sections of the package
2155+ changelogs. The Console pin stood at `7d9734d5e321` when the window opened and
2156+ advanced twice inside it — to `785b8a5d432c`, already the value when the
2157+ paragraphs below were written, and then to `f5bc4c78be76`. The two moves are
2158+ enumerated in `console-785b8a5d432c` and `console-f5bc4c78be76`; neither
2159+ carries an author-facing breaking migration, and the two that exist arrive in
2160+ the next window.
21502161
21512162Two campaigns dominate the window, and both are *finishing* rather than
21522163starting: the #4535 dual-source convergence and #4001's close of the authorable
@@ -2612,6 +2623,192 @@ it compared a declaration to an implementation (#4472).
26122623- **A `RETURNING` write persists on `driver-sqlite-wasm` (#4518)**, unblocking
26132624 cold-boot e2e.
26142625
2626+ ## Landed since 17.0.0-rc.2
2627+
2628+ These changes are on `main` after the `rc.2` cut and **roll into 17.0.0-rc.4**.
2629+ Counted across the `17.0.0-rc.4` sections of the package changelogs, the cut
2630+ released **360 changesets — 44 `major`-class, 94 `minor`, 222 `patch`**, which
2631+ makes it the largest of the train's RC cuts (`rc.0` released 258, `rc.1` 262,
2632+ `rc.2` 166, `rc.5` 10).
2633+
2634+ **Why there is no `rc.3` window section.** `17.0.0-rc.3` was tagged for every
2635+ package on 2026-08-03 by a `chore: version packages (rc)` run, but the round
2636+ consumed exactly one changeset — `BulkActionParamSchema`'s `options[]` entry
2637+ gaining passthrough (#4001) — and left every other package with nothing but an
2638+ *Updated dependencies* bump. Those `## 17.0.0-rc.3` changelog sections no
2639+ longer survive on `main`, and the Console pin did not move in that round. So
2640+ this one window section spans the `rc.2` cut through the `rc.4` cut rather than
2641+ splitting at a tag that records nothing.
2642+
2643+ As in the windows above, landings that belong to a section higher up the page
2644+ are documented **there** rather than repeated here.
2645+
2646+ - **Declarative `apis:` goes from silent no-op to live, in two steps.** The
2647+ surface was zero-execution end to end and said nothing about it: metadata
2648+ loading accepted `apis:` and `GET /api/v1/meta/api` returned every endpoint
2649+ with every key intact, while no route was ever mounted — so a declared path
2650+ died at Hono's `notFound` rather than at the dispatcher. It first learned to
2651+ **refuse loudly**, retiring the `ApiRegistry` family (#4936, #4939); the
2652+ blanket refusal then narrowed to per-endpoint publish gates and declared
2653+ endpoints **went live** (#5111, #5040 E7).
2654+ - **#4001 closes the authorable surface, batches 9–20.** Unknown keys are now
2655+ rejected on the flow-node config contracts (batch 9), `control-flow` and
2656+ `state-machine` (batch 10), nine automation shapes (batch 11), the ETL
2657+ authoring contracts (batch 12), the responsive/SDUI styling shapes (batch
2658+ 13), action-param options, public sharing, report sorting, the dataset
2659+ semantic layer and dashboard widgets (batch 14), all 14 `ui/theme` sites and
2660+ 5 of 7 `ui/chart` sites (batch 15), and `AriaProps` (batch 16). View
2661+ sub-blocks (batch 18) and object inner blocks (batch 20) stop dropping
2662+ unknown keys instead of reporting them. `ui/component.zod.ts`'s 29 sites were
2663+ judged **no gate** and deliberately left open (batch 17) — a recorded
2664+ verdict, not an omission. `ViewItemSchema` splits into an authoring schema
2665+ and a wire variant.
2666+ - **ADR-0049 enforce-or-remove reaches its widest sweep.** Retired in this
2667+ window: the dashboard widget action trio plus `aria`, and the build gate that
2668+ enforced a button nobody renders (#5010); `indexes[].type` and
2669+ `indexes[].partial`, two authorable index keys no driver ever read (#5248,
2670+ #4943); `connector.rateLimitConfig` and the whole outbound rate-limit shape,
2671+ whose engine never existed (#4911); `dashboard.widgets[].responsive` (#4876);
2672+ `HookContext.session`'s deprecated position key, declared and read by two
2673+ dead branches but never produced (#5050); `HttpServerConfigSchema` (#4938);
2674+ `NotificationActionSchema` and `EmbedConfigSchema` (#5015); nine theme token
2675+ groups emitted and read by nobody (#5021); the five `ui/` interaction config
2676+ modules (#4988); `IStorageService.list(prefix)` (#5540); the field-mapping
2677+ `transform` key and `FieldMappingTransform` (#5552); and the exported
2678+ `HttpServer` delegating wrapper.
2679+ - **The caller's positions converge on one spelling.** Action-body
2680+ `ctx.session` starts emitting the canonical `positions` alongside the
2681+ deprecated predecessor key it replaces (#5613); that predecessor is then
2682+ removed outright, leaving `ctx.user.positions` as the only spelling on
2683+ action bodies and AI route handlers (#6011).
2684+ - **A misconfigured provider fails the boot instead of degrading silently.**
2685+ `OS_EMAIL_PROVIDER=resend/postmark` without an API key no longer becomes the
2686+ log transport (#5132), and a misspelled `OS_SMS_PROVIDER` no longer does
2687+ either (#5713).
2688+ - **Wire shapes stop having two answers.** `GET /meta/:type/:name` answers
2689+ exactly one body shape; a sort node spelling its direction `direction` is a
2690+ 400 rather than a silently reversed page (#4721); `DeleteDataResult` declares
2691+ the schema it names — `success`, not `deleted` (#5638); and
2692+ `@objectstack/spec/openapi.json` stops describing routes it does not own,
2693+ shrinking to the contract half it does (#5744, #5588).
2694+ - **The driver contract stops writing the object name twice.** `IDataDriver`'s
2695+ query parameter becomes `DriverQuery` (#5181) — the first step of the
2696+ narrowing that finishes in the open window below.
2697+ - **Tenancy and durability corrections.** `organization/create` is judged
2698+ against the **effective** tenancy posture, so a deployment with no
2699+ organization wall can no longer create organizations (#5261);
2700+ `HierarchyScopeContext.organizationId` becomes the authoritative tenancy
2701+ field and is required (#5858); and a `sys_file` / `sys_upload_session` write
2702+ that never landed stops reporting success (#5216).
2703+ - **Two dialect convergences.** The retry policy's last two spellings meet
2704+ (#4964 `flow.errorHandling`, #4962), and `dashboard.widgets[].compareTo`
2705+ converges on the analytics executor's contract (#5011).
2706+
2707+ ### New in Console — bundled objectui advanced `f5bc4c78be76 → f995a452d2ca`
2708+
2709+ One pin move, released as **@objectstack/console 17.0.0-rc.4**: 98 non-merge
2710+ objectui commits, of which 64 of 65 changesets release; the enumeration is
2711+ `console-f995a452d2ca`. This is the move that carries the bundle's two
2712+ author-facing breaking migrations — **field widgets receive their metadata on
2713+ one key, `field`** (objectui#3233) and **flow node geometry is the spec's
2714+ `FlowNode.position`** (objectui#3172) — both documented under *Breaking changes
2715+ & migration* above.
2716+
2717+ ## Landed since 17.0.0-rc.4
2718+
2719+ These changes are on `main` after the `rc.4` cut and **roll into 17.0.0-rc.5**.
2720+ A short window: **10 changesets — 2 `major`-class, 4 `minor`, 4 `patch`**,
2721+ counted across the `17.0.0-rc.5` sections of the package changelogs. Nine are
2722+ listed below; the tenth is the Console pin move.
2723+
2724+ - **`system-data` no longer grants CSV import by default** (#4671).
2725+ `managedBy: 'system-data'` narrows from `create/import/edit/delete/exportCsv`
2726+ to the same set with `import: false`, leaving `platform` as the only bucket
2727+ that grants `import` by default. Eight in-repo objects lose the import
2728+ wizard, three of them the RBAC join tables that decide who can do what.
2729+ Restore any one of them with `userActions: { import : true } ` on the object —
2730+ only that verb, the rest still follow the bucket default. The authorization
2731+ boundary is unchanged: `import` is an affordance that decides whether a UI
2732+ entry renders, and every imported row still passes `DelegatedAdminGate`, RLS
2733+ and permission-set adjudication. What changes is leverage — one bad CSV is a
2734+ bulk grant. Recorded as the #4671 addendum to ADR-0103.
2735+ - **`subscribeMetadata`'s `type` narrows to `MetadataEventSubject`** (#4627) —
2736+ subscribing to an event the contract can never deliver is now a compile
2737+ error.
2738+ - **`engine.transaction` tightens, batch 1** (#5696) — `opts.require` is
2739+ fail-closed, and the handle carries an `owned` signal.
2740+ - **Transaction handles stop leaking across datasources** (#5351, #5696) — a
2741+ business write refuses loudly, and the system ledger moves out of the
2742+ transaction so it lands on its own.
2743+ - **A connector action can declare what it did upstream** (#4395), which is
2744+ what makes `connector_action` countable.
2745+ - **`XParsed` naming reaches every schema that has a parsed state** (ADR-0122,
2746+ #5551).
2747+ - **`os migrate summary-nulls`** (#6063) backfills roll-up count and sum
2748+ columns left `NULL` by pre-seed inserts.
2749+ - **`runAs: 'system'` `create_record` stamps all three ADR-0118 columns**
2750+ (#5494) — organization, owner and creator are non-`NULL`.
2751+ - **The strictness ledger gains a ninth verdict, `covered`** (#5249) — an
2752+ honest cell for a shape fragment with no gate and no parse whose every
2753+ consumer already guards.
2754+
2755+ ### New in Console — bundled objectui advanced `f995a452d2ca → 7dfbeb704e1e`
2756+
2757+ One pin move, released as **@objectstack/console 17.0.0-rc.5**: 28 non-merge
2758+ objectui commits, 9 of 9 changesets releasing, all `patch`; the enumeration is
2759+ `console-7dfbeb704e1e`. No author-facing breaking migration.
2760+
2761+ ## Landed since 17.0.0-rc.5
2762+
2763+ This window is **open** — these changes are on `main` after the `rc.5` cut and
2764+ roll into the next cut. Measured from the changesets added since the `rc.5`
2765+ version commit: **135 pending — 17 `major`-class, 26 `minor`, 92 `patch`**, and
2766+ none that release nothing. These numbers move until the cut; once it lands the
2767+ package changelogs are authoritative.
2768+
2769+ - **ADR-0122 phase 2 — the bare type name becomes the AUTHOR state.** 1384
2770+ aliases flip and 102 `XInput` synonyms retire, completing the convention
2771+ whose `XParsed` half landed in the previous window (#5551).
2772+ - **The driver query contract finishes narrowing.** `DriverQuery` reaches
2773+ `aggregate` and `distinct` on memory and mongodb (#6212 batch C) and five
2774+ further drivers (#6075); `SqlDriver.distinct`'s third parameter becomes a
2775+ bare `FilterCondition`, so a spelling that silently returned the whole set no
2776+ longer compiles (#6320); `analyzeQuery` and `findWithWindowFunctions` stop
2777+ taking `any`, and the window door carries its own flat-shape types (#6212
2778+ batches A and E); and the two undeclared `aggregate` / `func` aliases retire
2779+ (#6212 batch B, #6321).
2780+ - **ADR-0049 enforce-or-remove continues.** The L2 ETL layer retires —
2781+ `automation/etl.zod.ts` had no executor while the sync architecture document
2782+ was still recommending it. So do `system/http-server.zod.ts`'s runtime
2783+ vocabulary; the widget-registration vocabulary and five doorless i18n shapes,
2784+ with `FieldWidgetProps` deliberately **kept**; `ViewProtocol`'s five
2785+ viewId-addressed methods and their ten schemas (#6239); and `array_agg` /
2786+ `string_agg` from `AggregationFunction`, with `count_distinct` deliberately
2787+ kept (#6188). The SDUI component props are reconciled against the renderers
2788+ that serve them — 4 keys retired, 9 declared (#5775).
2789+ - **`composeStacks` stops last-wins on `i18n`** (#5051) — the same value
2790+ passes, a genuine conflict errors with a prescription.
2791+ - **`HierarchyScopeContext` carries the tenancy posture** (#6139), so a
2792+ single-posture `DEPTH` scope is legal rather than rejected.
2793+ - **`HookContext.api` narrows from `z.unknown()` to `IScopedContext`** (#5945)
2794+ — the first hook the documentation teaches finally compiles.
2795+ - **A `view` body must be a view before the union judges it** (#5599), and an
2796+ action param's `options[]` can speak a per-option `visibleWhen` (#5016).
2797+
2798+ ### New in Console — bundled objectui advanced `7dfbeb704e1e → 0cf8f0f70d10`
2799+
2800+ One pin move, not yet released: 66 non-merge objectui commits, 24 of 24
2801+ changesets releasing; the enumeration is `console-0cf8f0f70d10`. Two entries
2802+ carry the author's own breaking annotation, but both are TypeScript
2803+ export-surface changes inside objectui's own npm packages — the `GestureType` /
2804+ `GestureConfig` rename (objectui#3363), and objectui tracking the
2805+ `@objectstack` family at `17.0.0-rc.5` (objectui#3560). `@objectstack/console`
2806+ ships a frozen SPA build at the pin SHA and does not forward those type
2807+ entrypoints, so **no new metadata migration is registered for this move** — the
2808+ changeset records that verdict against ADR-0087. The same changeset also lists,
2809+ by subject rather than by count, the 42 commits in the range that carried no
2810+ changeset of their own.
2811+
26152812## Upgrade checklist
26162813
26172814### 17.0.0
0 commit comments