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
154 changes: 154 additions & 0 deletions .changeset/console-f0268ad78485.md

Large diffs are not rendered by default.

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

Clause-②: no

Every anchor was mapped through the objectui diff `a58626c88dc8..f0268ad78485`, 1061 paths over 170 commits. Where a cited line moved with its text byte-identical, the record is re-pointed and its new hop sentence says by how much. Where objectui rewrote a cited line around the same read, the range is re-read and the hop sentence says so.

Three records said something that is false at the new pin, and only those sentences are rewritten:

- `element:repeater` reads the node-level `dataSource` binding first since objectui#11880 (objectui `aaba8655a`), with its flat `object` / `filter` / `sort` / `limit` keys as the fallback. The row's docblock said the binding was not read. It now states the precedence the renderer applies, and that a node naming its object only through `dataSource` renders while this row still requires `object`: that requirement can follow the renderer only by a schema change, which is objectstack#11509's.
- `action:button` now publishes `undoable` and hands the runner the record in scope as its Undo baseline (objectui#11168, objectui `f0496bdf1`). The row's docblock said the input stayed unpublished because the block wrote no row stash.
- `action:icon` reads `label` six times, not five: the tooltip of a predicate-disabled icon takes it as its heading (objectui#11839, objectui `cef0eeec0`).

The `FormField.span` describe changes its sha only: `WIDE_FIELD_TYPES`, the field-type alias table and `spanLadderFor` are byte-identical at the new pin. The six migration entries' corpus counts were re-taken with `git grep -o -F`, the method that first reproduced every `a58626c88dc8` number. The corpus is now 8234 tracked files. All 99 checked tokens still read zero, except `Span` / `SpanSchema`, which read 517 / 57: the eight new `Span` hits are each a `colSpan`.

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 @@
a58626c88dc85954bd0af24f16ebb69454c03eee
f0268ad784854568aa58a2aa791f6a7502259186
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` = `a58626c88dc8`), 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` = `f0268ad78485`), 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` = `a58626c88dc8`), 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` = `f0268ad78485`), 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": "a58626c88dc85954bd0af24f16ebb69454c03eee",
"revDate": "2026-10-06T15:08:56+00:00",
"rev": "f0268ad784854568aa58a2aa791f6a7502259186",
"revDate": "2026-10-09T01:49:47+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": "a58626c88dc85954bd0af24f16ebb69454c03eee",
"recordedAgainstPin": "f0268ad784854568aa58a2aa791f6a7502259186",
"grammarRegion": {
"file": "packages/sdui-parser/src/parse.ts",
"delimiter": "/* ---------------------- the JS literal subset (#6614) ---------------------- */",
Expand Down
14 changes: 13 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,19 @@ 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` = `a58626c88`, re-read there 2026-10-06:
// (`.objectui-sha` = `f0268ad78`, re-read there 2026-10-09:
// in `packages/plugin-grid`, on the hop off `a58626c88`, `ObjectGrid.tsx`
// changed again (85 insertions, 27 deletions: objectui#11880 item 5's grid
// filter hand-off, objectui#6152 rounds 7 and 10, objectui#11817's link cell,
// objectui#11809's option order and objectui#11689's boolean face), none of
// it inside the selection block and no hunk naming a bulk action, a delete
// affordance or `operations`, so the block only MOVED by +54:
// `ObjectGrid.tsx:4867-4894` here (`4813-4840` at `a58626c88`), still hashing
// to `c88443302d40c2db739ddb235470bafa29056e2e` (hash-object of the block),
// re-READ with the same reading below; `hooks/useBulkExecutor.ts` is
// byte-identical to `a58626c88` and its `:298-303` still hashes to
// `01083348330f10a201cdf1078b4c21c236402b6a`. At `a58626c88`, re-read there
// 2026-10-06:
// every objectui file this record cites is byte-identical across the hop from
// `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved.
// At `0abd4f9f8`, re-read there 2026-10-05:
Expand Down
38 changes: 34 additions & 4 deletions packages/spec/src/kernel/functional-completeness.ts
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,16 @@ 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` = `a58626c88`, re-read there 2026-10-06:
* (`.objectui-sha` = `f0268ad78`, re-read there 2026-10-09:
* on the hop off `a58626c88` `ObjectCalendar.tsx` changed in one comment line
* only, line for line (`:1250`, objectui `c0862c1cc` re-citing the installed spec
* as 17.7.0), so `getCalendarConfig` `:294`, the `if (!calendarConfig)` arm
* `:1296` and its `tt(…)` lines `:1303-1304` did not move and are byte-identical;
* `ListView.tsx` changed (+286/-46: objectui#11984, objectui#6152 round 12,
* objectui#11860, objectui#11943, objectui#11925, objectui#11816, objectui#11810
* and objectui#11687), every `case` arm byte-identical and moved by 83; and the
* `en` / `zh` / `de` packs changed (17 commits) but not their
* `calendar.configRequired` strings. At `a58626c88`, re-read there 2026-10-06:
* on the hop off `0abd4f9f8` `ObjectCalendar.tsx` and `ListView.tsx` are
* byte-identical (`git diff --quiet`), so every anchor held unmoved, and the
* `en` / `zh` / `de` packs changed (objectui#11658, objectui#11659,
Expand Down Expand Up @@ -375,7 +384,12 @@ 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` = `a58626c88`, re-read there 2026-10-06:
* this repo builds against (`.objectui-sha` = `f0268ad78`, re-read there 2026-10-09:
* on the hop off `a58626c88` `ObjectGantt.tsx` is byte-identical
* (`git diff --quiet`), so `getGanttConfig` `:610` and the `if (!ganttConfig)`
* arm `:2307` did not move, and `ListView.tsx` changed (+286/-46, the same eight
* objectui changes as above) with its `case 'gantt'` byte-identical, moved by 83.
* At `a58626c88`, re-read there 2026-10-06:
* every objectui file this record cites is byte-identical across the hop from
* `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved.
* At `0abd4f9f8`, re-read there 2026-10-05:
Expand Down Expand Up @@ -443,7 +457,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` =
* `a58626c88`, re-read there 2026-10-06:
* `f0268ad78`, re-read there 2026-10-09:
* on the hop off `a58626c88` `ObjectTimeline.tsx` changed in three comments only
* (+19/-8, objectui#6152 round 12: the nested block's type is the spec slot by
* reference, its legacy `dateField` refused by name while the read stays), so its
* start-date chain and its `if (!hasAuthoredItems && !startDateField)` refusal
* arm are byte-identical, MOVED `:578-580` → `:589-591` and `:941` → `:952`, and
* `ListView.tsx` changed (+286/-46) with its `case 'timeline'` and
* `resolveTimelineDateBinding` byte-identical, moved by 83 and by 13. At
* `a58626c88`, re-read there 2026-10-06:
* on the hop off `0abd4f9f8` `ObjectTimeline.tsx` changed (+39/-9:
* objectui#11675 starts the date buckets' week on the display locale's first
* day, and objectui#11676 heads a past date "Earlier" and retires the
Expand Down Expand Up @@ -504,7 +526,15 @@ 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` = `a58626c88`, re-read there 2026-10-06:
* pin (`.objectui-sha` = `f0268ad78`, re-read there 2026-10-09:
* on the hop off `a58626c88` `ObjectMap.tsx` changed (85 insertions, 4 deletions,
* objectui#11819: without WebGL2 the map lists its records instead of crashing),
* which touches no coordinate read: `getMapConfig` and `hasCoordinateBinding` are
* byte-identical and moved `:387` → `:421` and `:493` → `:527` under the WebGL2
* probe above them, and the refusal arm is byte-identical, moved `:1291` →
* `:1337`; and `ListView.tsx` changed (+286/-46) with its `case 'map'`
* byte-identical, moved by 83, and `resolveListMapConfig` byte-identical, moved
* `:146` → `:147`. At `a58626c88`, re-read there 2026-10-06:
* every objectui file this record cites is byte-identical across the hop from
* `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved.
* At `0abd4f9f8`, re-read there 2026-10-05:
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` = `a58626c88dc85954bd0af24f16ebb69454c03eee` — names '
+ 'against, `.objectui-sha` = `f0268ad784854568aa58a2aa791f6a7502259186` — 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 7754 tracked files (0 across 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 '
+ 'the string debounceDelay each occur 0 times across its 8234 tracked files (0 across 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 '
+ '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, to 17313 and 7186 at 9dfaca654, to 17390 and 7209 at 0abd4f9f8 and to 17468 and 7246 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, to 17390 and 7209 at 0abd4f9f8, to 17468 and 7246 at a58626c88 and to 17956 and 7522 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` = `a58626c88dc85954bd0af24f16ebb69454c03eee`, re-read from this tree — '
+ '`.objectui-sha` = `f0268ad784854568aa58a2aa791f6a7502259186`, re-read from this tree — '
+ 'spells resourceLimits.timeout 0 times across '
+ '7754 tracked files, against lit controls timeout 1431, RuntimeConfig 299 and resourceLimits '
+ '2 on the same corpus (0 across 7650, and 1360 / 293 / 2, at 0abd4f9f8; 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 '
+ '8234 tracked files, against lit controls timeout 1658, RuntimeConfig 337 and resourceLimits '
+ '2 on the same corpus (0 across 7754, and 1431 / 299 / 2, at a58626c88; 0 across 7650, and 1360 / 293 / 2, at 0abd4f9f8; 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
Loading
Loading