Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .changeset/console-0abd4f9f8769.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
"@objectstack/console": minor
---

Console (objectui) refreshed to `0abd4f9f8769`. Frontend changes in this range:

Derived from the changesets objectui declared over the range — 3 releasing of 5 changesets added across 5 non-merge commits; omitted: 2 release-nothing changesets (they ship no package code).

- **minor** — `@object-ui/types` declares each renderer's NODE SLOTS once (`NODE_SLOT_DECLARATIONS`, `nodeSlotsFor`), and `objectui check`, core `validateSchema`, the SDUI parser's `validateTree` and the `kind:'html'` page compile walk those slots as well as `children` (objectui#11170). Its changeset declares `Clause-②: yes (narrowing)`: a node under a slot that was never judged is judged now. (objectui `c4c506b9e`)
- **minor** — The screen-flow runner names the flow by its label, in the user's language (objectui#11092, the objectui half of objectstack#20318). (objectui `39a3e91fa`)
- **patch** — The External Datasource panel in Setup and Studio reads the `{ success, data }` envelope its routes answer (objectui#11628). On a federated datasource such as the showcase's `show… (objectui `0abd4f9f8`)

No objectui commit in the range carries `!`, and no changeset in it declares `major` or carries the breaking annotation. objectui#11170's narrowing is objectui's own validation reach and changes no ObjectStack-authorable key. The manifest this repository ships is generated without `slotsFor`, so its entries carry no slot list. The release-nothing pair is objectui#11396, which derives `MasterDetailDetailConfig` from the spec's `details` entry by reference, member for member the same, and objectui#11095, a KPI-tile invalidation pin.

objectui range: `9dfaca654311...0abd4f9f8769`
13 changes: 13 additions & 0 deletions .changeset/objectui-pin-citations-0abd4f9f8769.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
'@objectstack/spec': patch
---

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 `0abd4f9f8769`.

Clause-②: no

Every anchor was mapped through the objectui diff `9dfaca654311..0abd4f9f8769`, 50 paths over five commits. None of those paths is an objectui file that an asserting record cites, so every cited file is byte-identical across the hop (`git diff --quiet`) and every anchor held unmoved. The seven quoted anchor lines verify against objectui at the new pin. Three records carry a count, and each count was re-taken by its record's own method with the same reading: the `keyboardNavigation` hit lines (15, against 3 for the `schema.editable` control), `ObjectKanban.tsx`'s `quickAdd` / `onQuickAdd` (2 each, against 11 for `onCardClick`), and the `ElementDataSourceGate` occurrences in five `src/index.tsx` shells (0, 3, 3, 3 and 4).

The six migration entries' corpus counts were re-taken with `git grep -o -F`, the method that first reproduced every `9dfaca654311` number. The corpus is now 7650 tracked files. All 98 checked tokens read as before: every zero still reads zero, and `Span` / `SpanSchema` still read 508 / 57.

No key, default, enum member or export moves.
2 changes: 1 addition & 1 deletion .objectui-sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
9dfaca654311cddd81714153c4f82c241d7cdc54
0abd4f9f8769fc4c19ad2f96707684876f74c09f
4 changes: 2 additions & 2 deletions content/docs/references/ui/view.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ Column footer summary configuration
| **required** | `boolean` | optional | Required override |
| **hidden** | `boolean` | optional | Hidden override |
| **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. |
| **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` = `9dfaca654311`), 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. |
| **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` = `0abd4f9f8769`), 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. |
| **widget** | `string` | optional | Custom widget/component name (overrides type-based inference) |
| **language** | `string` | optional | Code editor language (for type=code) |
| **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 |
Expand Down Expand Up @@ -343,7 +343,7 @@ Form-view select option — the object-field option shape minus the per-option `
| **required** | `boolean` | optional | Required override |
| **hidden** | `boolean` | optional | Hidden override |
| **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. |
| **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` = `9dfaca654311`), 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. |
| **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` = `0abd4f9f8769`), 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. |
| **widget** | `string` | optional | Custom widget/component name (overrides type-based inference) |
| **language** | `string` | optional | Code editor language (for type=code) |
| **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 |
Expand Down
6 changes: 3 additions & 3 deletions packages/sdui-parser/objectui-lockstep.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
],
"objectui": {
"repo": "https://github.com/objectstack-ai/objectui.git",
"rev": "9dfaca654311cddd81714153c4f82c241d7cdc54",
"revDate": "2026-10-04T18:53:28+00:00",
"rev": "0abd4f9f8769fc4c19ad2f96707684876f74c09f",
"revDate": "2026-10-05T04:03:25+00:00",
"source": "packages/sdui-parser/src",
"files": [
"packages/sdui-parser/src/body-dialect.ts",
Expand All @@ -21,7 +21,7 @@
"packages/sdui-parser/src/validate.ts"
]
},
"recordedAgainstPin": "9dfaca654311cddd81714153c4f82c241d7cdc54",
"recordedAgainstPin": "0abd4f9f8769fc4c19ad2f96707684876f74c09f",
"grammarRegion": {
"file": "packages/sdui-parser/src/parse.ts",
"delimiter": "/* ---------------------- the JS literal subset (#6614) ---------------------- */",
Expand Down
5 changes: 4 additions & 1 deletion packages/spec/src/data/api-methods-batch-conformance.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,10 @@ const SINGLE_RECORD_WRITE_ONLY: Record<string, string> = {
// `revoked` on ONE key. The multi-select surface this rule protects does not
// exist for API keys, and the shape a future one would take does not need
// `bulk` either — both read off the console build this release pins
// (`.objectui-sha` = `9dfaca654`, `packages/plugin-grid`; re-measured at
// (`.objectui-sha` = `0abd4f9f8`, re-read there 2026-10-05:
// every objectui file this record cites is byte-identical across the hop from
// `9dfaca654` (`git diff --quiet`), so every anchor held unmoved.
// At `9dfaca654`, `packages/plugin-grid`; re-measured at
// that pin, 2026-10-05: on the hop off `2e818d0b5`, `ObjectGrid.tsx` changed
// in three type docblocks only (9 insertions, 6 deletions: objectui#8347
// re-wording its `BaseSchema` index-signature notes in the past tense), all
Expand Down
20 changes: 16 additions & 4 deletions packages/spec/src/kernel/functional-completeness.ts
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,10 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] {
* English sentence. So the loss is total rather than partial — every
* record, on every object — and the author is told at render time as well
* as here. Both reads hold at the pin this repo builds against
* (`.objectui-sha` = `9dfaca654`, re-read 2026-10-05: on the hop off
* (`.objectui-sha` = `0abd4f9f8`, re-read there 2026-10-05:
* every objectui file this record cites is byte-identical across the hop from
* `9dfaca654` (`git diff --quiet`), so every anchor held unmoved.
* At `9dfaca654`, re-read 2026-10-05: on the hop off
* `2e818d0b5` `ObjectCalendar.tsx` changed in one comment only, line for
* line (`:97-98`, objectui#8347 putting the `BaseSchema` index signature in
* the past tense), so `getCalendarConfig` `:294`, the `if (!calendarConfig)`
Expand Down Expand Up @@ -355,7 +358,10 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] {
* This repo already records the same deletion one door over: the #13817
* check in `../ui/view.zod.ts` names objectui#7029 as its runtime half.
* - `gantt` → NO fallback, and no silence [#19630]. Measured at the pin
* this repo builds against (`.objectui-sha` = `9dfaca654`, re-read
* this repo builds against (`.objectui-sha` = `0abd4f9f8`, re-read there 2026-10-05:
* every objectui file this record cites is byte-identical across the hop from
* `9dfaca654` (`git diff --quiet`), so every anchor held unmoved.
* At `9dfaca654`, re-read
* 2026-10-05: on the hop off `2e818d0b5` `ObjectGantt.tsx` changed in one
* docblock only (4 insertions, 3 deletions: objectui#8347 putting the
* `ObjectGanttProps` index-signature note in the past tense), above
Expand Down Expand Up @@ -417,7 +423,10 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] {
* requires. So the view does not draw a blank chart: it refuses, by name.
* - `timeline` → date axis: NO fallback [#19630]; title: `titleField || 'name'`,
* which still stands. Measured at the same pin (`.objectui-sha` =
* `9dfaca654`; `ObjectTimeline.tsx` and `ListView.tsx` are byte-identical
* `0abd4f9f8`, re-read there 2026-10-05:
* every objectui file this record cites is byte-identical across the hop from
* `9dfaca654` (`git diff --quiet`), so every anchor held unmoved.
* At `9dfaca654`; `ObjectTimeline.tsx` and `ListView.tsx` are byte-identical
* across the hop off `2e818d0b5`, so every anchor held unmoved, re-read
* 2026-10-05; they were byte-identical across the hop off `ab1879721` onto
* `2e818d0b5` too, so every anchor held unmoved there; on the hop
Expand Down Expand Up @@ -467,7 +476,10 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] {
* block does render; the warning still fires there, because the block the
* view TYPE names is the one that is missing. Unchanged by this row.
* - `map` → NO fallback, and no silence [#19630]. Measured at the same
* pin (`.objectui-sha` = `9dfaca654`; `ObjectMap.tsx` and `ListView.tsx`
* pin (`.objectui-sha` = `0abd4f9f8`, re-read there 2026-10-05:
* every objectui file this record cites is byte-identical across the hop from
* `9dfaca654` (`git diff --quiet`), so every anchor held unmoved.
* At `9dfaca654`; `ObjectMap.tsx` and `ListView.tsx`
* are byte-identical across the hop off `2e818d0b5`, so every anchor held
* unmoved, re-read 2026-10-05; they were byte-identical across the hop off
* `ab1879721` onto `2e818d0b5` too, so every anchor held
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,13 @@ export const entry: SemanticMigration = {
+ 'the audience that does not parse. Measured on 884e8347d: the only in-repo readers are '
+ 'packages/core/src/health-monitor.ts and packages/core/src/hot-reload.ts, both moved in '
+ 'this same change; and the pinned objectui checkout — the pin this repo builds '
+ 'against, `.objectui-sha` = `9dfaca654311cddd81714153c4f82c241d7cdc54` — names '
+ 'against, `.objectui-sha` = `0abd4f9f8769fc4c19ad2f96707684876f74c09f` — names '
+ 'neither def and neither key: all thirteen exports of plugin-lifecycle-advanced.zod.ts and '
+ 'the string debounceDelay each occur 0 times across its 7632 tracked files (0 across 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 '
+ 'the string debounceDelay each occur 0 times across its 7650 tracked files (0 across 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 '
+ '8512 at f8a9d0fb0 and the 8303 at 62597c588 too), against lit '
+ 'controls objectstack 12966 and @objectstack/spec 4997 on the same corpus at 87af769e9, '
+ 'which re-count to 13125 and 5043 respectively at 62597c588, to 13347 and 5123 at '
+ '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 and to 17313 and 7186 at this pin (git grep -o -F, the method that reproduces '
+ '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 and to 17390 and 7209 at this pin (git grep -o -F, the method that reproduces '
+ 'every earlier count).',
acceptanceCriteria:
'Every producer and reader of a PluginHealthCheck spells intervalMs and timeoutMs, and every '
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,10 @@ export const entry: SemanticMigration = {
+ 'spells timeout 0 times; outside the zod file and its test the only live occurrences are the '
+ 'generated rows in content/docs/references/kernel/plugin-security-advanced.mdx, which this '
+ 'rename regenerates. The pinned objectui checkout — this is the pin we build against, '
+ '`.objectui-sha` = `9dfaca654311cddd81714153c4f82c241d7cdc54`, re-read from this tree — '
+ '`.objectui-sha` = `0abd4f9f8769fc4c19ad2f96707684876f74c09f`, re-read from this tree — '
+ 'spells resourceLimits.timeout 0 times across '
+ '7632 tracked files, against lit controls timeout 1360, RuntimeConfig 293 and resourceLimits '
+ '2 on the same corpus (0 across 7579, and 1351 / 276 / 2, at 2e818d0b5; 0 across 10267, and 1348 / 273 / 2, at ab1879721; 0 across 10071, and 1331 / 273 / 2, at 89cad75d5; 0 across 9912, and 1303 / 273 / 2, at 31971ff1e; 0 across 9800, and 1293 / 273 / 2, at e420df310; 0 across 9546, and 1197 / 273 / 2, at db11afd49; 0 across 9283, and 1172 / 263 / 2, at dd3f7e1be; 0 across 8512, and 1096 / 245 / 2, at f8a9d0fb0; 0 across 8303, and '
+ '7650 tracked files, against lit controls timeout 1360, RuntimeConfig 293 and resourceLimits '
+ '2 on the same corpus (0 across 7632, and 1360 / 293 / 2, at 9dfaca654; 0 across 7579, and 1351 / 276 / 2, at 2e818d0b5; 0 across 10267, and 1348 / 273 / 2, at ab1879721; 0 across 10071, and 1331 / 273 / 2, at 89cad75d5; 0 across 9912, and 1303 / 273 / 2, at 31971ff1e; 0 across 9800, and 1293 / 273 / 2, at e420df310; 0 across 9546, and 1197 / 273 / 2, at db11afd49; 0 across 9283, and 1172 / 263 / 2, at dd3f7e1be; 0 across 8512, and 1096 / 245 / 2, at f8a9d0fb0; 0 across 8303, and '
+ '1086 / 240 / 2, at 62597c588); both resourceLimits hits are prose in packages/app-shell recording '
+ 'that objectui\'s own AppShellRuntimeConfig shares not one key with the spec\'s '
+ 'RuntimeConfig, so nothing there authors this key and no pin bump is owed. ADR-0087.',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,10 @@ export const entry: SemanticMigration = {
+ 'no in-repo runtime reads any of the four — outside `packages/spec/src/system/logging.zod.ts` '
+ 'and its test the only occurrences are the generated rows in '
+ '`content/docs/references/system/logging.mdx`, which this rename regenerates; and the pinned '
+ 'objectui checkout — `.objectui-sha` = `9dfaca654311cddd81714153c4f82c241d7cdc54` — spells '
+ 'objectui checkout — `.objectui-sha` = `0abd4f9f8769fc4c19ad2f96707684876f74c09f` — spells '
+ '`flushInterval` 0 times, `initialDelay` 0, `HttpDestinationConfig` 0 and `LoggingConfig` 0 '
+ 'across its 7632 tracked files, against lit controls `useState` 2477 and `timeout` 1360 on '
+ 'the same corpus (all four 0 across 7579, against 2477 and 1351, at 2e818d0b5, 0 across 10267, against 2476 and 1348, at ab1879721, 0 across 10071, against 2470 and 1331, at 89cad75d5, 0 across 9912, against 2469 and 1303, at 31971ff1e, 0 across 9800, against 2464 and 1293, at e420df310, 0 across 9546, against 2449 and 1197, at db11afd49, 0 across 9283, against 2435 and 1172, at dd3f7e1be, 0 across 8512, '
+ 'across its 7650 tracked files, against lit controls `useState` 2478 and `timeout` 1360 on '
+ 'the same corpus (all four 0 across 7632, against 2477 and 1360, at 9dfaca654, 0 across 7579, against 2477 and 1351, at 2e818d0b5, 0 across 10267, against 2476 and 1348, at ab1879721, 0 across 10071, against 2470 and 1331, at 89cad75d5, 0 across 9912, against 2469 and 1303, at 31971ff1e, 0 across 9800, against 2464 and 1293, at e420df310, 0 across 9546, against 2449 and 1197, at db11afd49, 0 across 9283, against 2435 and 1172, at dd3f7e1be, 0 across 8512, '
+ 'against 2391 and 1096, at f8a9d0fb0, and 0 across '
+ '8303, against 2389 and 1086, at 62597c588).',
acceptanceCriteria:
Expand Down
Loading
Loading