diff --git a/.changeset/console-0abd4f9f8769.md b/.changeset/console-0abd4f9f8769.md new file mode 100644 index 00000000000..e51f757e1f1 --- /dev/null +++ b/.changeset/console-0abd4f9f8769.md @@ -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` diff --git a/.changeset/objectui-pin-citations-0abd4f9f8769.md b/.changeset/objectui-pin-citations-0abd4f9f8769.md new file mode 100644 index 00000000000..db4688e9052 --- /dev/null +++ b/.changeset/objectui-pin-citations-0abd4f9f8769.md @@ -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. diff --git a/.objectui-sha b/.objectui-sha index a3875b05fe6..9d6c58a667f 100644 --- a/.objectui-sha +++ b/.objectui-sha @@ -1 +1 @@ -9dfaca654311cddd81714153c4f82c241d7cdc54 +0abd4f9f8769fc4c19ad2f96707684876f74c09f diff --git a/content/docs/references/ui/view.mdx b/content/docs/references/ui/view.mdx index 405a2e4005f..6493459a118 100644 --- a/content/docs/references/ui/view.mdx +++ b/content/docs/references/ui/view.mdx @@ -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; placeholder?: string \| Record; helpText?: string \| Record; … }` | 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 ` | **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; placeholder?: string \| Record; helpText?: string \| Record; … }` | optional | Key column config for record-typed fields | diff --git a/packages/sdui-parser/objectui-lockstep.json b/packages/sdui-parser/objectui-lockstep.json index ac2354be431..173abff67de 100644 --- a/packages/sdui-parser/objectui-lockstep.json +++ b/packages/sdui-parser/objectui-lockstep.json @@ -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", @@ -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) ---------------------- */", diff --git a/packages/spec/src/data/api-methods-batch-conformance.test.ts b/packages/spec/src/data/api-methods-batch-conformance.test.ts index 20997669357..2f84a12565a 100644 --- a/packages/spec/src/data/api-methods-batch-conformance.test.ts +++ b/packages/spec/src/data/api-methods-batch-conformance.test.ts @@ -61,7 +61,10 @@ const SINGLE_RECORD_WRITE_ONLY: Record = { // `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 diff --git a/packages/spec/src/kernel/functional-completeness.ts b/packages/spec/src/kernel/functional-completeness.ts index 067c25057dd..a3b53852188 100644 --- a/packages/spec/src/kernel/functional-completeness.ts +++ b/packages/spec/src/kernel/functional-completeness.ts @@ -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)` @@ -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 @@ -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 @@ -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 diff --git a/packages/spec/src/migrations/entries/semantic/18.kernel-health-check-and-hot-reload-durations-unit-in-key.ts b/packages/spec/src/migrations/entries/semantic/18.kernel-health-check-and-hot-reload-durations-unit-in-key.ts index 0a9c5d47c09..398da0b31c2 100644 --- a/packages/spec/src/migrations/entries/semantic/18.kernel-health-check-and-hot-reload-durations-unit-in-key.ts +++ b/packages/spec/src/migrations/entries/semantic/18.kernel-health-check-and-hot-reload-durations-unit-in-key.ts @@ -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 ' diff --git a/packages/spec/src/migrations/entries/semantic/18.kernel-runtime-config-timeout-unit-in-key.ts b/packages/spec/src/migrations/entries/semantic/18.kernel-runtime-config-timeout-unit-in-key.ts index 22ba6ec08a1..2149a17b99c 100644 --- a/packages/spec/src/migrations/entries/semantic/18.kernel-runtime-config-timeout-unit-in-key.ts +++ b/packages/spec/src/migrations/entries/semantic/18.kernel-runtime-config-timeout-unit-in-key.ts @@ -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.', diff --git a/packages/spec/src/migrations/entries/semantic/18.logging-durations-unit-in-key.ts b/packages/spec/src/migrations/entries/semantic/18.logging-durations-unit-in-key.ts index 02e7223c8c9..83ff461cfe7 100644 --- a/packages/spec/src/migrations/entries/semantic/18.logging-durations-unit-in-key.ts +++ b/packages/spec/src/migrations/entries/semantic/18.logging-durations-unit-in-key.ts @@ -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: diff --git a/packages/spec/src/migrations/entries/semantic/18.system-metrics-jsdoc-durations-unit-in-key.ts b/packages/spec/src/migrations/entries/semantic/18.system-metrics-jsdoc-durations-unit-in-key.ts index 063e1957fda..f2f315c3015 100644 --- a/packages/spec/src/migrations/entries/semantic/18.system-metrics-jsdoc-durations-unit-in-key.ts +++ b/packages/spec/src/migrations/entries/semantic/18.system-metrics-jsdoc-durations-unit-in-key.ts @@ -73,10 +73,11 @@ export const entry: SemanticMigration = { + 'against a lit control of 1195 defineStack occurrences on that same corpus at fc28c1d38 ' + '(1195 again at 9b62f54671); and the objectui ' + 'checkout this repo builds against — this is the pin, ' - + '`.objectui-sha` = `9dfaca654311cddd81714153c4f82c241d7cdc54`, re-read from this tree — ' - + 'spells all six metrics def names and both distinctive keys 0 times across 7632 tracked ' - + 'files at that sha, against lit controls window 4193, timeout 1360, period 238, ' - + 'interval 195 and metrics 401 on that same corpus and sha (0 across 7579, against 4175 / ' + + '`.objectui-sha` = `0abd4f9f8769fc4c19ad2f96707684876f74c09f`, re-read from this tree — ' + + 'spells all six metrics def names and both distinctive keys 0 times across 7650 tracked ' + + 'files at that sha, against lit controls window 4194, timeout 1360, period 238, ' + + 'interval 195 and metrics 401 on that same corpus and sha (0 across 7632, against 4193 / ' + + '1360 / 238 / 195 / 401, at 9dfaca654, 0 across 7579, against 4175 / ' + '1351 / 238 / 195 / 374, at 2e818d0b5, 0 across 10267, against 4044 / ' + '1348 / 231 / 196 / 354, at ab1879721, 0 across 10071, against 4002 / ' + '1331 / 231 / 196 / 355, at 89cad75d5, 0 across 9912, against 3916 / ' diff --git a/packages/spec/src/migrations/entries/semantic/18.system-tracing-otel-exporter-durations-unit-in-key.ts b/packages/spec/src/migrations/entries/semantic/18.system-tracing-otel-exporter-durations-unit-in-key.ts index 2b68822c168..a249b70cb38 100644 --- a/packages/spec/src/migrations/entries/semantic/18.system-tracing-otel-exporter-durations-unit-in-key.ts +++ b/packages/spec/src/migrations/entries/semantic/18.system-tracing-otel-exporter-durations-unit-in-key.ts @@ -69,12 +69,13 @@ export const entry: SemanticMigration = { + 'dark control of 0; inside packages/spec the ' + 'only occurrences are tracing.zod.ts, its test, and the generated rows in ' + 'content/docs/references/system/tracing.mdx, which this rename regenerates. And the ' - + 'pinned objectui checkout — `.objectui-sha` = `9dfaca654311cddd81714153c4f82c241d7cdc54` — names none of it: all 37 exports of ' - + 'tracing.zod.ts and each of the four key names occur 0 times across the 7632 files ' + + 'pinned objectui checkout — `.objectui-sha` = `0abd4f9f8769fc4c19ad2f96707684876f74c09f` — names none of it: all 37 exports of ' + + 'tracing.zod.ts and each of the four key names occur 0 times across the 7650 files ' + 'tracked at that sha (the 508 Span and 57 SpanSchema hits are objectui\'s own HTML ' + 'text-span component, TextSpanSchema, an unrelated name, plus colSpan and prose), against ' - + 'two lit controls on that same corpus and sha: 17313 hits for the bare token objectstack, ' - + 'and 7186 for the package specifier @objectstack/spec (at 2e818d0b5: 0 across 7579, Span 505, ' + + 'two lit controls on that same corpus and sha: 17390 hits for the bare token objectstack, ' + + 'and 7209 for the package specifier @objectstack/spec (at 9dfaca654: 0 across 7632, Span 508, ' + + '17313 and 7186; at 2e818d0b5: 0 across 7579, Span 505, ' + '17227 and 7134; at ab1879721: 0 across 10267, Span 491, ' + '16377 and 6665; at 89cad75d5: 0 across 10071, Span 489, ' + '16044 and 6461; at 31971ff1e: 0 across 9912, Span 486, ' diff --git a/packages/spec/src/migrations/entries/semantic/18.tenant-schema-cache-ttl-unit-in-key.ts b/packages/spec/src/migrations/entries/semantic/18.tenant-schema-cache-ttl-unit-in-key.ts index 65ea88b7020..d8221dd533d 100644 --- a/packages/spec/src/migrations/entries/semantic/18.tenant-schema-cache-ttl-unit-in-key.ts +++ b/packages/spec/src/migrations/entries/semantic/18.tenant-schema-cache-ttl-unit-in-key.ts @@ -31,9 +31,9 @@ export const entry: SemanticMigration = { + 'bd25e897dc: no in-repo runtime reads the key — outside `packages/spec/src/system/tenant.zod.ts` ' + 'and its test the only occurrences are the four generated rows in ' + '`content/docs/references/system/tenant.mdx`, which this rename regenerates; and the pinned ' - + 'objectui checkout — `.objectui-sha` = `9dfaca654311cddd81714153c4f82c241d7cdc54` — spells it 0 ' - + 'times across 7632 tracked files, against lit controls `TTL` 182 and `tenant` 1318 on the ' - + 'same corpus (0 across 7579, against 182 and 1317, at 2e818d0b5; 0 across 10267, against 180 and 1238, at ab1879721; 0 across 10071, against 181 and 1237, at 89cad75d5; 0 across 9912, against 181 and 1237, at 31971ff1e; 0 across 9800, against 181 and 1235, at e420df310; 0 across 9546, against 181 and 1200, at db11afd49; 0 across 9283, against 181 and 1185, at dd3f7e1be; 0 across 8512, against 156 and 1034, at f8a9d0fb0; 0 across 8303, against 156 ' + + 'objectui checkout — `.objectui-sha` = `0abd4f9f8769fc4c19ad2f96707684876f74c09f` — spells it 0 ' + + 'times across 7650 tracked files, against lit controls `TTL` 182 and `tenant` 1318 on the ' + + 'same corpus (0 across 7632, against 182 and 1318, at 9dfaca654; 0 across 7579, against 182 and 1317, at 2e818d0b5; 0 across 10267, against 180 and 1238, at ab1879721; 0 across 10071, against 181 and 1237, at 89cad75d5; 0 across 9912, against 181 and 1237, at 31971ff1e; 0 across 9800, against 181 and 1235, at e420df310; 0 across 9546, against 181 and 1200, at db11afd49; 0 across 9283, against 181 and 1185, at dd3f7e1be; 0 across 8512, against 156 and 1034, at f8a9d0fb0; 0 across 8303, against 156 ' + 'and 987, at 62597c588).', acceptanceCriteria: 'Every schema-level tenant isolation source spells `performance.schemaCacheTtlSeconds`; ' diff --git a/packages/spec/src/migrations/registry.ts b/packages/spec/src/migrations/registry.ts index 0a0c1fbdbef..c3a8a07c8d7 100644 --- a/packages/spec/src/migrations/registry.ts +++ b/packages/spec/src/migrations/registry.ts @@ -14283,13 +14283,13 @@ const step18: MigrationStep = { + '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 ' @@ -14494,10 +14494,10 @@ const step18: MigrationStep = { + '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.', @@ -14733,10 +14733,10 @@ const step18: MigrationStep = { + '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: @@ -18499,10 +18499,11 @@ const step18: MigrationStep = { + 'against a lit control of 1195 defineStack occurrences on that same corpus at fc28c1d38 ' + '(1195 again at 9b62f54671); and the objectui ' + 'checkout this repo builds against — this is the pin, ' - + '`.objectui-sha` = `9dfaca654311cddd81714153c4f82c241d7cdc54`, re-read from this tree — ' - + 'spells all six metrics def names and both distinctive keys 0 times across 7632 tracked ' - + 'files at that sha, against lit controls window 4193, timeout 1360, period 238, ' - + 'interval 195 and metrics 401 on that same corpus and sha (0 across 7579, against 4175 / ' + + '`.objectui-sha` = `0abd4f9f8769fc4c19ad2f96707684876f74c09f`, re-read from this tree — ' + + 'spells all six metrics def names and both distinctive keys 0 times across 7650 tracked ' + + 'files at that sha, against lit controls window 4194, timeout 1360, period 238, ' + + 'interval 195 and metrics 401 on that same corpus and sha (0 across 7632, against 4193 / ' + + '1360 / 238 / 195 / 401, at 9dfaca654, 0 across 7579, against 4175 / ' + '1351 / 238 / 195 / 374, at 2e818d0b5, 0 across 10267, against 4044 / ' + '1348 / 231 / 196 / 354, at ab1879721, 0 across 10071, against 4002 / ' + '1331 / 231 / 196 / 355, at 89cad75d5, 0 across 9912, against 3916 / ' @@ -18721,12 +18722,13 @@ const step18: MigrationStep = { + 'dark control of 0; inside packages/spec the ' + 'only occurrences are tracing.zod.ts, its test, and the generated rows in ' + 'content/docs/references/system/tracing.mdx, which this rename regenerates. And the ' - + 'pinned objectui checkout — `.objectui-sha` = `9dfaca654311cddd81714153c4f82c241d7cdc54` — names none of it: all 37 exports of ' - + 'tracing.zod.ts and each of the four key names occur 0 times across the 7632 files ' + + 'pinned objectui checkout — `.objectui-sha` = `0abd4f9f8769fc4c19ad2f96707684876f74c09f` — names none of it: all 37 exports of ' + + 'tracing.zod.ts and each of the four key names occur 0 times across the 7650 files ' + 'tracked at that sha (the 508 Span and 57 SpanSchema hits are objectui\'s own HTML ' + 'text-span component, TextSpanSchema, an unrelated name, plus colSpan and prose), against ' - + 'two lit controls on that same corpus and sha: 17313 hits for the bare token objectstack, ' - + 'and 7186 for the package specifier @objectstack/spec (at 2e818d0b5: 0 across 7579, Span 505, ' + + 'two lit controls on that same corpus and sha: 17390 hits for the bare token objectstack, ' + + 'and 7209 for the package specifier @objectstack/spec (at 9dfaca654: 0 across 7632, Span 508, ' + + '17313 and 7186; at 2e818d0b5: 0 across 7579, Span 505, ' + '17227 and 7134; at ab1879721: 0 across 10267, Span 491, ' + '16377 and 6665; at 89cad75d5: 0 across 10071, Span 489, ' + '16044 and 6461; at 31971ff1e: 0 across 9912, Span 486, ' @@ -18839,9 +18841,9 @@ const step18: MigrationStep = { + 'bd25e897dc: no in-repo runtime reads the key — outside `packages/spec/src/system/tenant.zod.ts` ' + 'and its test the only occurrences are the four generated rows in ' + '`content/docs/references/system/tenant.mdx`, which this rename regenerates; and the pinned ' - + 'objectui checkout — `.objectui-sha` = `9dfaca654311cddd81714153c4f82c241d7cdc54` — spells it 0 ' - + 'times across 7632 tracked files, against lit controls `TTL` 182 and `tenant` 1318 on the ' - + 'same corpus (0 across 7579, against 182 and 1317, at 2e818d0b5; 0 across 10267, against 180 and 1238, at ab1879721; 0 across 10071, against 181 and 1237, at 89cad75d5; 0 across 9912, against 181 and 1237, at 31971ff1e; 0 across 9800, against 181 and 1235, at e420df310; 0 across 9546, against 181 and 1200, at db11afd49; 0 across 9283, against 181 and 1185, at dd3f7e1be; 0 across 8512, against 156 and 1034, at f8a9d0fb0; 0 across 8303, against 156 ' + + 'objectui checkout — `.objectui-sha` = `0abd4f9f8769fc4c19ad2f96707684876f74c09f` — spells it 0 ' + + 'times across 7650 tracked files, against lit controls `TTL` 182 and `tenant` 1318 on the ' + + 'same corpus (0 across 7632, against 182 and 1318, at 9dfaca654; 0 across 7579, against 182 and 1317, at 2e818d0b5; 0 across 10267, against 180 and 1238, at ab1879721; 0 across 10071, against 181 and 1237, at 89cad75d5; 0 across 9912, against 181 and 1237, at 31971ff1e; 0 across 9800, against 181 and 1235, at e420df310; 0 across 9546, against 181 and 1200, at db11afd49; 0 across 9283, against 181 and 1185, at dd3f7e1be; 0 across 8512, against 156 and 1034, at f8a9d0fb0; 0 across 8303, against 156 ' + 'and 987, at 62597c588).', acceptanceCriteria: 'Every schema-level tenant isolation source spells `performance.schemaCacheTtlSeconds`; ' diff --git a/packages/spec/src/ui/action-outcome-messages.test.ts b/packages/spec/src/ui/action-outcome-messages.test.ts index f9f9ab24262..c725bf95ddb 100644 --- a/packages/spec/src/ui/action-outcome-messages.test.ts +++ b/packages/spec/src/ui/action-outcome-messages.test.ts @@ -12,7 +12,10 @@ * runner default) and the `${result.*}` INTERPOLATION are the console's — the * reader is objectstack-ai/objectui#11344, a later link of the same ruling, * carried from the pin this repo builds against (`.objectui-sha` = - * `9dfaca654`; `ActionRunner.composeSuccessMessage`, in + * `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`; `ActionRunner.composeSuccessMessage`, in * `core/src/actions/ActionRunner.ts`, byte-identical to `2e818d0b5`, re-read * 2026-10-05, and to `ab1879721` before it), where the ledger row * turned `live`. Its behaviour is pinned on objectui's side, so the "a handler returning diff --git a/packages/spec/src/ui/action.zod.ts b/packages/spec/src/ui/action.zod.ts index 1aa3c50fdde..38986cbb574 100644 --- a/packages/spec/src/ui/action.zod.ts +++ b/packages/spec/src/ui/action.zod.ts @@ -1364,7 +1364,10 @@ const actionObject = () => strictObject({ * * Liveness: the ledger row was `planned` until the console reader landed, * and it is `live` from the pin this repo builds against (`.objectui-sha` = - * `9dfaca654`, re-read 2026-10-05: `core/src/actions/ActionRunner.ts` is + * `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: `core/src/actions/ActionRunner.ts` is * byte-identical to `2e818d0b5`, re-read there 2026-10-04, and to * `ab1879721`, where it was read 2026-10-03, so the anchor below held * unmoved). The reader is objectui#11344 (objectui diff --git a/packages/spec/src/ui/component.test.ts b/packages/spec/src/ui/component.test.ts index a4eb8775fc3..a06cdbe46ff 100644 --- a/packages/spec/src/ui/component.test.ts +++ b/packages/spec/src/ui/component.test.ts @@ -288,7 +288,10 @@ describe('PageAccordionProps variant (#6776)', () => { // same file's `ComponentRegistry.register('accordion', …)` publishes the key to // the Studio block designer at `:1222` (the `items` input, documented as // `[{ label, icon?, collapsed?, children }]`). Measured at the pin this repo -// builds against — `.objectui-sha` = `9dfaca654`. Re-derived at that pin +// 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-derived at that pin // 2026-10-05: `containers.tsx` changed across the hop from `2e818d0b5` (89 // insertions, 0 deletions: objectui#11619's record picture in the record // chrome — three import lines at the top of the file, and the @@ -434,7 +437,10 @@ describe('PageTabsProps items[].value / items[].count (#5775)', () => { // same file's `ComponentRegistry.register('tabs', …)` publishes the key to the // Studio block designer at `:1007` (the `items` input, documented as // `[{ label, value?, icon?, count?, visibleWhen?, children }]`). Measured at -// the pin this repo builds against — `.objectui-sha` = `9dfaca654`. Re-derived at +// the pin 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-derived at // that pin 2026-10-05: `containers.tsx` changed across the hop from // `2e818d0b5` (89 insertions, 0 deletions: objectui#11619's record picture in // the record chrome — three import lines at the top of the file, and the @@ -3687,7 +3693,10 @@ describe('#7751 — object-* block props schemas', () => { // #16503 — the spec half of objectui#8172 (decision batch #68, 2026-09-07, // option A: the contract declares the capability that already ships, is // documented and is in use). Measured at the objectui pin this repo builds -// against (`.objectui-sha` = `9dfaca654`; re-measured there 2026-10-05 — +// 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-measured there 2026-10-05 — // `plugin-kanban/src/types.ts` and `plugin-kanban.mdx` are byte-identical to // `2e818d0b5` (`git diff --quiet`), so `types.ts` still declares no `limit` // and the mdx still teaches `limit: 250` with its Properties row; the other @@ -3855,7 +3864,10 @@ describe('ObjectKanbanPropsSchema limit — the row cap four objectui faces alre // since retired that block, objectui#8257). Unlike `limit` above — a key four // objectui faces already implemented, so the spec was the half that was wrong // — `quickAdd` was FORWARDED and never read: at the pin this repo builds -// against (`.objectui-sha` = `9dfaca654`; re-measured there 2026-10-05 — +// 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-measured there 2026-10-05 — // `KanbanBoardCore.tsx` and `KanbanImpl.tsx` are byte-identical to `2e818d0b5` // (`git diff --quiet`), so `:78`, `:111-112`, `:624` and `:637` did not move; // `ObjectKanban.tsx` changed above the spread (+35/-5, objectui#8347's private @@ -4017,7 +4029,10 @@ describe('ObjectKanbanPropsSchema quickAdd is retired (#17260)', () => { // #9881 and commit 60e0f900a recorded the accordion and tab items; these two close the set. // // The button record re-measured at the pin this repo builds against — -// `.objectui-sha` = `9dfaca654`, re-derived there 2026-10-05: every objectui +// `.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-derived there 2026-10-05: every objectui // file this record cites (`button.tsx` read as both the `renderers/form` // registration and the `ui` primitive) is byte-identical to `2e818d0b5` // (`git diff --quiet`), so every anchor below holds unmoved. At `2e818d0b5`, @@ -4182,7 +4197,10 @@ describe('ObjectMetricPropsSchema icon liveness (#10053)', () => { // // The acceptance the card names, pinned: each row's KEY SET is the one the // renderer's read points support at the pin this repo builds against -// (`.objectui-sha` = `9dfaca654`; re-measured there 2026-10-05 — +// (`.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-measured there 2026-10-05 — // `ObjectMap.tsx` and `record-source.ts` are byte-identical across the hop off // `2e818d0b5` (`git diff --quiet`), so every anchor in them held unmoved; // `ObjectTree.tsx` +8/-5 and `ObjectGantt.tsx` +4/-3 changed in docblocks only diff --git a/packages/spec/src/ui/component.zod.ts b/packages/spec/src/ui/component.zod.ts index 92fa97f3b69..16dde4fadad 100644 --- a/packages/spec/src/ui/component.zod.ts +++ b/packages/spec/src/ui/component.zod.ts @@ -830,7 +830,10 @@ export const PageTabsProps = strictObject({ * false candidate a component over). * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `9dfaca654`; re-derived at that pin 2026-10-05 — + * (`.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-derived at that pin 2026-10-05 — * `containers.tsx` changed across the hop from `2e818d0b5` (89 insertions, * 0 deletions: objectui#11619's record picture in the record chrome — three * import lines at the top of the file, and the `recordPictureUrl` helpers @@ -1049,7 +1052,10 @@ export const PageCardProps = strictObject({ * declarations identical. * * Each clause is read off the objectui pin this repo builds against - * (`.objectui-sha` = `9dfaca654311`, re-read there 2026-10-05: across the hop + * (`.objectui-sha` = `0abd4f9f8769`, re-read there 2026-10-05: + * every objectui file this record cites is byte-identical across the hop from + * `9dfaca654311` (`git diff --quiet`), so every anchor held unmoved. + * At `9dfaca654311`, re-read there 2026-10-05: across the hop * from `2e818d0b51ec` all four `record-*.tsx` renderers and the three * `permissions` files are byte-identical (`git diff --quiet`), so NO anchor * below moved. At `2e818d0b51ec`, re-read there 2026-10-04: across the hop @@ -2345,7 +2351,10 @@ export const PageAccordionProps = strictObject({ * re-derive the same false candidate). * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `9dfaca654`; re-derived at that pin 2026-10-05 — + * (`.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-derived at that pin 2026-10-05 — * `containers.tsx` changed across the hop from `2e818d0b5` (89 insertions, * 0 deletions: objectui#11619's record picture in the record chrome — three * import lines at the top of the file, and the `recordPictureUrl` helpers @@ -2686,7 +2695,10 @@ export const ElementButtonPropsSchema = lazySchema(() => strictObject({ * the button. * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `9dfaca654`; re-derived at that pin 2026-10-05 — + * (`.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-derived at that pin 2026-10-05 — * `button.tsx` (both the `renderers/form` registration and the `ui` * primitive), `lib/lazy-icon.tsx`, `renderers/action/resolve-icon.ts` and * the generated `lucide-record-icon-names.ts` are all byte-identical to @@ -3169,8 +3181,11 @@ export const ElementTextInputPropsSchema = lazySchema(() => strictObject({ * had no row for — `action:button`, `action:group`, `action:menu`, * `action:icon`, `element:definition-list`, `element:repeater` * (`core/src/registry/public-blocks.ts:117-122` at the pin this repo builds - * against, `.objectui-sha` = `9dfaca654`; first measured at `.objectui-sha` - * pin `f8a9d0fb0`, every read point below re-derived at the current pin + * 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`; first measured at `.objectui-sha` + * pin `f8a9d0fb0`, every read point below re-derived at that pin * 2026-10-05: every objectui file this record cites is byte-identical across * the hop from `2e818d0b5` (`git diff --quiet`), so every anchor held * unmoved. At `2e818d0b5`, 2026-10-04: every objectui file this record cites @@ -4206,7 +4221,11 @@ const GridOperationsSchema = lazySchema(() => strictObject({ * control `schema.editable` in `ObjectGrid.tsx`. It was declared ahead of its * reader on purpose (the BUILD objectui#11068 chose), and its describe carried * the `[EXPERIMENTAL — not enforced]` marker that said so. Re-measured at the - * pin this repo builds against (`.objectui-sha` = `9dfaca654`, 2026-10-05; + * pin this repo builds against (`.objectui-sha` = `0abd4f9f8`, re-read there 2026-10-05: + * `ObjectGrid.tsx` and `data-table.tsx` are byte-identical across the hop from + * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved, and the same + * method still finds 15 hit lines against 3 for the control. + * At `9dfaca654`, 2026-10-05; * `data-table.tsx` is byte-identical across the hop from `2e818d0b5` and * `ObjectGrid.tsx` changed there in three type docblocks only (+9/-6, * objectui#8347), above the read, which MOVED `5458` -> `5461` byte-identical; @@ -4295,7 +4314,10 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({ * same members, and objectui's grid follows this declaration. * * ⚠️ That gap is closed at the pin this repo builds against (`.objectui-sha` - * = `9dfaca654`, re-measured 2026-10-05: `ObjectGrid.tsx` changed across the + * = `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-measured 2026-10-05: `ObjectGrid.tsx` changed across the * hop from `2e818d0b5` in three type docblocks only (+9/-6, objectui#8347), * all above both reads, which MOVED by +3 byte-identical; at `2e818d0b5`, * re-measured 2026-10-04, it was byte-identical @@ -4680,7 +4702,10 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({ * `ComponentPropsMap` key. This record said to drop the marker in the change * that lands the BUILD at the pin, and it is dropped here. * - * Read at the pin this repo builds against (`.objectui-sha` = `9dfaca654`, + * Read at the pin 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-measured 2026-10-05: `data-table.tsx` is byte-identical across the hop * from `2e818d0b5`, so its anchors held unmoved, and `ObjectGrid.tsx` * changed there in three type docblocks only (+9/-6, objectui#8347), above @@ -5075,7 +5100,10 @@ export const ObjectMetricPropsSchema = lazySchema(() => strictObject({ * same record for the metric tile. * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `9dfaca654`; re-derived at that pin 2026-10-05 — + * (`.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-derived at that pin 2026-10-05 — * `ObjectMetricWidget.tsx`, `MetricWidget.tsx`, `MetricCard.tsx` and * `lazy-icon.tsx` are byte-identical to `2e818d0b5` (`git diff --quiet`), so * their anchors hold unmoved; `plugin-dashboard/src/index.tsx` (+37/-2) @@ -5308,7 +5336,10 @@ const ObjectKanbanLaneSchema = lazySchema(() => strictObject({ * DESIGNER's spelling with * zero read points (#7973 class) — aliased to the `groupBy` the board reads. * `limit` (#16503) was measured later, at the pin this repo builds against - * (`.objectui-sha` = `9dfaca654`; re-measured there 2026-10-05 — + * (`.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-measured there 2026-10-05 — * `ObjectKanban.tsx` changed across the hop from `2e818d0b5`, +35/-5 * (objectui#8347: a type import edited in place, and a private * `GateBoundKanbanSchema` read type, a re-worded docblock and a widened @@ -5405,7 +5436,10 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ * Row cap (#16503 — the spec half of objectui#8172; decision batch #68, * 2026-09-07, option A: the contract declares the capability that already * ships, is documented and is in use). Measured at the objectui pin this - * repo builds against (`.objectui-sha` = `9dfaca654`; re-measured there + * 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-measured there * 2026-10-05 — `plugin-kanban/src/types.ts` (still no row-cap member), * `element-data-source.ts` and `plugin-kanban.mdx` are byte-identical to * `2e818d0b5`, so `:268-272` did not move and the `limit` row and the @@ -5643,7 +5677,12 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ * quick-add control and no block a document can name offers one either). * * Measured at the objectui pin this repo builds against - * (`.objectui-sha` = `9dfaca654`; re-measured there 2026-10-05 — + * (`.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, and + * `ObjectKanban.tsx` still names `quickAdd` and `onQuickAdd` 2 times each + * against 11 for `onCardClick`. + * At `9dfaca654`; re-measured there 2026-10-05 — * `KanbanImpl.tsx` and `KanbanBoardCore.tsx` are byte-identical to * `2e818d0b5` (`git diff --quiet`), so `:624`, `:637` and `:78` did not * move; `ObjectKanban.tsx` changed above its spread (+35/-5, objectui#8347's @@ -5813,7 +5852,10 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ * element schemas). * * Measured at the pin this repo builds against (`.objectui-sha` = - * `9dfaca654`; re-measured there 2026-10-05 — `useNavigationOverlay.ts` is + * `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-measured there 2026-10-05 — `useNavigationOverlay.ts` is * byte-identical to `2e818d0b5` (`git diff --quiet`), and `ObjectKanban.tsx` * changed above every anchor here (+35/-5, objectui#8347: a type import * edited in place, a private `GateBoundKanbanSchema` read type — still @@ -6010,7 +6052,10 @@ export const ObjectCalendarPropsSchema = lazySchema(() => strictObject({ * `object-kanban`'s above. * * Measured at the pin this repo builds against (`.objectui-sha` = - * `9dfaca654`; re-measured there 2026-10-05 — `ObjectCalendar.tsx` changed + * `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-measured there 2026-10-05 — `ObjectCalendar.tsx` changed * across the hop from `2e818d0b5` in one comment only, line for line * (`:97-98`, objectui#8347 putting `BaseSchema`'s index signature in the * past tense), and `useNavigationOverlay.ts` is byte-identical, so every @@ -7099,7 +7144,10 @@ const OBJECT_MAP_FLAT_CONFIG_GUIDANCE: readonly KeySetGuidance[] = [ /** * `object-map` (objectui `plugin-map/src/ObjectMap.tsx` plus the registry shell * `plugin-map/src/index.tsx`, read at the pin this repo builds against — - * `.objectui-sha` = `9dfaca654`, re-measured there 2026-10-05: `ObjectMap.tsx` + * `.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-measured there 2026-10-05: `ObjectMap.tsx` * and `core/src/utils/record-source.ts` are byte-identical across the hop from * `2e818d0b5` (`git diff --quiet`), and `index.tsx` changed there in one * docblock only, line for line (`:144-146`, objectui#8347 putting @@ -7273,7 +7321,10 @@ export const ObjectMapPropsSchema = lazySchema(() => strictObject({ * Base query filter — the `ViewFilterRule` ARRAY form, the one filter * orthography every `filter` door in this map shares (ui#6206-B reaching the * `object-*` family: #15449, decision batch #55, option A). Measured at the - * pin this repo builds against (`.objectui-sha` = `9dfaca654`, re-measured + * pin 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-measured * there 2026-10-05: `ObjectMap.tsx` is byte-identical to `2e818d0b5` * (`git diff --quiet`) and `plugin-map/src/index.tsx` changed there in one * docblock only, line for line, below its inputs (`:144-146`, @@ -7329,7 +7380,10 @@ export const ObjectMapPropsSchema = lazySchema(() => strictObject({ * Marker order — the `SortItem` ARRAY form, the one sort orthography every * DECLARED `sort` door on this platform carries (objectui#8221, decision batch * #77, option B). Measured at the pin this repo builds against - * (`.objectui-sha` = `9dfaca654`, re-measured there 2026-10-05 — + * (`.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-measured there 2026-10-05 — * `ObjectMap.tsx` is byte-identical to `2e818d0b5` (`git diff --quiet`) and * `plugin-map/src/index.tsx` changed there in one docblock only, line for * line, below its inputs (`:144-146`, objectui#8347), so both anchors and @@ -7507,7 +7561,10 @@ function objectGanttMarker() { /** * `object-gantt` (objectui `plugin-gantt/src/ObjectGantt.tsx` plus the registry * shell `plugin-gantt/src/index.tsx`, read at the pin this repo builds against - * — `.objectui-sha` = `9dfaca654`, re-measured there 2026-10-05: + * — `.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-measured there 2026-10-05: * `record-source.ts` is byte-identical to `2e818d0b5` (`git diff --quiet`), so * its anchors held unmoved; `plugin-gantt/src/index.tsx` changed there in one * docblock only, line for line, below the `gantt` input (`:215-217`, @@ -7740,7 +7797,10 @@ export type ObjectGanttPropsParsed = z.infer; * they flatten `options.tree` (`ListView.tsx:3770-3789`, `case 'tree'`: the * product carries these keys, the EFFECTIVE `filter` objectui#10250 added, and * NO `tree` key). Both halves re-READ at the - * pin this repo builds against (`.objectui-sha` = `9dfaca654`) on 2026-10-05 — + * pin 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`, on 2026-10-05 — * `plugin-tree/src/index.tsx` and `ListView.tsx` are byte-identical to * `2e818d0b5` (`git diff --quiet`), so `3770-3789` and `:3784` did not move; * `ObjectTree.tsx` changed in two docblocks only (+8/-5, objectui#8347 @@ -7828,7 +7888,10 @@ const OBJECT_TREE_FLAT_CONFIG_GUIDANCE: readonly KeySetGuidance[] = [ /** * `object-tree` (objectui `plugin-tree/src/ObjectTree.tsx` plus the registry * shell `plugin-tree/src/index.tsx`, read at the pin this repo builds against - * — `.objectui-sha` = `9dfaca654`, re-measured there 2026-10-05: + * — `.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-measured there 2026-10-05: * `plugin-tree/src/index.tsx` and `core/src/utils/record-source.ts` are * byte-identical to `2e818d0b5` (`git diff --quiet`), so their anchors held * unmoved; `ObjectTree.tsx` changed in two docblocks only (+8/-5, @@ -7997,7 +8060,12 @@ export const ObjectTreePropsSchema = lazySchema(() => strictObject({ * holds for them because each registers through `ElementDataSourceGate`, * which lowers the spec binding onto `objectName` before the renderer sees * the node. `plugin-tree/src/index.tsx` does NOT: at the pin this repo - * builds against (`.objectui-sha` = `9dfaca654`, re-COUNTED there 2026-10-05 by + * builds against (`.objectui-sha` = `0abd4f9f8`, re-read there 2026-10-05: + * re-COUNTED by the same method, all five `src/index.tsx` shells are + * byte-identical across the hop from `9dfaca654` (`git diff --quiet`) and + * read 0 for the tree, 3 each for `plugin-calendar`, `plugin-gantt` and + * `plugin-grid`, and 4 for `plugin-map`. + * At `9dfaca654`, re-COUNTED there 2026-10-05 by * the same method — 0 for the tree, whose shell is byte-identical across the * hop from `2e818d0b5`, 3 each for `plugin-calendar` (byte-identical), * `plugin-gantt` (one docblock re-worded line for line, objectui#8347) and @@ -8369,7 +8437,10 @@ function objectTimelineItemsFitVariant() { * `object-timeline` (objectui `plugin-timeline/src/ObjectTimeline.tsx`, the * presentational `plugin-timeline/src/renderer.tsx` it composes into, and the * registry shell `plugin-timeline/src/index.tsx` — all read at the pin this - * repo builds against (`.objectui-sha` = `9dfaca654`), re-measured there + * 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-measured there * 2026-10-05: `ObjectTimeline.tsx`, `renderer.tsx` and `index.tsx` are * byte-identical to `2e818d0b5` (`git diff --quiet`), so every anchor held * unmoved. At `2e818d0b5`, re-measured there @@ -8576,7 +8647,10 @@ export const ObjectTimelinePropsSchema = lazySchema(() => strictObject({ * first publishes a refusal for a key the renderer honours. * * Read points at the pin this repo builds against (`.objectui-sha` = - * `9dfaca654`, re-measured there 2026-10-05 — the file and + * `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-measured there 2026-10-05 — the file and * `record-source.ts` are byte-identical across the hop from `2e818d0b5` * (`git diff --quiet`), so every anchor held unmoved; `SchemaRenderer.tsx` * changed (+3/-4, objectui#8347) in two docblocks only, putting the @@ -8864,7 +8938,10 @@ export const ComponentPropsMap = { // set from this map's keys), on the three-part evidence that vocabulary's // string-arm ledger asks of a type admitted without an enum member — all // measured at the pin this repo builds against (`.objectui-sha` = - // `9dfaca654`; re-measured there 2026-10-05: all four files below are + // `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-measured there 2026-10-05: all four files below are // byte-identical to `2e818d0b5` (`git diff --quiet`), so every anchor held // unmoved; at `2e818d0b5`, re-measured 2026-10-04: all four were // byte-identical to `ab1879721` (`git diff --quiet`), so every anchor held @@ -8930,7 +9007,10 @@ export const ComponentPropsMap = { // authority for map and gantt while tree's rung-1 `data` read stayed // undeclared on every face. Key sets measured from the renderers' read // points at the pin this repo builds against (`.objectui-sha` = - // `9dfaca654`), all three re-measured there 2026-10-05 (`ObjectMap.tsx` is + // `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`, all three re-measured there 2026-10-05 (`ObjectMap.tsx` is // byte-identical to `2e818d0b5`; `ObjectTree.tsx` (+8/-5) and // `ObjectGantt.tsx` (+4/-3) changed in docblocks only, objectui#8347 putting // `BaseSchema`'s index signature in the past tense, so their anchors MOVED @@ -8989,7 +9069,10 @@ export const ComponentPropsMap = { // it — so `object-timeline` was unjudged in both directions, a real key and // a typo riding through alike. Key set measured from the renderer's read // points at the pin this repo builds against (`.objectui-sha` = - // `9dfaca654`), re-measured there 2026-10-05 (`renderer.tsx`, + // `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-measured there 2026-10-05 (`renderer.tsx`, // `ObjectTimeline.tsx` and `index.tsx` byte-identical to `2e818d0b5`, so // every anchor held unmoved and no declared key set moved; at `2e818d0b5`, // 2026-10-04, `renderer.tsx`, diff --git a/packages/spec/src/ui/dataset.zod.ts b/packages/spec/src/ui/dataset.zod.ts index 4fa238c0cdf..0e918f381e3 100644 --- a/packages/spec/src/ui/dataset.zod.ts +++ b/packages/spec/src/ui/dataset.zod.ts @@ -283,7 +283,10 @@ export const DatasetMeasureSchema = lazySchema(() => strictObject({ * and this docblock and the `describe` beneath it both said so. * * Measured at the pin this repo builds against (`.objectui-sha` = - * `9dfaca654`; re-derived at that pin 2026-10-05 — `date-display.ts` and + * `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-derived at that pin 2026-10-05 — `date-display.ts` and * `dataset-format.ts` are byte-identical to `2e818d0b5` (`git diff --quiet`), * so every anchor held unmoved. At `2e818d0b5`, re-derived there * 2026-10-04 — `date-display.ts` and diff --git a/packages/spec/src/ui/view.zod.ts b/packages/spec/src/ui/view.zod.ts index beffd501c4d..ea90284bb05 100644 --- a/packages/spec/src/ui/view.zod.ts +++ b/packages/spec/src/ui/view.zod.ts @@ -3279,7 +3279,10 @@ const FormFieldBaseSchema = lazySchema(() => { * inside the `53ded82bf7...87af769e9` range, so the widest-tier-only * under-span this block used to record (#17328: one cell of two at * 720px) no longer reproduces at the pin this repo builds against - * (`.objectui-sha` = `9dfaca654`, re-read 2026-10-05: `autoLayout.ts`, + * (`.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: `autoLayout.ts`, * `fields`' `field-type-alias.ts` and `form.tsx` are byte-identical to * `2e818d0b5` (`git diff --quiet`), so every anchor held unmoved; at * `2e818d0b5`, re-read 2026-10-04: `autoLayout.ts` and @@ -3331,7 +3334,7 @@ const FormFieldBaseSchema = lazySchema(() => { * had changed only in its registration's input list, objectui#9910's * `children` slot; at `62597c588` it was byte-identical to `87af769e9`). */ - span: z.enum(['auto', 'full']).default('auto').describe("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: z.enum(['auto', 'full']).default('auto').describe("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."), /** Custom widget override — only needed when auto-inference is insufficient */ widget: z.string().optional().describe('Custom widget/component name (overrides type-based inference)'), diff --git a/scripts/sdui-manifest.record.json b/scripts/sdui-manifest.record.json index acae3ef53a4..61ffca722b2 100644 --- a/scripts/sdui-manifest.record.json +++ b/scripts/sdui-manifest.record.json @@ -11,12 +11,12 @@ "a pin bump without regeneration goes RED there — that is the anti-rot half of the freshness gate.", "Regenerate + re-record: pnpm objectui:build && node scripts/gen-sdui-manifest-node.mjs" ], - "objectuiSha": "9dfaca654311cddd81714153c4f82c241d7cdc54", + "objectuiSha": "0abd4f9f8769fc4c19ad2f96707684876f74c09f", "source": "built-tree", - "modulesRoot": ".cache/objectui-9dfaca654311/apps/console", + "modulesRoot": ".cache/objectui-0abd4f9f8769/apps/console", "objectuiWorkspaceVersion": "17.7.0", "generator": "scripts/gen-sdui-manifest-node.mjs", "generatedAt": "2026-10-05", - "sha256": "6f921896ffac747cc7ec523102369060d570290e2c9ae84aae9898bc895eacd2", + "sha256": "f95d406a584eb89c3a31e502556d2dcf7bd3c9f12be6d5455b40112e072bebc7", "components": 107 } diff --git a/sdui.manifest.json b/sdui.manifest.json index db3b5c7b76b..4b3d7837d26 100644 --- a/sdui.manifest.json +++ b/sdui.manifest.json @@ -569,7 +569,9 @@ { "name": "details", "type": "array", - "required": true + "of": "object", + "required": true, + "description": "The child collections, one OBJECT per entry, judged by the spec's closed `details` entry: `childObject` (required) names the child object; `relationshipField` is the FK on the child back to the parent, derived from the child's metadata when omitted; `columns` are the line grid's columns as the spec's inline grid column objects (`{ name, … }`, never a bare field name), derived from the child's fields when omitted; `formFields` names the per-row form's fields; `inlineMode` is `grid` (editable cells) or `form` (list + per-row form); `amountField` is the CHILD column summed and `totalField` the PARENT field that sum is saved to; `title`, `minRows`, `maxRows` and `addLabel` dress the section and its grid. An undeclared member key is refused by name. The entry's `sortField` is read by nothing here — the line-position field is derived from the child object (objectui#11070) — and objectstack retires the key on its `main` (objectstack-ai/objectstack#21589, after 17.6.0)." }, { "name": "recordId",