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
122 changes: 122 additions & 0 deletions .changeset/console-89cad75d5570.md

Large diffs are not rendered by default.

9 changes: 9 additions & 0 deletions .changeset/objectui-pin-citations-89cad75d5570.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
'@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 `89cad75d5570`.

Clause-②: no

Several records were corrected rather than moved, because objectui changed what they describe on this hop: `object-map` now reads `mapStyle` ahead of `map.style` on the declared-block path as well (objectui#11168 slice 3), so the `getMapConfig` return quote is rewritten; `object-tree`'s `navigation` read and `@object-ui/types`' `ObjectTreeSchema` mirror now carry the spec row's keys with no cast, and objectui's record-source table no longer lists the retired bare `tree` / `view:tree` keys (objectui#10859 batch 8); `object-map`, `object-gantt` and `object-timeline` publish the further keys their rows declare (objectui#11168 slices 3–5). Two stale `object-timeline` anchors (`filter` and `variant`) that were already one line off at the previous pin are corrected. 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 @@
31971ff1e28f89cfc45f0c19bc5b05e443f28b79
89cad75d55702cc4f267bead5bf267de575d5842
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` = `31971ff1e28f`), 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` = `89cad75d5570`), 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` = `31971ff1e28f`), 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` = `89cad75d5570`), 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": "31971ff1e28f89cfc45f0c19bc5b05e443f28b79",
"revDate": "2026-10-01T07:33:37+00:00",
"rev": "89cad75d55702cc4f267bead5bf267de575d5842",
"revDate": "2026-10-02T06:25:01+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": "31971ff1e28f89cfc45f0c19bc5b05e443f28b79",
"recordedAgainstPin": "89cad75d55702cc4f267bead5bf267de575d5842",
"grammarRegion": {
"file": "packages/sdui-parser/src/parse.ts",
"delimiter": "/* ---------------------- the JS literal subset (#6614) ---------------------- */",
Expand Down
18 changes: 14 additions & 4 deletions packages/spec/src/data/api-methods-batch-conformance.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,21 @@ 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` = `31971ff1e`, `packages/plugin-grid`; re-measured at
// that pin, 2026-10-01. On the hop off `e420df310`, `ObjectGrid.tsx` changed
// (`.objectui-sha` = `89cad75d5`, `packages/plugin-grid`; re-measured at
// that pin, 2026-10-02. On the hop off `31971ff1e`, `ObjectGrid.tsx` changed
// again (42 insertions, 17 deletions: objectui#11322's built-in bulk-delete
// gate asking `partitionRowsByPredicate` directly and objectui#11254's
// mobile-card percent width, plus their two import lines, each edited in
// place), every hunk either a same-length import edit or below the
// selection block, which did NOT move: `ObjectGrid.tsx:4791-4818` here as at
// `31971ff1e`, still hashing to `c88443302d40c2db739ddb235470bafa29056e2e`
// (hash-object of the block), re-READ with the same reading below;
// `hooks/useBulkExecutor.ts` is byte-identical to `31971ff1e` and its
// `:298-303` still hashes to `01083348330f10a201cdf1078b4c21c236402b6a`.
// At `31971ff1e`, 2026-10-01: on the hop off `e420df310`, `ObjectGrid.tsx` changed
// again (41 insertions, 1 deletion: objectui#10689's re-read on a harvested
// query input), every hunk above the selection block, which only MOVED by
// +40: `ObjectGrid.tsx:4791-4818` here (`4751-4778` at `e420df310`), still
// +40: `ObjectGrid.tsx:4791-4818` there (`4751-4778` at `e420df310`), still
// hashing to `c88443302d40c2db739ddb235470bafa29056e2e` (hash-object of the
// block), re-READ with the same reading below; `hooks/useBulkExecutor.ts` is
// byte-identical to `e420df310` and its `:298-303` still hashes to
Expand All @@ -91,7 +101,7 @@ const SINGLE_RECORD_WRITE_ONLY: Record<string, string> = {
// re-READ with the same reading below; `hooks/useBulkExecutor.ts` is
// byte-identical to `dd3f7e1be` and its `:298-303` still hashes to
// `01083348330f10a201cdf1078b4c21c236402b6a`. Previously measured at
// `e420df310`, `db11afd49`, `dd3f7e1be`, `f8a9d0fb0`, `62597c588`,
// `31971ff1e`, `e420df310`, `db11afd49`, `dd3f7e1be`, `f8a9d0fb0`, `62597c588`,
// `87af769e9`, `53ded82bf`, `a472b0716`, `00d3f09c5`, `67dadd602`, before
// that at `d8ec8d6d4`, `9602dc820`, `190fbd01d`, `9a3daf8d3`, originally at
// `6314e87f2`. On the hop off `f8a9d0fb0`, `ObjectGrid.tsx` changed hard
Expand Down
43 changes: 35 additions & 8 deletions packages/spec/src/kernel/functional-completeness.ts
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,12 @@ 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` = `31971ff1e`, re-read 2026-10-01: `ObjectCalendar.tsx`
* (`.objectui-sha` = `89cad75d5`, re-read 2026-10-02: on the hop off
* `31971ff1e` `ObjectCalendar.tsx` and `ListView.tsx` are byte-identical,
* so `getCalendarConfig` `:294`, the `if (!calendarConfig)` arm `:1296` and
* its `tt(…)` lines `:1303-1304` did not move, every `case` arm is
* byte-identical, and the `en` / `zh` / `de` `calendar.configRequired`
* strings did not change. At `31971ff1e` (2026-10-01) `ObjectCalendar.tsx`
* changed on the hop off `e420df310` only at its `navigation` read
* (objectui#8652 declared the key and dropped that read's cast, 11
* insertions, 19 deletions), below `getCalendarConfig`, which is
Expand Down Expand Up @@ -329,8 +334,14 @@ 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` = `31971ff1e`, re-read
* 2026-10-01; on the hop off `e420df310` `ObjectGantt.tsx` is byte-identical,
* this repo builds against (`.objectui-sha` = `89cad75d5`, re-read
* 2026-10-02; on the hop off `31971ff1e` `ObjectGantt.tsx` changed (47
* insertions, 10 deletions: objectui#11254's field-scale width on the
* number and percent rows, objectui#11355's uncast shadowed-flat-key read,
* one import line), none of it in `getGanttConfig` or the refusal arm, which
* are byte-identical and moved `:607` → `:608` and `:2261` → `:2298`, and
* `ListView.tsx` is byte-identical, `case 'gantt'` with it; at `31971ff1e`
* (2026-10-01), on the hop off `e420df310` `ObjectGantt.tsx` is byte-identical,
* so `getGanttConfig` `:607` and the `if (!ganttConfig)` arm `:2261` did not
* move, and `ListView.tsx`'s `case 'gantt'` is byte-identical; at
* `e420df310` (2026-09-30), on the hop off `db11afd49`, `ObjectGantt.tsx` changed again
Expand Down Expand Up @@ -371,8 +382,15 @@ 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` =
* `31971ff1e`; on the hop onto this pin `ListView.tsx`'s `case 'timeline'`
* and `resolveTimelineDateBinding` are byte-identical, and
* `89cad75d5`; on the hop off `31971ff1e` `ListView.tsx` is byte-identical,
* `case 'timeline'` and `resolveTimelineDateBinding` with it, and
* `ObjectTimeline.tsx` changed only in two `navigation` comments
* (objectui#11293 / objectui#11168 slice 5, 16 insertions, 7 deletions:
* an absent key opens nothing rather than resolving the hook's `page`), so
* the start-date chain and the refusal arm are byte-identical and MOVED
* `:568-570` → `:574-576` and `:902` → `:911`. At `31971ff1e`, on the hop
* off `e420df310`, `ListView.tsx`'s `case 'timeline'`
* and `resolveTimelineDateBinding` were byte-identical, and
* `ObjectTimeline.tsx` changed above both reads (objectui#8654's typed
* `navigation` member, 42 insertions, 2 deletions), so the start-date chain
* and the refusal arm are byte-identical and MOVED `:533-535` → `:568-570`
Expand Down Expand Up @@ -405,10 +423,19 @@ 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` = `31971ff1e`; on the hop onto this pin
* pin (`.objectui-sha` = `89cad75d5`; on the hop off `31971ff1e`
* `ListView.tsx` is byte-identical, `case 'map'` and `resolveListMapConfig`
* with it, and `ObjectMap.tsx` changed (11 insertions, 4 deletions) in
* `warnOnShadowedFlatMapKeys`' cast (objectui#11355) and in `getMapConfig`'s
* `style` precedence — `mapStyle` before `map.style` on the declared-block
* return too (objectui#11168 slice 3) — which touches no coordinate read:
* `getMapConfig` is unmoved at `:387` and still guesses no field name,
* `hasCoordinateBinding` and the refusal arm are byte-identical and moved
* `:486` → `:493` and `:1284` → `:1291`. At `31971ff1e` (2026-10-01)
* `ObjectMap.tsx`, `ListView.tsx`'s `case 'map'` and `resolveListMapConfig`
* are byte-identical, so `getMapConfig` `:387`, `hasCoordinateBinding`
* `:486` and the refusal arm `:1284` did not move. At `e420df310`
* were byte-identical to `e420df310`, so `getMapConfig` `:387`,
* `hasCoordinateBinding` `:486` and the refusal arm `:1284` did not move.
* At `e420df310`
* `ObjectMap.tsx` changed only in the record-source docblock above
* `getMapConfig` (16 insertions, 17 deletions, objectui#8348), so
* `getMapConfig`, `hasCoordinateBinding` and the refusal arm are
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` = `31971ff1e28f89cfc45f0c19bc5b05e443f28b79` — names '
+ 'against, `.objectui-sha` = `89cad75d55702cc4f267bead5bf267de575d5842` — 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 9912 tracked files (0 across the 9800 at e420df310, the 9546 at db11afd49, the 9283 at dd3f7e1be, the '
+ 'the string debounceDelay each occur 0 times across its 10071 tracked files (0 across 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 and to 15691 and 6206 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 and to 16044 and 6461 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` = `31971ff1e28f89cfc45f0c19bc5b05e443f28b79`, re-read from this tree — '
+ '`.objectui-sha` = `89cad75d55702cc4f267bead5bf267de575d5842`, re-read from this tree — '
+ 'spells resourceLimits.timeout 0 times across '
+ '9912 tracked files, against lit controls timeout 1303, RuntimeConfig 273 and resourceLimits '
+ '2 on the same corpus (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 '
+ '10071 tracked files, against lit controls timeout 1331, RuntimeConfig 273 and resourceLimits '
+ '2 on the same corpus (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` = `31971ff1e28f89cfc45f0c19bc5b05e443f28b79` — spells '
+ 'objectui checkout — `.objectui-sha` = `89cad75d55702cc4f267bead5bf267de575d5842` — spells '
+ '`flushInterval` 0 times, `initialDelay` 0, `HttpDestinationConfig` 0 and `LoggingConfig` 0 '
+ 'across its 9912 tracked files, against lit controls `useState` 2469 and `timeout` 1303 on '
+ 'the same corpus (all four 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 10071 tracked files, against lit controls `useState` 2470 and `timeout` 1331 on '
+ 'the same corpus (all four 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