Skip to content

Commit aaa50c6

Browse files
committed
chore(objectui): bump the console pin to 4997995 (carries objectui#12136)
Moves the bundled Console's objectui pin from 0df67f2 to 4997995, objectui#12136's merge (objectui#12126): metadata-admin registers the ref-multi:permission widget, so the position form's permissionSets row renders a picker of declared permission sets. It is the nearest objectui main commit that carries the widget, 7 commits past the old pin (0 merges, 80 paths). The bump follows the repo's procedure: scripts/bump-objectui.sh writes the pin and the console changeset; pnpm objectui:build and node scripts/gen-sdui-manifest-node.mjs re-record the SDUI manifest; check-sdui-lockstep --update re-records the lockstep; the asserting objectui pin citations in packages/spec/src are re-measured at the new pin; gen:docs regenerates the one describe whose sha moved. sdui.manifest.json is byte-identical (sha256 9d87162a3ef6, 107 components); only its record names the new pin. No key, default, enum member or export moves: check:generated, check:api-surface and check:authorable-surface are green on this tree. Claude-Session: https://claude.ai/code/session_01KNKBCRDJCu5tGy3TEbvtrF Co-authored-by: Claude <noreply@anthropic.com>
1 parent aa734f0 commit aaa50c6

20 files changed

Lines changed: 312 additions & 83 deletions

‎.changeset/console-4997995022f8.md‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
---
2+
"@objectstack/console": minor
3+
---
4+
5+
Console (objectui) refreshed to `4997995022f8`. Frontend changes in this range:
6+
7+
Derived from the changesets objectui declared over the range — 5 releasing of 5 changesets added across 7 non-merge commits; omitted: 2 commits carrying no changeset (they ship no package code).
8+
9+
- **minor** — A Studio form field that declares the `ref-multi:permission` widget now renders a picker of the declared permission sets instead of the JSON editor fallback (objectui#12126). (objectui `499799502`)
10+
- **minor** — The Marketplace's install answers now say what the runtime served (objectui#12098). (objectui `107139379`)
11+
- **minor** — A paged grid's column footer reads the whole matched set, or says it reads the page (objectui#12081 item 3). (objectui `69bca0af6`)
12+
- **patch** — A boolean field whose `defaultValue` is a CEL expression or a runtime token now gets that default on create (objectui#12121). (objectui `c9fc10b1e`)
13+
- **patch** — More write affordances read the affordance-to-grant map, so a caller without the grant is no longer offered a write the server then refuses (objectui#12082, leg A of the write-cen… (objectui `752504520`)
14+
15+
**In this console build, declared nowhere** — objectui merged 2 commits in this range with no `.changeset/*.md`. The code is inside the pin above and ships here, but nothing upstream declared them, so they appear in no objectui CHANGELOG and in no entry above. Listed by subject rather than counted, because a count cannot tell a dependency bump from a form-behaviour change (objectstack#6174); the upstream gate that would prevent this is objectui#3387.
16+
17+
- _(no changeset)_ docs: stop teaching keys the strict authoring face refuses (objectui#12131, phase 1) (#12134) (objectui `66eb5604e`)
18+
- _(no changeset)_ fix(examples): repair the class (i) keys the strict authoring face refuses (objectui#5250 slice C) (#12128) (objectui `802f0bc41`)
19+
20+
objectui range: `0df67f237c5a...4997995022f8`
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
---
2+
'@objectstack/spec': patch
3+
---
4+
5+
The spec's objectui citations, and the shipped description text that names the `.objectui-sha` pin (the `FormField.span` describe and six migration-entry descriptions), are re-measured against the new console pin, objectui `4997995022f8`.
6+
7+
Clause-②: no
8+
9+
Every anchor was mapped through the objectui diff `0df67f237c5a..4997995022f8`: 80 paths over 7 commits, none deleted and one renamed (a schema-catalog example, which no record cites). Three files a record cites changed on the hop, plus the `en` / `zh` / `de` packs (whose `calendar.configRequired` strings did not change): `ObjectGrid.tsx` (objectui#12081 item 3 and objectui#12082), `ObjectGantt.tsx` (objectui#12082) and `form.tsx` (objectui#12121). Every cited line in them moved or held with its text byte-identical, and each record that cites one is re-pointed with a hop sentence that says by how much. The records that cite only byte-identical files gain a hop sentence that says so.
10+
11+
Two readings sit beside a cited read, and each hop sentence says what it found:
12+
13+
- `ObjectGrid.tsx`: a bulk `update` def is now withheld unless the edit verdict allows it (objectui#12082), which narrows the declared defs and adds no implicit one, so the `sys_api_key` reading holds. The selection block still hashes to `c88443302d40`.
14+
- `ObjectGantt.tsx`: the chart's in-chart write handlers are withheld from a caller without the grant (objectui#12082). No `schema.*` read moved; the renderer reads the same 49 names at both pins.
15+
16+
The six migration entries' corpus counts were re-taken with `git grep -o -F`, the method that reproduces every `0df67f237c5a` number. The corpus is now 8441 tracked files. Every token an entry counts as zero still reads zero (96 tokens; `Span` and `SpanSchema` read 517 and 57 at both pins, as the tracing entry records). The controls moved with the corpus, for example `objectstack` from 18248 to 18271 and `timeout` from 1705 to 1704.
17+
18+
No key, default, enum member or export moves.

‎.objectui-sha‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0df67f237c5ab46cbc65252c5f6bd05f2be44c48
1+
4997995022f8e65946f6362b7434685539cc72b7

‎content/docs/references/ui/view.mdx‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ Column footer summary configuration
213213
| **required** | `boolean` | optional | Required override |
214214
| **hidden** | `boolean` | optional | Hidden override |
215215
| **colSpan** | `integer` | optional | Absolute column span (1-4). The renderer clamps it to the form grid's current column count, so the cell starts at a real column boundary at every surface width and never overflows (`colSpan: 4` in a 3-column grid renders as 3); a `colSpan` within the column count renders as authored, and `colSpan: 1` emits no span class at all. |
216-
| **span** | `Enum<'auto' \| 'full'>` | optional (default: `"auto"`) | Relative field width. 'auto' (default — omit it): the renderer sizes the field from its widget type × the current column count — at the pin this repo builds against (`.objectui-sha` = `0df67f237c5a`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. |
216+
| **span** | `Enum<'auto' \| 'full'>` | optional (default: `"auto"`) | Relative field width. 'auto' (default — omit it): the renderer sizes the field from its widget type × the current column count — at the pin this repo builds against (`.objectui-sha` = `4997995022f8`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. |
217217
| **widget** | `string` | optional | Custom widget/component name (overrides type-based inference) |
218218
| **language** | `string` | optional | Code editor language (for type=code) |
219219
| **keyField** | `{ field?: string; label?: string \| Record<string, string>; placeholder?: string \| Record<string, string>; helpText?: string \| Record<string, string>; … }` | optional | Key column config for record-typed fields |
@@ -343,7 +343,7 @@ Form-view select option — the object-field option shape minus the per-option `
343343
| **required** | `boolean` | optional | Required override |
344344
| **hidden** | `boolean` | optional | Hidden override |
345345
| **colSpan** | `integer` | optional | Absolute column span (1-4). The renderer clamps it to the form grid's current column count, so the cell starts at a real column boundary at every surface width and never overflows (`colSpan: 4` in a 3-column grid renders as 3); a `colSpan` within the column count renders as authored, and `colSpan: 1` emits no span class at all. |
346-
| **span** | `Enum<'auto' \| 'full'>` | optional (default: `"auto"`) | Relative field width. 'auto' (default — omit it): the renderer sizes the field from its widget type × the current column count — at the pin this repo builds against (`.objectui-sha` = `0df67f237c5a`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. |
346+
| **span** | `Enum<'auto' \| 'full'>` | optional (default: `"auto"`) | Relative field width. 'auto' (default — omit it): the renderer sizes the field from its widget type × the current column count — at the pin this repo builds against (`.objectui-sha` = `4997995022f8`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. |
347347
| **widget** | `string` | optional | Custom widget/component name (overrides type-based inference) |
348348
| **language** | `string` | optional | Code editor language (for type=code) |
349349
| **keyField** | `{ field?: string; label?: string \| Record<string, string>; placeholder?: string \| Record<string, string>; helpText?: string \| Record<string, string>; … }` | optional | Key column config for record-typed fields |

‎packages/sdui-parser/objectui-lockstep.json‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
],
77
"objectui": {
88
"repo": "https://github.com/objectstack-ai/objectui.git",
9-
"rev": "0df67f237c5ab46cbc65252c5f6bd05f2be44c48",
10-
"revDate": "2026-10-11T07:26:10+00:00",
9+
"rev": "4997995022f8e65946f6362b7434685539cc72b7",
10+
"revDate": "2026-10-11T10:56:33+00:00",
1111
"source": "packages/sdui-parser/src",
1212
"files": [
1313
"packages/sdui-parser/src/body-dialect.ts",
@@ -21,7 +21,7 @@
2121
"packages/sdui-parser/src/validate.ts"
2222
]
2323
},
24-
"recordedAgainstPin": "0df67f237c5ab46cbc65252c5f6bd05f2be44c48",
24+
"recordedAgainstPin": "4997995022f8e65946f6362b7434685539cc72b7",
2525
"grammarRegion": {
2626
"file": "packages/sdui-parser/src/parse.ts",
2727
"delimiter": "/* ---------------------- the JS literal subset (#6614) ---------------------- */",

‎packages/spec/src/data/api-methods-batch-conformance.test.ts‎

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,24 @@ const SINGLE_RECORD_WRITE_ONLY: Record<string, string> = {
6161
// `revoked` on ONE key. The multi-select surface this rule protects does not
6262
// exist for API keys, and the shape a future one would take does not need
6363
// `bulk` either — both read off the console build this release pins
64-
// (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11:
64+
// (`.objectui-sha` = `499799502`, re-read there 2026-10-11:
65+
// in `packages/plugin-grid`, on the hop off `0df67f237`, `ObjectGrid.tsx`
66+
// changed again (89 insertions, 44 deletions: objectui#12081 item 3's
67+
// whole-set footer and objectui#12082 leg A), none of it inside the
68+
// selection block, which only MOVED by +84: `ObjectGrid.tsx:4981-5008` here
69+
// (`4897-4924` at `0df67f237`), still hashing to
70+
// `c88443302d40c2db739ddb235470bafa29056e2e` (hash-object of the block),
71+
// re-READ with the same reading below. Two hunks sit beside that reading and
72+
// were re-READ as well: objectui#12081 item 3 moved the `bulkFanoutParams`
73+
// and `resolvedTotalMatching` declarations, their code byte-identical, above
74+
// the footer's hook; and objectui#12082 now also withholds a bulk `update`
75+
// def unless the edit verdict (`rowEditVerdict`) allows it, which narrows the
76+
// declared defs and adds no implicit one. The `delete` verdict line MOVED
77+
// `:1786` -> `:1787` and the promoted def's params `:5097-5116` ->
78+
// `:5165-5184` (called at `:5132` -> `:5200`), each byte-identical.
79+
// `hooks/useBulkExecutor.ts` is byte-identical to `0df67f237` and its
80+
// `:298-303` still hashes to `01083348330f10a201cdf1078b4c21c236402b6a`. At
81+
// `0df67f237`, re-read there 2026-10-11:
6582
// in `packages/plugin-grid`, on the hop off `20c6d351a`, `ObjectGrid.tsx`
6683
// changed again (82 insertions, 32 deletions: objectui#12082's
6784
// affordance-to-grant map, objectui#12103's per-column write grant and

‎packages/spec/src/kernel/functional-completeness.ts‎

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,14 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] {
298298
* English sentence. So the loss is total rather than partial — every
299299
* record, on every object — and the author is told at render time as well
300300
* as here. Both reads hold at the pin this repo builds against
301-
* (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11:
301+
* (`.objectui-sha` = `499799502`, re-read there 2026-10-11:
302+
* on the hop off `0df67f237` `ObjectCalendar.tsx` and `ListView.tsx` are
303+
* byte-identical (`git diff --quiet`), so `getCalendarConfig` `:311`, the
304+
* `if (!calendarConfig)` arm `:1354` with its `tt(…)` lines `:1361-1362` and
305+
* the `case 'calendar'` at `3813` did not move; and the `en` / `zh` / `de`
306+
* packs changed (two commits: objectui#12081 item 3 and objectui#12098) but
307+
* not their `calendar.configRequired` strings. At `0df67f237`, re-read there
308+
* 2026-10-11:
302309
* on the hop off `20c6d351a` `ObjectCalendar.tsx` changed (+75/-19:
303310
* objectui#12081 item 2's windowed fetch and objectui#12082's write
304311
* affordances), no hunk inside a cited read, so `getCalendarConfig` moved
@@ -418,7 +425,14 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] {
418425
* This repo already records the same deletion one door over: the #13817
419426
* check in `../ui/view.zod.ts` names objectui#7029 as its runtime half.
420427
* - `gantt` → NO fallback, and no silence [#19630]. Measured at the pin
421-
* this repo builds against (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11:
428+
* this repo builds against (`.objectui-sha` = `499799502`, re-read there 2026-10-11:
429+
* on the hop off `0df67f237` `ObjectGantt.tsx` changed (+27/-4,
430+
* objectui#12082, objectui `752504520`: the chart's in-chart writes read the
431+
* affordance-to-grant map), none of it in `getGanttConfig` or the refusal arm,
432+
* which are byte-identical and moved `:610` -> `:612` and `:2307` -> `:2330`,
433+
* and `ListView.tsx` is byte-identical (`git diff --quiet`), so its
434+
* `case 'gantt'` did not move from `3959`. At `0df67f237`, re-read there
435+
* 2026-10-11:
422436
* on the hop off `20c6d351a` `ObjectGantt.tsx` is byte-identical (`git diff
423437
* --quiet`), so `getGanttConfig` `:610` and the `if (!ganttConfig)` arm `:2307`
424438
* did not move, and `ListView.tsx` changed (+229/-57, as above) with its
@@ -510,6 +524,9 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] {
510524
* requires. So the view does not draw a blank chart: it refuses, by name.
511525
* - `timeline` → date axis: NO fallback [#19630]; title: `titleField || 'name'`,
512526
* which still stands. Measured at the same pin (`.objectui-sha` =
527+
* `499799502`, re-read there 2026-10-11:
528+
* every objectui file this record cites is byte-identical across the hop from
529+
* `0df67f237` (`git diff --quiet`), so every anchor held unmoved. At
513530
* `0df67f237`, re-read there 2026-10-11:
514531
* on the hop off `20c6d351a` `ObjectTimeline.tsx` changed (+42/-20,
515532
* objectui#12104, objectui `206505c34`: an explicit `groupByField` groups by
@@ -603,7 +620,10 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] {
603620
* block does render; the warning still fires there, because the block the
604621
* view TYPE names is the one that is missing. Unchanged by this row.
605622
* - `map` → NO fallback, and no silence [#19630]. Measured at the same
606-
* pin (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11:
623+
* pin (`.objectui-sha` = `499799502`, re-read there 2026-10-11:
624+
* every objectui file this record cites is byte-identical across the hop from
625+
* `0df67f237` (`git diff --quiet`), so every anchor held unmoved. At
626+
* `0df67f237`, re-read there 2026-10-11:
607627
* on the hop off `20c6d351a` `ObjectMap.tsx` is byte-identical (`git diff
608628
* --quiet`), so `getMapConfig` `:421`, `hasCoordinateBinding` `:527` and the
609629
* refusal arm `:1337` did not move; and `ListView.tsx` changed (+229/-57) with

‎packages/spec/src/migrations/entries/semantic/18.kernel-health-check-and-hot-reload-durations-unit-in-key.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,13 @@ export const entry: SemanticMigration = {
5252
+ 'the audience that does not parse. Measured on 884e8347d: the only in-repo readers are '
5353
+ 'packages/core/src/health-monitor.ts and packages/core/src/hot-reload.ts, both moved in '
5454
+ 'this same change; and the pinned objectui checkout — the pin this repo builds '
55-
+ 'against, `.objectui-sha` = `0df67f237c5ab46cbc65252c5f6bd05f2be44c48` — names '
55+
+ 'against, `.objectui-sha` = `4997995022f8e65946f6362b7434685539cc72b7` — names '
5656
+ 'neither def and neither key: all thirteen exports of plugin-lifecycle-advanced.zod.ts and '
57-
+ 'the string debounceDelay each occur 0 times across its 8424 tracked files (0 across the 8351 at 20c6d351a, the 8281 at 47b1f0bb7, the 8234 at f0268ad78, the 7754 at a58626c88, the 7650 at 0abd4f9f8, the 7632 at 9dfaca654, the 7579 at 2e818d0b5, the 10267 at ab1879721, the 10071 at 89cad75d5, the 9912 at 31971ff1e, the 9800 at e420df310, the 9546 at db11afd49, the 9283 at dd3f7e1be, the '
57+
+ 'the string debounceDelay each occur 0 times across its 8441 tracked files (0 across the 8424 at 0df67f237, the 8351 at 20c6d351a, the 8281 at 47b1f0bb7, the 8234 at f0268ad78, the 7754 at a58626c88, the 7650 at 0abd4f9f8, the 7632 at 9dfaca654, the 7579 at 2e818d0b5, the 10267 at ab1879721, the 10071 at 89cad75d5, the 9912 at 31971ff1e, the 9800 at e420df310, the 9546 at db11afd49, the 9283 at dd3f7e1be, the '
5858
+ '8512 at f8a9d0fb0 and the 8303 at 62597c588 too), against lit '
5959
+ 'controls objectstack 12966 and @objectstack/spec 4997 on the same corpus at 87af769e9, '
6060
+ 'which re-count to 13125 and 5043 respectively at 62597c588, to 13347 and 5123 at '
61-
+ 'f8a9d0fb0, to 13745 and 5466 at dd3f7e1be, to 14704 and 5545 at db11afd49, to 15352 and 6024 at e420df310, to 15691 and 6206 at 31971ff1e, to 16044 and 6461 at 89cad75d5, to 16377 and 6665 at ab1879721, to 17227 and 7134 at 2e818d0b5, to 17313 and 7186 at 9dfaca654, to 17390 and 7209 at 0abd4f9f8, to 17468 and 7246 at a58626c88, to 17956 and 7522 at f0268ad78, to 17980 and 7523 at 47b1f0bb7, to 18047 and 7545 at 20c6d351a and to 18248 and 7582 at this pin (git grep -o -F, the method that reproduces '
61+
+ 'f8a9d0fb0, to 13745 and 5466 at dd3f7e1be, to 14704 and 5545 at db11afd49, to 15352 and 6024 at e420df310, to 15691 and 6206 at 31971ff1e, to 16044 and 6461 at 89cad75d5, to 16377 and 6665 at ab1879721, to 17227 and 7134 at 2e818d0b5, to 17313 and 7186 at 9dfaca654, to 17390 and 7209 at 0abd4f9f8, to 17468 and 7246 at a58626c88, to 17956 and 7522 at f0268ad78, to 17980 and 7523 at 47b1f0bb7, to 18047 and 7545 at 20c6d351a, to 18248 and 7582 at 0df67f237 and to 18271 and 7587 at this pin (git grep -o -F, the method that reproduces '
6262
+ 'every earlier count).',
6363
acceptanceCriteria:
6464
'Every producer and reader of a PluginHealthCheck spells intervalMs and timeoutMs, and every '

0 commit comments

Comments
 (0)