From c53f72845478733f084c6208608b0860d0a8c73f Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 5 Oct 2026 00:53:50 +0000 Subject: [PATCH 1/8] chore(objectui): bump the console pin to 9dfaca654311 Written by scripts/bump-objectui.sh 9dfaca654311cddd81714153c4f82c241d7cdc54 --no-commit. objectui@9dfaca654311cddd81714153c4f82c241d7cdc54 Claude-Session: https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn Co-authored-by: Claude --- .changeset/console-9dfaca654311.md | 38 ++++++++++++++++++++++++++++++ .objectui-sha | 2 +- 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 .changeset/console-9dfaca654311.md diff --git a/.changeset/console-9dfaca654311.md b/.changeset/console-9dfaca654311.md new file mode 100644 index 00000000000..f0e5b1e0f59 --- /dev/null +++ b/.changeset/console-9dfaca654311.md @@ -0,0 +1,38 @@ +--- +"@objectstack/console": minor +--- + +Console (objectui) refreshed to `9dfaca654311`. Frontend changes in this range: + +Derived from the changesets objectui declared over the range — 24 releasing of 24 changesets added across 17 non-merge commits. + +- **minor** — **BREAKING** — The default (`simple`) `object-form` draws a self-describing inline section entry, as the `tabbed`, `wizard`, `split`, `drawer` and `modal` forms already did (objectui#11615). Bef… (objectui `9dfaca654`) +- **minor** — The `record:related_list` registration no longer declares `columns` required, so the page compile accepts a related list that lists no columns of its own (objectui#11613). (objectui `4c127cdef`) +- **minor** — The record page header draws the record's picture beside its title, from the field the object names in its object-level `imageField` (`@objectstack/spec` 17.6.0, objectstack#21182… (objectui `c096f0327`) +- **minor** — **BREAKING** — A form view's `subforms[].columns` entry is judged by `@objectstack/spec`'s `InlineGridColumnSchema` now, by reference, so `objectui validate` and `os validate` give one verdict o… (objectui `9db9ff3f9`) +- **minor** — **BREAKING — `PartialSchema` is RETIRED from `@object-ui/types`** (objectui#11608, enforce-or-remove). The utility type leaves the `.` entry, the one entry that published it, w… (objectui `8b14aecbd`) +- **minor** — **BREAKING** — The `grid` field's eight field-level keys are camelCase now, and their snake_case spellings are retired and refused by name on every face (objectui#11610). (objectui `2abec3a96`) +- **minor** — **`BaseSchema` no longer declares `[key: string]: any`** (objectui#8347, executing the objectui#7927 ruling: the TypeScript face is a contract). Every node type extends `BaseSchem… (objectui `b403bb36f`) +- **minor** — All ten locale packs gain `view.noObject`, the hint an object-bound block shows when its node names its object in neither place (objectui#11605). (objectui `fd060f076`) +- **minor** — The `object-chart` and `view:chart` registrations no longer declare `objectName` required, so the page compile accepts a node whose `dataSource` binding names the object, and a ch… (objectui `fd060f076`) +- **minor** — The `object-metric` and `object-pivot` registrations no longer declare `objectName` required, so the page compile accepts a node whose `dataSource` binding names the object, and a… (objectui `fd060f076`) +- **minor** — The `object-form`, `view:form`, `embeddable-form` and `object-master-detail-form` registrations no longer declare `objectName` required, so the page compile accepts a node whose `… (objectui `fd060f076`) +- **minor** — The `object-grid` and `view:grid` registrations no longer declare `objectName` required, so the page compile accepts a node whose `dataSource` binding names the object (objectui#1… (objectui `fd060f076`) +- **minor** — The `object-kanban` registration no longer declares `objectName` required, so the page compile accepts a board whose `dataSource` binding names the object, and a board that names… (objectui `fd060f076`) +- **minor** — The `list-view` and `view:list` registrations no longer declare `objectName` required, so the page compile accepts a node whose `dataSource` binding names the object, and a list t… (objectui `fd060f076`) +- **minor** — `ElementDataSourceGate` takes a `requiresObject` prop: when a placement opts in and its node names its object in neither place, the gate renders a short "no object named" hint ins… (objectui `fd060f076`) +- **minor** — A Studio form field that declares the `ref:dataset` widget now renders a dataset picker instead of the JSON editor fallback (objectui#11601). (objectui `b508ac50d`) +- **minor** — The console asks `GET /api/v1/usage/storage` only when the runtime serves it (objectui#11002). On a self-hosted or open-source runtime, an environment admin's console used to requ… (objectui `d2e859936`) +- **minor** — The `record:line_items` registration no longer declares `childObject` required, so the page compile accepts a node whose `dataSource` binding names the child object (objectui#1156… (objectui `902ebab63`) +- **patch** — `deriveColumns`, the default columns of a master-detail inline grid whose author listed none, now takes which columns it draws, their order and which of them are `defaultHidden` f… (objectui `15f67025b`) +- **patch** — An object page's view tab, and the breadcrumb that names the open view, draw the label of a view the object document embeds as the server served it (objectui#11336). (objectui `6e9090c26`) +- **patch** — The docs portal's book sidebar now shows what the book resolver answers, with nothing narrowing the docs in front of it (objectui#11340, ADR-0046 §6.4). The resolver decides book… (objectui `7c9a6b194`) +- **patch** — Studio's "Organization flows" page no longer says its drafts publish atomically, and a deep link to a flow that is not on the page no longer says no metadata designers are registe… (objectui `b92329c89`) +- **patch** — On a read-only package, a click on a flow canvas node in Studio Automations selects the node and opens its inspector read-only again (objectui#11546). (objectui `278d2444e`) +- **patch** — fix(plugin-detail): `record:details` read mode shows a `textarea` value with its line breaks (objectui#11577) (objectui `b61c116b2`) + +⚠️ 4 of these carry a breaking change: 4 by the author's own breaking annotation in the changeset body — objectui declares no `major` inside a launch window (`scripts/check-changeset-no-major.mjs`). Each is marked **BREAKING** in the list above — read them before compiling the release record. + + + +objectui range: `2e818d0b51ec...9dfaca654311` diff --git a/.objectui-sha b/.objectui-sha index 2986d77d7f1..a3875b05fe6 100644 --- a/.objectui-sha +++ b/.objectui-sha @@ -1 +1 @@ -2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6 +9dfaca654311cddd81714153c4f82c241d7cdc54 From 1b849a74e0e39a66e198ea97df1687122d0fdd58 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 5 Oct 2026 00:58:21 +0000 Subject: [PATCH 2/8] fix(spec): re-take the six migration entries' objectui corpus counts at pin 9dfaca654311 Claude-Session: https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn Co-authored-by: Claude --- ...ck-and-hot-reload-durations-unit-in-key.ts | 6 +-- ...rnel-runtime-config-timeout-unit-in-key.ts | 6 +-- .../18.logging-durations-unit-in-key.ts | 6 +-- ...tem-metrics-jsdoc-durations-unit-in-key.ts | 9 ++-- ...ing-otel-exporter-durations-unit-in-key.ts | 11 ++--- .../18.tenant-schema-cache-ttl-unit-in-key.ts | 6 +-- packages/spec/src/migrations/registry.ts | 44 ++++++++++--------- 7 files changed, 46 insertions(+), 42 deletions(-) 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 93df61c9aee..0a9c5d47c09 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` = `2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6` — names ' + + 'against, `.objectui-sha` = `9dfaca654311cddd81714153c4f82c241d7cdc54` — 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 7579 tracked files (0 across 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 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 ' + '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 and to 17227 and 7134 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 and to 17313 and 7186 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 9aec71ff7f5..22ba6ec08a1 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` = `2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6`, re-read from this tree — ' + + '`.objectui-sha` = `9dfaca654311cddd81714153c4f82c241d7cdc54`, re-read from this tree — ' + 'spells resourceLimits.timeout 0 times across ' - + '7579 tracked files, against lit controls timeout 1351, RuntimeConfig 276 and resourceLimits ' - + '2 on the same corpus (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 ' + + '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 ' + '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 326d526fdc1..02e7223c8c9 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` = `2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6` — spells ' + + 'objectui checkout — `.objectui-sha` = `9dfaca654311cddd81714153c4f82c241d7cdc54` — spells ' + '`flushInterval` 0 times, `initialDelay` 0, `HttpDestinationConfig` 0 and `LoggingConfig` 0 ' - + 'across its 7579 tracked files, against lit controls `useState` 2477 and `timeout` 1351 on ' - + 'the same corpus (all four 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 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, ' + '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 85e706e0052..063e1957fda 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` = `2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6`, re-read from this tree — ' - + 'spells all six metrics def names and both distinctive keys 0 times across 7579 tracked ' - + 'files at that sha, against lit controls window 4175, timeout 1351, period 238, ' - + 'interval 195 and metrics 374 on that same corpus and sha (0 across 10267, against 4044 / ' + + '`.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 / ' + + '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 / ' + '1303 / 234 / 196 / 354, at 31971ff1e, 0 across 9800, against 3873 / ' 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 70f9b789b66..2b68822c168 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` = `2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6` — names none of it: all 37 exports of ' - + 'tracing.zod.ts and each of the four key names occur 0 times across the 7579 files ' - + 'tracked at that sha (the 505 Span and 57 SpanSchema hits are objectui\'s own HTML ' + + '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 ' + + '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: 17227 hits for the bare token objectstack, ' - + 'and 7134 for the package specifier @objectstack/spec (at ab1879721: 0 across 10267, Span 491, ' + + '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, ' + + '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, ' + '15691 and 6206; at e420df310: 0 across 9800, 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 28889d2c1b2..65ea88b7020 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` = `2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6` — spells it 0 ' - + 'times across 7579 tracked files, against lit controls `TTL` 182 and `tenant` 1317 on the ' - + 'same corpus (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` = `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 ' + '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 8c1e4c792cc..0a0c1fbdbef 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` = `2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6` — names ' + + 'against, `.objectui-sha` = `9dfaca654311cddd81714153c4f82c241d7cdc54` — 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 7579 tracked files (0 across 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 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 ' + '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 and to 17227 and 7134 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 and to 17313 and 7186 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` = `2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6`, re-read from this tree — ' + + '`.objectui-sha` = `9dfaca654311cddd81714153c4f82c241d7cdc54`, re-read from this tree — ' + 'spells resourceLimits.timeout 0 times across ' - + '7579 tracked files, against lit controls timeout 1351, RuntimeConfig 276 and resourceLimits ' - + '2 on the same corpus (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 ' + + '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 ' + '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` = `2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6` — spells ' + + 'objectui checkout — `.objectui-sha` = `9dfaca654311cddd81714153c4f82c241d7cdc54` — spells ' + '`flushInterval` 0 times, `initialDelay` 0, `HttpDestinationConfig` 0 and `LoggingConfig` 0 ' - + 'across its 7579 tracked files, against lit controls `useState` 2477 and `timeout` 1351 on ' - + 'the same corpus (all four 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 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, ' + '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` = `2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6`, re-read from this tree — ' - + 'spells all six metrics def names and both distinctive keys 0 times across 7579 tracked ' - + 'files at that sha, against lit controls window 4175, timeout 1351, period 238, ' - + 'interval 195 and metrics 374 on that same corpus and sha (0 across 10267, against 4044 / ' + + '`.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 / ' + + '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 / ' + '1303 / 234 / 196 / 354, at 31971ff1e, 0 across 9800, against 3873 / ' @@ -18720,12 +18721,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` = `2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6` — names none of it: all 37 exports of ' - + 'tracing.zod.ts and each of the four key names occur 0 times across the 7579 files ' - + 'tracked at that sha (the 505 Span and 57 SpanSchema hits are objectui\'s own HTML ' + + '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 ' + + '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: 17227 hits for the bare token objectstack, ' - + 'and 7134 for the package specifier @objectstack/spec (at ab1879721: 0 across 10267, Span 491, ' + + '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, ' + + '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, ' + '15691 and 6206; at e420df310: 0 across 9800, Span 486, ' @@ -18837,9 +18839,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` = `2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6` — spells it 0 ' - + 'times across 7579 tracked files, against lit controls `TTL` 182 and `tenant` 1317 on the ' - + 'same corpus (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` = `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 ' + 'and 987, at 62597c588).', acceptanceCriteria: 'Every schema-level tenant isolation source spells `performance.schemaCacheTtlSeconds`; ' From 56e1416ca295b2ba27bcef1b0cd409544fe2694a Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 5 Oct 2026 01:06:08 +0000 Subject: [PATCH 3/8] chore(objectui): regenerate the SDUI manifest at pin 9dfaca654311 and re-measure pin citations (part) Claude-Session: https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn Co-authored-by: Claude --- .../api-methods-batch-conformance.test.ts | 13 +- .../src/kernel/functional-completeness.ts | 34 +++- .../src/ui/action-outcome-messages.test.ts | 5 +- packages/spec/src/ui/action.zod.ts | 7 +- packages/spec/src/ui/component.test.ts | 83 ++++++-- packages/spec/src/ui/component.zod.ts | 182 ++++++++++++++---- scripts/sdui-manifest.record.json | 8 +- sdui.manifest.json | 25 ++- 8 files changed, 269 insertions(+), 88 deletions(-) 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 ccb6593e846..20997669357 100644 --- a/packages/spec/src/data/api-methods-batch-conformance.test.ts +++ b/packages/spec/src/data/api-methods-batch-conformance.test.ts @@ -61,8 +61,17 @@ 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` = `2e818d0b5`, `packages/plugin-grid`; re-measured at - // that pin, 2026-10-04: `ObjectGrid.tsx` and `hooks/useBulkExecutor.ts` are + // (`.objectui-sha` = `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 + // above the selection block, which only MOVED by +3: + // `ObjectGrid.tsx:4813-4840` here (`4810-4837` at `2e818d0b5`), still + // hashing to `c88443302d40c2db739ddb235470bafa29056e2e` (hash-object of the + // block), re-READ with the same reading below; `hooks/useBulkExecutor.ts` is + // byte-identical to `2e818d0b5` and its `:298-303` still hashes to + // `01083348330f10a201cdf1078b4c21c236402b6a`. At `2e818d0b5`, 2026-10-04: + // `ObjectGrid.tsx` and `hooks/useBulkExecutor.ts` are // byte-identical across the hop off `ab1879721` (`git diff --quiet`), so // every anchor held unmoved. Re-measured at `ab1879721`, 2026-10-03. On the // hop off `89cad75d5`, `ObjectGrid.tsx` changed diff --git a/packages/spec/src/kernel/functional-completeness.ts b/packages/spec/src/kernel/functional-completeness.ts index 05b9710ae11..067c25057dd 100644 --- a/packages/spec/src/kernel/functional-completeness.ts +++ b/packages/spec/src/kernel/functional-completeness.ts @@ -287,7 +287,15 @@ 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` = `2e818d0b5`, re-read 2026-10-04: `ObjectCalendar.tsx` + * (`.objectui-sha` = `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)` + * arm `:1296` and its `tt(…)` lines `:1303-1304` did not move and are + * byte-identical; `ListView.tsx` is byte-identical (`git diff --quiet`); + * and the `en` / `zh` / `de` packs changed (objectui#11605's + * `view.noObject`) but not their `calendar.configRequired` strings. At + * `2e818d0b5`, re-read 2026-10-04: `ObjectCalendar.tsx` * and `ListView.tsx` are byte-identical across the hop off `ab1879721` * (`git diff --quiet`), so every anchor held unmoved; re-read at * `ab1879721` 2026-10-03: on the hop off @@ -347,8 +355,14 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] { * This repo already records the same deletion one door over: the #13817 * check in `../ui/view.zod.ts` names objectui#7029 as its runtime half. * - `gantt` → NO fallback, and no silence [#19630]. Measured at the pin - * this repo builds against (`.objectui-sha` = `2e818d0b5`, re-read - * 2026-10-04: `ObjectGantt.tsx` and `ListView.tsx` are byte-identical across + * this repo builds against (`.objectui-sha` = `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 + * `getGanttConfig` and the refusal arm, which are byte-identical and moved + * `:609` → `:610` and `:2306` → `:2307`, and `ListView.tsx` is + * byte-identical; re-read at `2e818d0b5` 2026-10-04: `ObjectGantt.tsx` and + * `ListView.tsx` are byte-identical across * the hop off `ab1879721`, so every anchor held unmoved; re-read at * `ab1879721` 2026-10-03; on the hop off `89cad75d5` `ObjectGantt.tsx` changed (8 * insertions, 0 deletions: one import line and objectui#11475's storage @@ -403,8 +417,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` = - * `2e818d0b5`; `ObjectTimeline.tsx` and `ListView.tsx` are byte-identical - * across the hop off `ab1879721`, so every anchor held unmoved; on the hop + * `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 * off `89cad75d5` `ObjectTimeline.tsx` is * byte-identical, so the start-date chain `:574-576` and the refusal arm * `:911` did not move, and `ListView.tsx`'s `case 'timeline'` and @@ -451,9 +467,11 @@ 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` = `2e818d0b5`; `ObjectMap.tsx` and `ListView.tsx` - * are byte-identical across the hop off `ab1879721`, so every anchor held - * unmoved; on the hop off `89cad75d5` + * pin (`.objectui-sha` = `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 + * unmoved there; on the hop off `89cad75d5` * `ObjectMap.tsx` is byte-identical, so `getMapConfig` `:387`, * `hasCoordinateBinding` `:493` and the refusal arm `:1291` did not move, * and `ListView.tsx`'s `case 'map'` is byte-identical, moved by 14, with diff --git a/packages/spec/src/ui/action-outcome-messages.test.ts b/packages/spec/src/ui/action-outcome-messages.test.ts index c188d12b5c8..f9f9ab24262 100644 --- a/packages/spec/src/ui/action-outcome-messages.test.ts +++ b/packages/spec/src/ui/action-outcome-messages.test.ts @@ -12,8 +12,9 @@ * 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` = - * `2e818d0b5`; `ActionRunner.composeSuccessMessage`, in - * `core/src/actions/ActionRunner.ts`, byte-identical to `ab1879721`), where the ledger row + * `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 * `{ outcome: 'archived', … }` resolves to the archived copy, interpolated" * acceptance splits in two. HERE: the key is accepted on exactly the two types diff --git a/packages/spec/src/ui/action.zod.ts b/packages/spec/src/ui/action.zod.ts index d6b0a4cbbb2..1aa3c50fdde 100644 --- a/packages/spec/src/ui/action.zod.ts +++ b/packages/spec/src/ui/action.zod.ts @@ -1364,9 +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` = - * `2e818d0b5`, re-read 2026-10-04: `core/src/actions/ActionRunner.ts` is - * byte-identical to `ab1879721`, where it was read 2026-10-03, so the anchor - * below held unmoved). The reader is objectui#11344 (objectui + * `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 * `c476be0e0`): `ActionRunner.composeSuccessMessage` * (`core/src/actions/ActionRunner.ts:1497`) picks `outcomeMessages[outcome]` * off the handler's return value, falls back to `successMessage` and then to diff --git a/packages/spec/src/ui/component.test.ts b/packages/spec/src/ui/component.test.ts index 7f696e05136..a4eb8775fc3 100644 --- a/packages/spec/src/ui/component.test.ts +++ b/packages/spec/src/ui/component.test.ts @@ -284,11 +284,20 @@ describe('PageAccordionProps variant (#6776)', () => { // sweep once read as declared-but-unenforced. It has a live cross-repo consumer: // objectui's `PageAccordionRenderer` renders `{item.icon && }` inside the `AccordionTrigger` -// (`packages/components/src/renderers/layout/containers.tsx:1170-1176`), and the +// (`packages/components/src/renderers/layout/containers.tsx:1173-1179`), and the // same file's `ComponentRegistry.register('accordion', …)` publishes the key to -// the Studio block designer at `:1219` (the `items` input, documented as +// 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` = `2e818d0b5`. Re-derived at that pin +// builds against — `.objectui-sha` = `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 and the `page:header` picture read below both +// anchors), so both anchors were re-READ rather than carried, and BOTH MOVED +// down three lines with their text byte-identical: the icon block +// `1170-1176` -> `1173-1179`, still inside `PageAccordionRenderer`'s +// `AccordionTrigger`, and the input `1219` -> `1222`, still inside the +// `register('accordion', …)` inputs. At `2e818d0b5`, re-derived there // 2026-10-04: every objectui file this record cites is byte-identical across // the hop from `ab1879721` (`git diff --quiet`), so every anchor held unmoved. // At `ab1879721`, re-derived there 2026-10-03: `containers.tsx` changed @@ -421,12 +430,20 @@ describe('PageTabsProps items[].value / items[].count (#5775)', () => { // same bare declaration a liveness sweep reads as declared-but-unenforced. // objectui's `PageTabsRenderer` renders `{item.icon && }` inside the `TabsTrigger` -// (`packages/components/src/renderers/layout/containers.tsx:945-951`), and the +// (`packages/components/src/renderers/layout/containers.tsx:948-954`), and the // same file's `ComponentRegistry.register('tabs', …)` publishes the key to the -// Studio block designer at `:1004` (the `items` input, documented as +// 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` = `2e818d0b5`. Re-derived at -// that pin 2026-10-04: every objectui file this record cites is byte-identical +// the pin this repo builds against — `.objectui-sha` = `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 and the `page:header` picture read below both +// anchors), so both anchors were re-READ rather than carried, and BOTH MOVED +// down three lines with their text byte-identical: the icon block `945-951` +// -> `948-954`, still inside `PageTabsRenderer`'s `TabsTrigger`, and the +// input `1004` -> `1007`, still inside the `register('tabs', …)` inputs. At +// `2e818d0b5`, re-derived there 2026-10-04: every objectui file this record cites is byte-identical // across the hop from `ab1879721` (`git diff --quiet`), so every anchor held // unmoved. At `ab1879721`, re-derived there 2026-10-03: `containers.tsx` // changed across the hop from `89cad75d5` @@ -3670,7 +3687,23 @@ 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` = `2e818d0b5`; re-measured there 2026-10-04 — +// against (`.objectui-sha` = `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 +// three files changed, so their anchors were re-READ, and each held or MOVED +// with its text byte-identical. `ObjectKanban.tsx` (+35/-5, objectui#8347) +// edited its type import in place (`:10`) and, below `:97` and above the +// fetch, added a private `GateBoundKanbanSchema` read type, a re-worded +// docblock and a widened `schema` binding, so the constant did not move and +// the query line MOVED `722` -> `752`; `plugin-kanban/src/index.tsx` (+34/-3) gained one +// docblock line above the mapping (objectui#8347) and objectui#11605's +// `requiresObject` gate and non-required `objectName` input below it, so +// `OBJECT_KANBAN_DATA_SOURCE` MOVED `487-491` -> `488-492`, still mapping +// `limit: 'limit'`; `objectql.ts` (+85/-45: objectui#11615's section-entry +// arm, objectui#11266's `InlineGridColumn` columns and objectui#8347 among +// them) MOVED the member `4720` -> `4754`, still inside +// `ObjectKanbanSchema`. At `2e818d0b5`, re-measured there 2026-10-04 — // `plugin-kanban/src/types.ts`, `ObjectKanban.tsx` and // `plugin-kanban/src/index.tsx` are byte-identical to `ab1879721` // (`git diff --quiet`), so `types.ts` still declares no `limit` and `:722` / @@ -3752,15 +3785,15 @@ describe('#7751 — object-* block props schemas', () => { // `limit?: number` member moved `3735` -> `3832`. All five files were // byte-identical across the hop onto `62597c588`, and were last re-READ at // `87af769e9` 2026-09-20, the hop that moved every anchor and renamed one -// face outright): `plugin-kanban/src/ObjectKanban.tsx:722` +// face outright): `plugin-kanban/src/ObjectKanban.tsx:752` // queries `$top: resolveRowLimit(schema.limit, DEFAULT_KANBAN_FETCH_BATCH_SIZE)` // (100, `:97`; the bare `??` became `resolveRowLimit` in objectui#9925, which drops // and reports a cap the contract refuses), -// `plugin-kanban/src/index.tsx:487-491` maps `limit: 'limit'` in +// `plugin-kanban/src/index.tsx:488-492` maps `limit: 'limit'` in // `OBJECT_KANBAN_DATA_SOURCE`, ⚠️ `KanbanSchema` is RETIRED at this pin and // `plugin-kanban/src/types.ts` declares the member no more — the published // twin is `ObjectKanbanSchema`, declaring `limit?: number` at -// `packages/types/src/objectql.ts:4720` — and `content/docs/plugins/plugin-kanban.mdx` +// `packages/types/src/objectql.ts:4754` — and `content/docs/plugins/plugin-kanban.mdx` // teaches `limit: 250` with a Properties row. The strict map refused the key by // name — the same `unrecognized_keys` verdict as the `bogusProp` control — so an // author following the published docs wrote a node the save gate rejected. @@ -3822,7 +3855,14 @@ 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` = `2e818d0b5`; re-measured there 2026-10-04 — +// against (`.objectui-sha` = `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 +// `GateBoundKanbanSchema` read type and widened `schema` binding), which MOVED +// `1639` -> `1669` with its line byte-identical, still the `schema` bag handed +// to `KanbanBoardCore`; and the counts re-read the same, 2 / 2 / 11. At +// `2e818d0b5`, re-measured there 2026-10-04 — // every objectui file this record cites is byte-identical across the hop from // `ab1879721` (`git diff --quiet`), so every anchor held unmoved. At // `ab1879721`, re-measured there 2026-10-03 — @@ -3872,7 +3912,7 @@ describe('ObjectKanbanPropsSchema limit — the row cap four objectui faces alre // below it, not the spread; at `f8a9d0fb0` (2026-09-24) it // had MOVED `1563` -> `1578` the same way (objectui#10068's `$orderby`); both // files were byte-identical across the hop onto `62597c588`, and every anchor -// was re-READ at `87af769e9` 2026-09-20) `ObjectKanban.tsx:1639` +// was re-READ at `87af769e9` 2026-09-20) `ObjectKanban.tsx:1669` // spreads the // authored bag into `KanbanBoardCore` (into `KanbanRenderer` until // objectui#11234, which reads the pair off it no more) and `KanbanImpl` gates the affordance on @@ -3977,7 +4017,11 @@ 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` = `2e818d0b5`, re-derived there 2026-10-04: every objectui +// `.objectui-sha` = `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`, +// re-derived there 2026-10-04: every objectui // file this record cites is byte-identical to `ab1879721` (`git diff --quiet`), // so every anchor below holds unmoved. At `ab1879721`, re-derived there // 2026-10-03: `button.tsx`, @@ -4138,7 +4182,16 @@ 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` = `2e818d0b5`; re-measured there 2026-10-04 — +// (`.objectui-sha` = `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 +// (objectui#8347 putting `BaseSchema`'s index signature in the past tense), so +// the tree's rung-1 call `resolveRecordSourceConfig(schema, 'view-data')` +// MOVED `:634` -> `:637`, its shorthand read `(rest as any).data` `:865` -> +// `:868` and its `schema.navigation` read `:1054` -> `:1057`, each +// byte-identical, and the set of `schema.*` keys each renderer reads is the +// same at both pins. At `2e818d0b5`, re-measured there 2026-10-04 — // `ObjectMap.tsx`, `ObjectTree.tsx`, `ObjectGantt.tsx` and `record-source.ts` // are byte-identical across the hop off `ab1879721` (`git diff --quiet`), so // every anchor in them held unmoved. At `ab1879721`, re-measured there diff --git a/packages/spec/src/ui/component.zod.ts b/packages/spec/src/ui/component.zod.ts index b4dcaf34d2f..df23d850103 100644 --- a/packages/spec/src/ui/component.zod.ts +++ b/packages/spec/src/ui/component.zod.ts @@ -830,7 +830,15 @@ export const PageTabsProps = strictObject({ * false candidate a component over). * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `2e818d0b5`; re-derived at that pin 2026-10-04 — + * (`.objectui-sha` = `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 + * and the `page:header` picture read below both anchors), so both anchors + * were re-READ rather than carried, and BOTH MOVED down three lines with + * their text byte-identical: the icon block `945-951` -> `948-954` and the input + * `1004` -> `1007`; `lib/lazy-icon.tsx` is byte-identical. At `2e818d0b5`, + * re-derived there 2026-10-04 — * every objectui file this record cites is byte-identical across the hop * from `ab1879721` (`git diff --quiet`), so both anchors held unmoved. At * `ab1879721`, re-derived there 2026-10-03, `containers.tsx` changed @@ -874,12 +882,12 @@ export const PageTabsProps = strictObject({ * lines byte-identical and the registration input `789` -> `912` with its * LINE rewritten — it declares `of: 'object'` and carries a longer * description — while the member list this record cites stayed - * unchanged): `containers.tsx:945-951` + * unchanged): `containers.tsx:948-954` * renders * `{item.icon && }` inside the * `TabsTrigger`, left of the label span (`mr-1.5 h-3.5 w-3.5 shrink-0 * opacity-70`, `aria-hidden`), and the renderer's registration publishes - * the key to the Studio block designer at `:1004` (the `items` input, + * the key to the Studio block designer at `:1007` (the `items` input, * documented as `[{ label, value?, icon?, count?, visibleWhen?, children * }]`). * @@ -1041,7 +1049,10 @@ export const PageCardProps = strictObject({ * declarations identical. * * Each clause is read off the objectui pin this repo builds against - * (`.objectui-sha` = `2e818d0b51ec`, re-read there 2026-10-04: across the hop + * (`.objectui-sha` = `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 * from `ab1879721595` all four `record-*.tsx` renderers and the three * `permissions` files are byte-identical (`git diff --quiet`), so NO anchor * below moved. At `ab1879721595`, re-read there 2026-10-03: across the hop @@ -2334,7 +2345,15 @@ export const PageAccordionProps = strictObject({ * re-derive the same false candidate). * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `2e818d0b5`; re-derived at that pin 2026-10-04 — + * (`.objectui-sha` = `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 + * and the `page:header` picture read below both anchors), so both anchors + * were re-READ rather than carried, and BOTH MOVED down three lines with + * their text byte-identical: the icon block `1170-1176` -> `1173-1179` and the input + * `1219` -> `1222`; `lib/lazy-icon.tsx` is byte-identical. At `2e818d0b5`, + * re-derived there 2026-10-04 — * every objectui file this record cites is byte-identical across the hop * from `ab1879721` (`git diff --quiet`), so both anchors held unmoved. At * `ab1879721`, re-derived there 2026-10-03, `containers.tsx` changed @@ -2379,12 +2398,12 @@ export const PageAccordionProps = strictObject({ * lines byte-identical and the registration input `966` -> `1116` with its * LINE rewritten — it declares `of: 'object'` and carries a longer * description — while the member list this record cites stayed - * unchanged): `containers.tsx:1170-1176` + * unchanged): `containers.tsx:1173-1179` * renders * `{item.icon && }` inside the * `AccordionTrigger`, grouped with the label in the trigger's one wrapping * span, and the renderer's registration publishes the key to the Studio - * block designer at `:1219` (the `items` input, documented as + * block designer at `:1222` (the `items` input, documented as * `[{ label, icon?, collapsed?, children }]`). * * Vocabulary is Lucide, resolved through objectui's `LazyIcon` @@ -2667,10 +2686,14 @@ export const ElementButtonPropsSchema = lazySchema(() => strictObject({ * the button. * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `2e818d0b5`; re-derived at that pin 2026-10-04 — - * `button.tsx`, `lib/lazy-icon.tsx`, `renderers/action/resolve-icon.ts` and the - * generated `lucide-record-icon-names.ts` are all byte-identical to `ab1879721` - * (`git diff --quiet`) across the hop onto this pin, so every anchor below + * (`.objectui-sha` = `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 + * `2e818d0b5` (`git diff --quiet`) across the hop onto this pin, so every + * anchor below holds unmoved; at `2e818d0b5`, re-derived there 2026-10-04, + * they were all byte-identical to `ab1879721` + * (`git diff --quiet`) across the hop onto that pin, so every anchor below * holds unmoved; at `ab1879721`, re-derived there 2026-10-03, they were * all byte-identical to `89cad75d5` * across the hop onto that pin, so every anchor below holds unmoved and was @@ -3146,9 +3169,12 @@ 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` = `2e818d0b5`; first measured at `.objectui-sha` + * against, `.objectui-sha` = `9dfaca654`; first measured at `.objectui-sha` * pin `f8a9d0fb0`, every read point below re-derived at the current pin - * 2026-10-04: every objectui file this record cites is byte-identical across + * 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 + * is byte-identical across * the hop from `ab1879721` (`git diff --quiet`), so every anchor held * unmoved. At `ab1879721`, 2026-10-03: `public-blocks.ts`, `auto-trigger.ts`, `static-params.ts`, * `basic/data-list.tsx` and `ui/button.tsx` are byte-identical to `89cad75d5` @@ -4180,13 +4206,17 @@ 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` = `2e818d0b5`, 2026-10-04; - * `ObjectGrid.tsx` and `data-table.tsx` are byte-identical across the hop + * pin this repo builds against (`.objectui-sha` = `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; + * at `2e818d0b5`, 2026-10-04, `ObjectGrid.tsx` and `data-table.tsx` were + * byte-identical across the hop * from `ab1879721`, so every anchor below held unmoved, 2026-10-03 at * `ab1879721`): the BUILD landed — objectui `154075ab1` (objectui#11068), inside * `89cad75d5570..ab1879721595` — and the grid reads the key. The same method - * finds 0 hit lines at `89cad75d5570` and 15 at `ab1879721595` and at this pin, against 3 for the - * control `schema.editable` in `ObjectGrid.tsx` at both: `ObjectGrid.tsx:5458` + * finds 0 hit lines at `89cad75d5570` and 15 at `ab1879721595`, at `2e818d0b51ec` and at this pin, against 3 for the + * control `schema.editable` in `ObjectGrid.tsx` at each: `ObjectGrid.tsx:5461` * hands `schema.keyboardNavigation ?? inlineEditable` to the `data-table` it * renders, and `components/src/renderers/complex/data-table.tsx` acts on it. * So the marker is gone, as the member's record prescribed; see the member. @@ -4265,12 +4295,15 @@ 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` - * = `2e818d0b5`, re-measured 2026-10-04: `ObjectGrid.tsx` is byte-identical + * = `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 * across the hop from `ab1879721`, where it was measured 2026-10-03): objectui#11227 (carried by objectui * `6158e4c93`) resolves both members against the display locale before they * reach `DataEmptyState` — * `resolveInlineI18nLabel(authoredEmptyState?.title, displayLocale)` and the - * same for `message` (`ObjectGrid.tsx:6468-6469`, drawn at `:6485-6486`) — so + * same for `message` (`ObjectGrid.tsx:6471-6472`, drawn at `:6488-6489`) — so * both `I18nLabel` forms draw, and a locale map with no usable entry keeps * that member's default. At `89cad75d5570` the two still reached * `DataEmptyState` raw. @@ -4647,13 +4680,18 @@ 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` = `2e818d0b5`, - * re-measured 2026-10-04: `ObjectGrid.tsx` and `data-table.tsx` are + * Read at the pin this repo builds against (`.objectui-sha` = `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 + * both of its reads, which MOVED by +3 byte-identical — `5458` -> `5461` and + * `1812` -> `1815`; at `2e818d0b5`, re-measured 2026-10-04, `ObjectGrid.tsx` + * and `data-table.tsx` were * byte-identical across the hop from `ab1879721`, where they were measured * 2026-10-03; the BUILD is objectui `154075ab1`, objectui#11068): - * `plugin-grid/src/ObjectGrid.tsx:5458` hands the data table + * `plugin-grid/src/ObjectGrid.tsx:5461` hands the data table * `keyboardNavigation: schema.keyboardNavigation ?? inlineEditable`, where - * `inlineEditable` (`:1812`) is the authored `editable` AND the viewer's + * `inlineEditable` (`:1815`) is the authored `editable` AND the viewer's * write verdict — so an absent key follows whether the grid RENDERS * editable, `true` turns the navigation on for a read-only grid, and `false` * turns it off on an editable one. `components/src/renderers/complex/data-table.tsx` @@ -5037,7 +5075,17 @@ 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` = `2e818d0b5`; re-derived at that pin 2026-10-04 — + * (`.objectui-sha` = `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) + * gained objectui#11605's `requiresObject` gate on `ObjectMetricBlock` (six + * lines above the `object-metric` registration) and turned the + * registration's `objectName` input from a one-line `required: true` entry + * into a commented, described, non-required one (twelve net lines above the + * icon input), so its start MOVED `256` -> `262` and the icon input `281` + * -> `299`, both byte-identical, still `{ name: 'icon', type: 'string' }`. + * At `2e818d0b5`, re-derived there 2026-10-04 — * `ObjectMetricWidget.tsx`, `MetricWidget.tsx`, `MetricCard.tsx` and * `lazy-icon.tsx` are byte-identical to `ab1879721` (`git diff --quiet`), so * their anchors hold unmoved; `plugin-dashboard/src/index.tsx` (+13/-1) @@ -5106,7 +5154,7 @@ export const ObjectMetricPropsSchema = lazySchema(() => strictObject({ * `{ name: 'icon', type: 'string' }`. The four render-path anchors moved * with their cited text byte-identical), and the chain * runs three files: - * `plugin-dashboard/src/index.tsx:281` publishes it as a designer input + * `plugin-dashboard/src/index.tsx:299` publishes it as a designer input * on the registered `object-metric` block; * `ObjectMetricWidget.tsx:304` destructures it and forwards it at `:753` to * `MetricWidget`; `MetricWidget.tsx:371-380` resolves it via @@ -5260,8 +5308,13 @@ 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` = `2e818d0b5`; re-measured there 2026-10-04 — - * `ObjectKanban.tsx` is byte-identical across the hop from `ab1879721` + * (`.objectui-sha` = `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 + * `schema` binding above the fetch), so the anchor was re-READ and MOVED + * `722` -> `752` with its text byte-identical. At `2e818d0b5` (2026-10-04) + * `ObjectKanban.tsx` was byte-identical across the hop from `ab1879721` * (`git diff --quiet`), so the anchor did not move. At `ab1879721` * (2026-10-03) `ObjectKanban.tsx` was byte-identical across the hop from * `89cad75d5` (`git diff --quiet`), so the anchor did not move and was @@ -5299,7 +5352,7 @@ const ObjectKanbanLaneSchema = lazySchema(() => strictObject({ * having put a refusal in front of it — a contract-refused row cap is dropped * and reported at `:554` instead of being sent. The pinned fact is unchanged: * `schema.limit` still lowers into the query's top-level `$top`): - * `ObjectKanban.tsx:722`, the `$top` of the + * `ObjectKanban.tsx:752`, the `$top` of the * board's one query — its docblock below carries the four-face record. */ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ @@ -5352,7 +5405,27 @@ 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` = `2e818d0b5`; re-measured there + * repo builds against (`.objectui-sha` = `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 + * `limit: 250` snippet did not change; `ElementDataSourceGate.tsx` changed + * only below `:600` (+75/-0, objectui#11605's `requiresObject` prop and its + * "no object named" hint), so `:218-220` and `:437-456` did not move; + * `ObjectKanban.tsx` changed (+35/-5, objectui#8347): the type import at + * `:10` was edited in place and still imports `ObjectKanbanSchema` (beside + * a new `SortConfig`), and above the query the component now reads + * `schema` through a private `GateBoundKanbanSchema` — `ObjectKanbanSchema` + * plus the gate-written `sort`, so `limit` is still `ObjectKanbanSchema`'s + * member — so the default `:97` did not move and the query `715-725` -> + * `745-755` and the `queryFilter` resolution `:584-585` -> `:614-615` + * MOVED byte-identical; `plugin-kanban/src/index.tsx` (+34/-3) gained one + * docblock line above the mapping (objectui#8347), which MOVED + * byte-identical `487-491` -> `488-492`, and objectui#11605's + * `requiresObject` gate and non-required `objectName` input below it; and + * `objectql.ts` (+85/-45: objectui#11615, objectui#11266 and objectui#8347) + * MOVED the member `4720` -> `4754` byte-identical, still inside + * `ObjectKanbanSchema`. At `2e818d0b5`, re-measured there * 2026-10-04 — `ObjectKanban.tsx`, `plugin-kanban/src/types.ts` (still no * row-cap member), `plugin-kanban/src/index.tsx`, `ElementDataSourceGate.tsx` * and `element-data-source.ts` are byte-identical to `ab1879721`, so every @@ -5462,8 +5535,8 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ * while this map refused the key by name: the board's one query is * `dataSource.find(objectName, { $filter: queryFilter, $orderby: …, $top: * resolveRowLimit(schema.limit, DEFAULT_KANBAN_FETCH_BATCH_SIZE) })` - * (`plugin-kanban/src/ObjectKanban.tsx:715-725`, where `queryFilter` is - * `schema.filter` with its context tokens resolved at `:584-585` — + * (`plugin-kanban/src/ObjectKanban.tsx:745-755`, where `queryFilter` is + * `schema.filter` with its context tokens resolved at `:614-615` — * objectui#10666; at `f8a9d0fb0` the member read `schema.filter` verbatim — * the default `100` at `:97`, named `DEFAULT_KANBAN_LIMIT` until * objectui#9853 — a REAL top-level `$top` since objectui#4025; @@ -5471,11 +5544,11 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ * bare `??` became `resolveRowLimit` in objectui#9925, which drops and * reports a cap the contract refuses instead of sending it), * `OBJECT_KANBAN_DATA_SOURCE` maps `limit: 'limit'` - * (`plugin-kanban/src/index.tsx:487-491`), the type the board reads `schema` + * (`plugin-kanban/src/index.tsx:488-492`), the type the board reads `schema` * through is `ObjectKanbanSchema` — ⚠️ `KanbanSchema` was RETIRED on this hop * (maintainer ruling 2026-09-09) and `plugin-kanban/src/types.ts` no longer * declares the member at all — imported at `ObjectKanban.tsx:10` and - * declaring `limit?: number` at `packages/types/src/objectql.ts:4720`, + * declaring `limit?: number` at `packages/types/src/objectql.ts:4754`, * and `content/docs/plugins/plugin-kanban.mdx` * teaches it with a typed snippet (`limit: 250`) plus a Properties row. So * an author following the published docs wrote a node the save gate @@ -5570,7 +5643,17 @@ 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` = `2e818d0b5`; re-measured there 2026-10-04 — every + * (`.objectui-sha` = `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 + * private `GateBoundKanbanSchema` read type and widened `schema` binding), + * which MOVED `1639` -> `1669` byte-identical; `plugin-kanban/src/index.tsx` + * changed only below the pass-through (+34/-3: one objectui#8347 docblock + * line at `:368`, objectui#11605's `requiresObject` gate and non-required + * `objectName` input), which did not move from `345-346`; and the counts + * re-read the same, 2 / 2 / 11. At `2e818d0b5`, re-measured there + * 2026-10-04 — every * objectui file this record cites is byte-identical across the hop from * `ab1879721` (`git diff --quiet`), so every anchor held unmoved. At * `ab1879721`, re-measured there 2026-10-03 — @@ -5642,7 +5725,7 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ * `object-kanban` node. `ObjectKanban.tsx` names neither half of the pair * in code (0 occurrences each, against 11 for the sibling `onCardClick` in the same * file — re-counted at `db11afd49`, at `f8a9d0fb0` and at `62597c588`; at - * `e420df310`, at `31971ff1e`, at `89cad75d5` and again at this pin 2 each, all four inside the two + * `e420df310`, at `31971ff1e`, at `89cad75d5`, at `2e818d0b5` and again at this pin 2 each, all four inside the two * objectui#11234 comments that record the cut, and still 11 for * `onCardClick`; this record said 6, which the identical * file at `87af769e9` does not reproduce either, so the control was @@ -5730,7 +5813,17 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ * element schemas). * * Measured at the pin this repo builds against (`.objectui-sha` = - * `2e818d0b5`; re-measured there 2026-10-04 — `ObjectKanban.tsx` and + * `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 + * `ObjectKanbanSchema`, with its declared `navigation`, plus the + * gate-written `sort` — a re-worded docblock and a widened `schema` + * binding), so each MOVED by 30 with its cited text byte-identical: the + * read `1280` -> `1310`, the hand-off `1288-1289` -> `1318-1319`, the + * overlay render `1538` -> `1568` and its `NavigationOverlay` `1554-1567` + * -> `1584-1597`, and the card click `1663` -> `1693`. At `2e818d0b5`, + * re-measured there 2026-10-04 — `ObjectKanban.tsx` and * `useNavigationOverlay.ts` are byte-identical to `ab1879721` * (`git diff --quiet`), so every anchor held unmoved. At `ab1879721`, * re-measured there 2026-10-03 — both are byte-identical to `89cad75d5` @@ -5780,11 +5873,11 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ * re-READ at `87af769e9` 2026-09-22 — every anchor re-derived from that * tree rather than carried, none of them at its `53ded82bf` number and one * of them no longer spelled the way this record quoted it): - * `ObjectKanban.tsx:1280` + * `ObjectKanban.tsx:1310` * reads `schema.navigation ?? { mode: 'drawer' }` and hands it to - * `useNavigationOverlay` (`:1288-1289`), whose result drives the card click - * (`:1663`) and the detail overlay (`:1538`, whose `NavigationOverlay` is - * `:1554-1567`) — on a STANDALONE board, with no enclosing view to resolve + * `useNavigationOverlay` (`:1318-1319`), whose result drives the card click + * (`:1693`) and the detail overlay (`:1568`, whose `NavigationOverlay` is + * `:1584-1597`) — on a STANDALONE board, with no enclosing view to resolve * a mode from. ⚠️ The `(schema as any)` cast this record used to quote is * GONE at this pin: the read is spelled `schema.navigation`, and it now * compiles through a DECLARED `ObjectKanbanSchema.navigation` member @@ -5917,7 +6010,14 @@ export const ObjectCalendarPropsSchema = lazySchema(() => strictObject({ * `object-kanban`'s above. * * Measured at the pin this repo builds against (`.objectui-sha` = - * `2e818d0b5`; re-measured there 2026-10-04 — `ObjectCalendar.tsx` and + * `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 + * anchor held unmoved and was re-read in place: the read `1018`, the + * hand-off `1020-1021`, the event click `1413`, the overlay render `1333` + * and its `NavigationOverlay` `1346-1359`. At `2e818d0b5`, re-measured + * there 2026-10-04 — `ObjectCalendar.tsx` and * `useNavigationOverlay.ts` are byte-identical to `ab1879721` * (`git diff --quiet`), so every anchor held unmoved. At `ab1879721`, * re-measured there 2026-10-03 — `ObjectCalendar.tsx` changed diff --git a/scripts/sdui-manifest.record.json b/scripts/sdui-manifest.record.json index 231661826dc..acae3ef53a4 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": "2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6", + "objectuiSha": "9dfaca654311cddd81714153c4f82c241d7cdc54", "source": "built-tree", - "modulesRoot": ".cache/objectui-2e818d0b51ec/apps/console", + "modulesRoot": ".cache/objectui-9dfaca654311/apps/console", "objectuiWorkspaceVersion": "17.7.0", "generator": "scripts/gen-sdui-manifest-node.mjs", - "generatedAt": "2026-10-04", - "sha256": "0ead67c1111d73e6f48424510a002a626edd75d7dc5617d663bd022434106458", + "generatedAt": "2026-10-05", + "sha256": "6f921896ffac747cc7ec523102369060d570290e2c9ae84aae9898bc895eacd2", "components": 107 } diff --git a/sdui.manifest.json b/sdui.manifest.json index 3d83b85382e..db3b5c7b76b 100644 --- a/sdui.manifest.json +++ b/sdui.manifest.json @@ -7,7 +7,7 @@ { "name": "objectName", "type": "string", - "required": true + "description": "Object this grid lists. Not required: the node's `dataSource` binding can name the object instead, and `dataSource.object` lands on this key, outranking an authored value. With neither, and no inline `data` rows, the grid shows an error saying an object name is required and fetches nothing." }, { "name": "columns", @@ -183,7 +183,7 @@ { "name": "objectName", "type": "string", - "required": true + "description": "Object this list view lists. Not required: the node's `dataSource` binding can name the object instead, and `dataSource.object` lands on this key, outranking an authored value. With neither, and no inline `data`, the list shows a hint naming this key instead of an empty list." }, { "name": "viewType", @@ -258,7 +258,7 @@ { "name": "objectName", "type": "string", - "required": true + "description": "Object this form creates or edits. Not required: the node's `dataSource` binding can name the object instead, and `dataSource.object` lands on this key, outranking an authored value. With neither, and no inline fields (non-empty `customFields`, or `sections` whose every field is inline), the form shows a hint naming this key instead of a form with no fields." }, { "name": "fields", @@ -518,7 +518,7 @@ { "name": "objectName", "type": "string", - "required": true + "description": "Object the form creates a record in. Not required: the node's `dataSource` binding can name the object instead, and `dataSource.object` lands on this key, outranking an authored value. With neither, the form shows a hint naming this key instead of a form that cannot submit." }, { "name": "title", @@ -552,7 +552,7 @@ { "name": "objectName", "type": "string", - "required": true + "description": "The PARENT object this form creates or edits. Not required: the node's `dataSource` binding can name the object instead, and `dataSource.object` lands on this key, outranking an authored value. With neither, the form shows a hint naming this key instead of an empty parent form." }, { "name": "mode", @@ -588,7 +588,7 @@ { "name": "fields", "type": "array", - "description": "Which parent fields to show, in order — and it is NOT ignored when `sections` is given: the two INTERSECT. The parent field pool is built from this key first and every section then resolves its own members against that pool, so a section member this key does not list is dropped from the rendered form, and a section that loses EVERY member that way disappears with its heading. Each such drop is reported once via `console.warn` (objectui#9884); it is not repaired, because this key bounds what the form DRAWS and edits, not what Save writes: on a create, the submitted set is the drawn fields plus any parent value seeded through `initialValues` (or its alternate spelling `initialData`), drawn or not. A seed for an undeclared, server-owned, computed or read-only field is still stripped, as on any save. Author one or the other, or list every section member here too. Members are bare field names; NOT the spec `FormFieldSchema` object `sections[].fields` accepts (identity key `field`) — that shape resolves to no name here and is silently skipped (the parent form renders through the same `ObjectForm` / `SimpleObjectForm` as `object-form` — see its `fields` description)." + "description": "Which parent fields to show, in order — and it is NOT ignored when `sections` is given: the two INTERSECT. The parent field pool is built from this key first and every section then resolves its NAMED members (a bare name, or the `{ field }` entry) against that pool, so such a member this key does not list is dropped from the rendered form, and a section that loses EVERY member that way disappears with its heading. An inline field entry (`{ name, type, … }`) names nothing to resolve and is drawn whatever this key lists, as on every form type (objectui#11615). Each such drop is reported once via `console.warn` (objectui#9884); it is not repaired, because this key bounds what the form DRAWS and edits, not what Save writes: on a create, the submitted set is the drawn fields plus any parent value seeded through `initialValues` (or its alternate spelling `initialData`), drawn or not. A seed for an undeclared, server-owned, computed or read-only field is still stripped, as on any save. Author one or the other, or list every section member here too. Members are bare field names; NOT the spec `FormFieldSchema` object `sections[].fields` accepts (identity key `field`) — that shape resolves to no name here and is silently skipped (the parent form renders through the same `ObjectForm` / `SimpleObjectForm` as `object-form` — see its `fields` description)." }, { "name": "title", @@ -648,7 +648,7 @@ { "name": "objectName", "type": "string", - "required": true + "description": "Object this board lists. Not required: the node's `dataSource` binding can name the object instead, and `dataSource.object` lands on this key, outranking an authored value. With neither, and no rows from `data`, `bind` or a parent view, the board shows a hint naming this key instead of an empty board." }, { "name": "columns", @@ -1086,7 +1086,7 @@ { "name": "objectName", "type": "string", - "required": true + "description": "Object this metric aggregates. Not required: the node's `dataSource` binding can name the object instead, and `dataSource.object` lands on this key, outranking an authored value. With neither, and no `fallbackValue`, the tile shows a hint naming this key instead of a value." }, { "name": "label", @@ -1210,7 +1210,7 @@ { "name": "objectName", "type": "string", - "required": true + "description": "Object this chart aggregates. Not required: the node's `dataSource` binding can name the object instead, and `dataSource.object` lands on this key, outranking an authored value. With neither, and no inline `data`, the chart shows a hint naming this key instead of an empty frame." }, { "name": "data", @@ -1305,7 +1305,7 @@ { "name": "objectName", "type": "string", - "required": true + "description": "Object this pivot table cross-tabulates. Not required: the node's `dataSource` binding can name the object instead, and `dataSource.object` lands on this key, outranking an authored value. With neither, the table shows a hint naming this key and fetches nothing." }, { "name": "title", @@ -1506,8 +1506,7 @@ "name": "columns", "type": "array", "of": "string", - "required": true, - "description": "Fields to display in the related list" + "description": "Fields to display in the related list. Optional: without it, a `dataSource` binding that names a view supplies that view's columns, and with neither the list derives its columns from the related object (its `highlightFields`, otherwise its listable fields). Authored columns win over both." }, { "name": "sort", @@ -1597,7 +1596,7 @@ { "name": "childObject", "type": "string", - "required": true + "description": "The child object whose records the panel lists, edits and saves. Not required: the node's `dataSource` binding can name the object instead, and `dataSource.object` lands on this key, outranking an authored value. With neither, the panel shows a configuration hint naming this key and loads nothing." }, { "name": "relationshipField", From 70350470fa79ecc778bd72ba330bdaaef172561e Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 5 Oct 2026 01:06:24 +0000 Subject: [PATCH 4/8] chore(sdui-parser): re-record the objectui lockstep parity at pin 9dfaca654311 Claude-Session: https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn Co-authored-by: Claude --- packages/sdui-parser/objectui-lockstep.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/sdui-parser/objectui-lockstep.json b/packages/sdui-parser/objectui-lockstep.json index 5f35537b738..ac2354be431 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": "2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6", - "revDate": "2026-10-04T07:05:00+00:00", + "rev": "9dfaca654311cddd81714153c4f82c241d7cdc54", + "revDate": "2026-10-04T18:53:28+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": "2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6", + "recordedAgainstPin": "9dfaca654311cddd81714153c4f82c241d7cdc54", "grammarRegion": { "file": "packages/sdui-parser/src/parse.ts", "delimiter": "/* ---------------------- the JS literal subset (#6614) ---------------------- */", From 66ef1018c1c3baf51da85b90695899dba52d3072 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 5 Oct 2026 01:10:39 +0000 Subject: [PATCH 5/8] fix(spec): re-measure the asserting objectui pin citations at 9dfaca654311 Every anchor in each asserting record was mapped through the objectui diff 2e818d0b51ec..9dfaca654311 and re-read; moved anchors are re-pointed with their text byte-identical, and each record gains a dated hop sentence. Claude-Session: https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn Co-authored-by: Claude --- packages/spec/src/ui/component.zod.ts | 171 ++++++++++++++++++-------- packages/spec/src/ui/dataset.zod.ts | 5 +- packages/spec/src/ui/view.zod.ts | 27 +++- 3 files changed, 146 insertions(+), 57 deletions(-) diff --git a/packages/spec/src/ui/component.zod.ts b/packages/spec/src/ui/component.zod.ts index df23d850103..92fa97f3b69 100644 --- a/packages/spec/src/ui/component.zod.ts +++ b/packages/spec/src/ui/component.zod.ts @@ -7099,7 +7099,13 @@ 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` = `2e818d0b5`, re-measured there 2026-10-04: `ObjectMap.tsx`, + * `.objectui-sha` = `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 + * `BaseSchema`'s index signature in the past tense), below every anchor this + * record cites in it, so every anchor held unmoved. At `2e818d0b5` + * (2026-10-04) `ObjectMap.tsx`, * `index.tsx` and `core/src/utils/record-source.ts` are byte-identical across * the hop from `ab1879721` (`git diff --quiet`), so every anchor held * unmoved. At `ab1879721` (2026-10-03) all three were byte-identical across @@ -7267,7 +7273,12 @@ 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` = `2e818d0b5`, re-measured + * pin this repo builds against (`.objectui-sha` = `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 all three anchors and the `filter` input held + * unmoved. At `2e818d0b5`, re-measured * there 2026-10-04: `ObjectMap.tsx` and `plugin-map/src/index.tsx` are * byte-identical to `ab1879721` (`git diff --quiet`), so all three anchors * and the `filter` input held unmoved. At `ab1879721`, re-READ there @@ -7318,7 +7329,12 @@ 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` = `2e818d0b5`, re-measured there 2026-10-04 — + * (`.objectui-sha` = `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 + * the `sort` input held unmoved. At `2e818d0b5`, re-measured there + * 2026-10-04 — * `ObjectMap.tsx` and `plugin-map/src/index.tsx` are byte-identical to * `ab1879721` (`git diff --quiet`), so both anchors and the `sort` input * held unmoved. At `ab1879721`, re-READ there 2026-10-03 — `ObjectMap.tsx` @@ -7491,7 +7507,21 @@ 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` = `2e818d0b5`, re-measured there 2026-10-04: + * — `.objectui-sha` = `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`, + * objectui#8347), which did not move; and `ObjectGantt.tsx` +4/-3 grew one + * line in the `ObjectGanttProps` docblock above `getGanttConfig` + * (objectui#8347 putting the index-signature note in the past tense), so + * every anchor in it MOVED by 1 (`:612-614` -> `:613-615`, `:724` -> `:725`, + * `:920` -> `:921`, `:1065`/`:1066` -> `:1066`/`:1067`, `:1074`/`:1076` -> + * `:1075`/`:1077`, `:887-890` -> `:888-891`, `:1080-1085` -> `:1081-1086`, + * `:1678`/`:1679` -> `:1679`/`:1680`, `:1830`/`:1832` -> `:1831`/`:1833`, + * `:1968` -> `:1969`, `:2035` -> `:2036`, `:2347` -> `:2348`, `:2505`-`:2513` + * -> `:2506`-`:2514`, `:2548-2554` -> `:2549-2555`), each with its cited text + * byte-identical; NONE changed content. At `2e818d0b5`, re-measured there + * 2026-10-04: * `plugin-gantt/src/index.tsx`, `record-source.ts` and `ObjectGantt.tsx` are * byte-identical to `ab1879721` (`git diff --quiet`), so every anchor held * unmoved. At `ab1879721`, re-measured there 2026-10-03: @@ -7578,46 +7608,46 @@ function objectGanttMarker() { * every number was re-derived from that tree, and the `label` one moved far * enough that the retired reading now lands in an unrelated callback.) * Read points per key: `data` (`resolveRecordSourceConfig` at - * `:724` — rung 1, `core/src/utils/record-source.ts:307`), `staticData` (rung 2, - * `record-source.ts:311`), `objectName` (rung 3; also `:1832` and `:2035` here), - * `filter` (`:920`, read once through `useResolvedFilter`, which resolves its - * context tokens — objectui#10666 — and `:1065` sends the held result to - * `$filter`; at `f8a9d0fb0` it was sent verbatim), `sort` (`:1066`, through - * `convertSortToQueryParams` to `$orderby`), `gantt` (`:612-614` — + * `:725` — rung 1, `core/src/utils/record-source.ts:307`), `staticData` (rung 2, + * `record-source.ts:311`), `objectName` (rung 3; also `:1833` and `:2036` here), + * `filter` (`:921`, read once through `useResolvedFilter`, which resolves its + * context tokens — objectui#10666 — and `:1066` sends the held result to + * `$filter`; at `f8a9d0fb0` it was sent verbatim), `sort` (`:1067`, through + * `convertSortToQueryParams` to `$orderby`), `gantt` (`:613-615` — * `getGanttConfig` branch 1, the author face and the registration's declared * `{ name: 'gantt', type: 'object' }` input (`plugin-gantt/src/index.tsx:179`), * validated there against this - * repo's own {@link GanttConfigSchema}), `navigation` (`:1968`), `label` - * (`:2550`, resolved through `resolveInlineI18nLabel` for the export file + * repo's own {@link GanttConfigSchema}), `navigation` (`:1969`), `label` + * (`:2551`, resolved through `resolveInlineI18nLabel` for the export file * name — this record said `resolveI18nLabel`, which the line did not read at * `f8a9d0fb0` either — * ⚠️ the retired reading `:1849` was the comment ABOVE that chain and at this * pin `87af769e9` was a BLANK line (nothing cites `:1849` now), two above a dependency-delete callback's own comment, * so it is re-READ here, not re-pointed), - * `skipWeekends` (`:1678`), `holidays` (`:1679`), `persistLayout` (`:1830`), - * `viewName` (`:1832`), `markers` (`:2505`), `criticalPath` (`:2508`), - * `showBaselines` (`:2511`), `readOnly` (`:2347` and `:2512`) and - * `mobileReadOnly` (`:2513`). + * `skipWeekends` (`:1679`), `holidays` (`:1680`), `persistLayout` (`:1831`), + * `viewName` (`:1833`), `markers` (`:2506`), `criticalPath` (`:2509`), + * `showBaselines` (`:2512`), `readOnly` (`:2348` and `:2513`) and + * `mobileReadOnly` (`:2514`). * * Measured and deliberately NOT declared: the flat `GanttConfig` spellings (the * flatten product — {@link OBJECT_GANTT_FLAT_CONFIG_GUIDANCE}); `title`, which * this renderer never reads (the export-name chain is `gantt.exportFileName` → - * `label` → the OBJECT's label → `objectName`, `:2548-2554`); a row cap — the + * `label` → the OBJECT's label → `objectName`, `:2549-2555`); a row cap — the * reload's `$top` is the platform ceiling, spread in as core's - * `nonGridRowCeilingQuery()` (`:1076`: one probe row past the ceiling, which + * `nonGridRowCeilingQuery()` (`:1077`: one probe row past the ceiling, which * `applyNonGridRowCeiling` slices back off; at `f8a9d0fb0` a bare * `$top: NON_GRID_ROW_CEILING_TOP`, until objectui#7508 homed the ceiling in - * core) and the renderer's own comment marks it "⛔ Not authorable" (`:1074`); and + * core) and the renderer's own comment marks it "⛔ Not authorable" (`:1075`); and * the `onTaskClick` / `onRowClick` / `onBeforeTaskUpdate` callbacks, which are * host props. ⚠️ New at `f8a9d0fb0` and recorded, not ruled: objectui#10250 * gave the renderer two more reads, `search` and `searchableFields` - * (`:887-890`, sent as `$search` / `$searchFields` at `:1080-1085`), which + * (`:888-891`, sent as `$search` / `$searchFields` at `:1081-1086`), which * `ListView.tsx` writes onto the node it generates from its toolbar Search * box — a host-generated key pair in the same position as the flatten * product, and not declared here. * * VALUE posture: `gantt` is the one config block in this family whose value - * contract is already the SPEC's — `ObjectGantt.tsx:614` validates it against + * contract is already the SPEC's — `ObjectGantt.tsx:615` validates it against * `GanttConfigSchema` imported from `@objectstack/spec/ui` — so the read point * names the schema and this door takes it rather than `z.unknown()`. The * scalars below are read as their coercions say: `!!schema.readOnly`, @@ -7706,11 +7736,18 @@ export type ObjectGanttPropsParsed = z.infer; /** * The flat `TreeConfig` spellings `getTreeConfig` reads ahead of the `tree` - * block (`ObjectTree.tsx:281-294`) and that `ObjectView` / `ListView` EMIT when + * block (`ObjectTree.tsx:284-297`) and that `ObjectView` / `ListView` EMIT when * 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` = `2e818d0b5`) on 2026-10-04 — + * pin this repo builds against (`.objectui-sha` = `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 + * putting `BaseSchema`'s index signature in the past tense), one above each + * range, so `233-254` MOVED to `235-256` and `281-294` to `284-297`, each + * byte-identical, and the flat key set each reads or emits did not move. At + * `2e818d0b5`, on 2026-10-04 — * `ObjectTree.tsx`, `plugin-tree/src/index.tsx` and `ListView.tsx` are * byte-identical to `ab1879721` (`git diff --quiet`), so every anchor held * unmoved. At `ab1879721`, on 2026-10-03 — @@ -7770,7 +7807,7 @@ export type ObjectGanttPropsParsed = z.infer; * read rather than a moved one: `getTreeConfig`'s `?? schema.titleField` rung * — the `:117` this record used to cite — was removed on objectui#8841 * because it read the FLATTENED NODE and never the block, and the docblock at - * `ObjectTree.tsx:233-254` records the three measurements that retired it. + * `ObjectTree.tsx:235-256` records the three measurements that retired it. * The flatten half above is what keeps the key in this set; ⛔ do not restore * the renderer half from this record's history. */ @@ -7791,7 +7828,15 @@ 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` = `2e818d0b5`, re-measured there 2026-10-04: every + * — `.objectui-sha` = `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, + * objectui#8347 putting `BaseSchema`'s index signature in the past tense: + * +2 lines at `:135`, +1 at `:264`), so every anchor in it MOVED by 3 with + * its cited text byte-identical (`:634` -> `:637`, `:739` -> `:742`, + * `:281-294` -> `:284-297`, `:1054` -> `:1057` and the rest below). At + * `2e818d0b5`, re-measured there 2026-10-04: every * objectui file this record cites is byte-identical to `ab1879721` * (`git diff --quiet`), so every anchor held unmoved. At `ab1879721`, * re-measured there 2026-10-03: @@ -7854,7 +7899,7 @@ const OBJECT_TREE_FLAT_CONFIG_GUIDANCE: readonly KeySetGuidance[] = [ * one was re-derived from that tree, and the ladder call changed in CONTENT * as well as position.) * Read points per key: `data` (`resolveRecordSourceConfig` at - * `:634` — rung 1, `core/src/utils/record-source.ts:307`, which returns the + * `:637` — rung 1, `core/src/utils/record-source.ts:307`, which returns the * authored value VERBATIM once it is on the arm; that ONE site is the whole * support for the arm this row declares. ⚠️ At this pin the ARM this renderer * passes is `'view-data'`, the one its siblings pass (objectui#8348), so a @@ -7863,18 +7908,18 @@ const OBJECT_TREE_FLAT_CONFIG_GUIDANCE: readonly KeySetGuidance[] = [ * same line. Through `db11afd49` it passed `'undeclared'`, which honoured any * truthy value — WIDER than this row, the harmless direction), * `staticData` (rung 2, - * `record-source.ts:311`), `objectName` (rung 3; also `:1026`, `:1068` and - * `:1140` here, each behind `resolveRecordSourceObjectName`, plus the - * parent-field detection at `:958-959`), - * `filter` (`:739`, read once through `useResolvedFilter`, which resolves its - * context tokens — objectui#10666 — and holds the result: `:831` sends it to - * `$filter` on the object fetch and `:916` on the inline `value` provider's + * `record-source.ts:311`), `objectName` (rung 3; also `:1029`, `:1071` and + * `:1143` here, each behind `resolveRecordSourceObjectName`, plus the + * parent-field detection at `:961-962`), + * `filter` (`:742`, read once through `useResolvedFilter`, which resolves its + * context tokens — objectui#10666 — and holds the result: `:834` sends it to + * `$filter` on the object fetch and `:919` on the inline `value` provider's * `ValueDataSource` query, objectui#9136's; at `f8a9d0fb0` both sent - * `schema.filter` verbatim, at `:753` and `:837`), `tree` (`:282`, the - * nested config block `getTreeConfig` (`:281-294`) reads, and the + * `schema.filter` verbatim, at `:753` and `:837`), `tree` (`:285`, the + * nested config block `getTreeConfig` (`:284-297`) reads, and the * registration's declared `{ name: 'tree', type: 'object' }` input - * (`plugin-tree/src/index.tsx:47-52`)) and `navigation` (`:1054`, handed to - * `useNavigationOverlay` at `:1046` — typed since objectui#11168 slice 3; + * (`plugin-tree/src/index.tsx:47-52`)) and `navigation` (`:1057`, handed to + * `useNavigationOverlay` at `:1049` — typed since objectui#11168 slice 3; * through `31971ff1e` it was `(schema as any).navigation`, at `:1063`). * * ⚠️ `data` IS declared here, and that is the measurement, not a family @@ -7891,31 +7936,31 @@ const OBJECT_TREE_FLAT_CONFIG_GUIDANCE: readonly KeySetGuidance[] = [ * `NavigationConfig`) beside `filter`, and makes `objectName` optional, on * `ObjectTreeSchema` and on the registration's inputs alike. * - * ⛔ `:865` is NOT a second site for the object arm, and at this pin it is not + * ⛔ `:868` is NOT a second site for the object arm, and at this pin it is not * a read of the authored key at all: it is `(rest as any).data`, gated by * `Array.isArray(passed)` on the next line — the rows a HOST hands down as the * `data` React prop. objectui#8348 dropped the `?? schema.data` fallback that * line carried through `db11afd49` (`:862` there), the one reader that let an * authored bare array draw rows whatever the ladder said, and objectui#9571 * had already stopped `SchemaRenderer` delivering the authored key as that - * prop. One ladder site is sufficient, and `:634` is it. + * prop. One ladder site is sufficient, and `:637` is it. * * Measured and deliberately NOT declared: the flat `TreeConfig` spellings * ({@link OBJECT_TREE_FLAT_CONFIG_GUIDANCE}); the bare-array `data` shorthand, * which `ViewData` cannot publish (a discriminated union over OBJECT variants), * for which `staticData` is this block's declared door, and which the renderer - * itself no longer accepts from an authored node at this pin (see `:865` + * itself no longer accepts from an authored node at this pin (see `:868` * above; `:862-863` accepted it through `db11afd49`); `sort` — this renderer's fetch - * (`:830-842`) carries `$filter`, `$top` and `$expand` and NO `$orderby`, the - * inline query (`:915-924`) carries `$filter` and `$top` only, and + * (`:833-845`) carries `$filter`, `$top` and `$expand` and NO `$orderby`, the + * inline query (`:918-927`) carries `$filter` and `$top` only, and * nothing else reads an order, so declaring one would publish a key with no read * site; a row cap, for the same reason `object-gantt` declares none (the `$top` * is the platform ceiling, spread in as core's `nonGridRowCeilingQuery()` at - * `:840` and again at `:923` — a bare `$top: NON_GRID_ROW_CEILING_TOP` at + * `:843` and again at `:926` — a bare `$top: NON_GRID_ROW_CEILING_TOP` at * `f8a9d0fb0`, until objectui#7508 — marked "⛔ Not - * authorable" at `:839`); and `filter.tree`, the legacy stash — ⚠️ no longer + * authorable" at `:842`); and `filter.tree`, the legacy stash — ⚠️ no longer * read since `f8a9d0fb0`: objectui#9549 deleted that arm, so `getTreeConfig` - * (`:282`) takes the block from `tree` alone — which was a shape to stop + * (`:285`) takes the block from `tree` alone — which was a shape to stop * writing and is not a key to declare. * * This was also the one block of the three whose type was absent from the @@ -7952,7 +7997,13 @@ 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` = `2e818d0b5`, re-COUNTED there 2026-10-04 by + * builds against (`.objectui-sha` = `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 + * `plugin-grid` (objectui#11605 made its `objectName` input non-required, + * its wiring unchanged), and 4 for `plugin-map` (one docblock re-worded line + * for line, objectui#8347); re-COUNTED at `2e818d0b5` 2026-10-04 by * the same method — 0 for the tree, 3 each for `plugin-gantt`, * `plugin-calendar` and `plugin-grid`, and 4 for `plugin-map`, all five * `src/index.tsx` shells byte-identical across the hop from `ab1879721`; @@ -8318,7 +8369,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` = `2e818d0b5`), re-measured there + * repo builds against (`.objectui-sha` = `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 * 2026-10-04: `ObjectTimeline.tsx`, `renderer.tsx` and `index.tsx` are * byte-identical to `ab1879721` (`git diff --quiet`), so every anchor held * unmoved. At `ab1879721`, re-measured there @@ -8522,7 +8576,14 @@ 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` = - * `2e818d0b5`, re-measured there 2026-10-04 — the file and + * `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 + * `BaseSchema` index signature's removal in the past tense, not in the + * `properties.*` hoist, its strip list or the `createElement` spread, so + * the prop channel above still carries the key. At `2e818d0b5`, + * re-measured there 2026-10-04 — the file and * `record-source.ts` are byte-identical across the hop from `ab1879721` * (`git diff --quiet`), so every anchor held unmoved; `SchemaRenderer.tsx` * changed (+21/-20, objectui#11466) in its type import and in the @@ -8803,7 +8864,9 @@ 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` = - // `2e818d0b5`; re-measured there 2026-10-04: all four files below are + // `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 // unmoved; at `ab1879721`, re-measured 2026-10-03: `data-list.tsx`, // `public-blocks.ts`, `block-types.ts` and `block-config.ts` all @@ -8867,7 +8930,12 @@ 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` = - // `2e818d0b5`), all three re-measured there 2026-10-04 (`ObjectMap.tsx`, + // `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 + // byte-identical and the `schema.*` read set of each is unchanged; at + // `2e818d0b5`, 2026-10-04, `ObjectMap.tsx`, // `ObjectTree.tsx` and `ObjectGantt.tsx` are byte-identical to `ab1879721`, // so every anchor held unmoved; at `ab1879721`, 2026-10-03, `ObjectMap.tsx` and // `ObjectTree.tsx` are byte-identical to `89cad75d5`; `ObjectGantt.tsx` @@ -8921,7 +8989,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` = - // `2e818d0b5`), re-measured there 2026-10-04 (`renderer.tsx`, + // `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`, // `ObjectTimeline.tsx` and `index.tsx` byte-identical to `ab1879721`, so // every anchor held unmoved and no declared key set moved; at `ab1879721`, // 2026-10-03, `renderer.tsx`, diff --git a/packages/spec/src/ui/dataset.zod.ts b/packages/spec/src/ui/dataset.zod.ts index b1ef9ba7b48..4fa238c0cdf 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` = - * `2e818d0b5`; re-derived at that pin 2026-10-04 — `date-display.ts` and + * `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 * `dataset-format.ts` are byte-identical to `ab1879721` (`git diff --quiet`), * so every anchor held unmoved. At `ab1879721`, re-derived there * 2026-10-03 — `date-display.ts` is diff --git a/packages/spec/src/ui/view.zod.ts b/packages/spec/src/ui/view.zod.ts index ad06fd73b64..beffd501c4d 100644 --- a/packages/spec/src/ui/view.zod.ts +++ b/packages/spec/src/ui/view.zod.ts @@ -2167,14 +2167,26 @@ export const TreeConfigSchema = lazySchema(() => strictObject({ * lines above it (the record-count line's i18next count family). * `ObjectMap.tsx` is byte-identical and `ListView.tsx` changed only below * `:146` and `:85` (objectui#10813, objectui#11445, objectui#11227), so their - * anchors did not move. Each anchor quotes the line it was read at, + * anchors did not move. The hop onto pin `2e818d0b5` (2026-10-04) redded + * none of them. RE-READ again at pin `9dfaca654` on 2026-10-05: that bump + * redded three anchors, and none of them changed what it reads. Two are in + * `objectql.zod.ts`, which grew above them (+22/-4: objectui#11266's + * `InlineGridColumnSchema` import and `subforms[].columns` member, + * objectui#11615's section-entry note and objectui#8347's past-tense notes) + * — `ObjectMapConfigSchema` `2370` -> `2388`, its ten-line declaration + * byte-identical and still closed with `.strict()`, and + * `LIST_VIEW_LOCAL_OVERRIDES` `1419` -> `1437`, the whole list byte-identical + * and still without `map`. The third is `case 'map':` in `ObjectView.tsx`, + * `2299` -> `2300`, the whole arm byte-identical: objectui#8347 grew one + * comment line above it. `ObjectMap.tsx` and `ListView.tsx` are + * byte-identical, so their anchors did not move. Each anchor quotes the line it was read at, * so the next pin bump reds instead of rotting * (`check:objectui-pin-citations`): * * - **The block this face feeds is FLATTENED, not forwarded.** `ListView` * (`packages/plugin-list/src/ListView.tsx:146` first line * `function resolveListMapConfig(schema: { map?: unknown; options?: { map?: unknown } }): Record {`) - * and `ObjectView` (`packages/plugin-view/src/ObjectView.tsx:2299` first line + * and `ObjectView` (`packages/plugin-view/src/ObjectView.tsx:2300` first line * `case 'map':`) copy it through a HAND-LISTED whitelist * (`packages/plugin-list/src/ListView.tsx:85` first line * `export const FLAT_MAP_CONFIG_SPELLING = {`) — ⚠️ re-read at the new pin: @@ -2186,7 +2198,7 @@ export const TreeConfigSchema = lazySchema(() => strictObject({ * there, but by a whitelist and in SILENCE: no parse, no warning, no * diagnostic of any kind. * - **The renderer's own zod schema does not close the set.** - * `packages/types/src/zod/objectql.zod.ts:2370` first line + * `packages/types/src/zod/objectql.zod.ts:2388` first line * `export const ObjectMapConfigSchema = z.object({` — a plain `z.object` at `dd3f7e1be`, * NOT strict, so an undeclared key parses clean there: zero issues, no * warning. ⚠️ At `db11afd49` the declaration is closed with `.strict()` @@ -2209,7 +2221,7 @@ export const TreeConfigSchema = lazySchema(() => strictObject({ * `db11afd49` it is closed by `.strict()` and still warn-only). And this parse is * the only * place an author is told ANYWHERE: `map` is not in objectui's - * `LIST_VIEW_LOCAL_OVERRIDES` (`packages/types/src/zod/objectql.zod.ts:1419` + * `LIST_VIEW_LOCAL_OVERRIDES` (`packages/types/src/zod/objectql.zod.ts:1437` * first line `const LIST_VIEW_LOCAL_OVERRIDES = [`), so objectui's own * `ListViewSchema` imports THIS block by reference and the document check on * that side is this same schema. The two key sets MIRROR each other, key for @@ -3267,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` = `2e818d0b5`, re-read 2026-10-04: `autoLayout.ts` and + * (`.objectui-sha` = `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 * `form.tsx` are byte-identical to `ab1879721` (`git diff --quiet`), so every * anchor held unmoved; at `ab1879721`, re-read 2026-10-03, they were * byte-identical to `89cad75d5`, so `resolveColSpan` `:154`, @@ -3316,7 +3331,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` = `2e818d0b51ec`), 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` = `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."), /** Custom widget override — only needed when auto-inference is insufficient */ widget: z.string().optional().describe('Custom widget/component name (overrides type-based inference)'), From 689bd1303472ec93b3476541ef1a42516a9e821b Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 5 Oct 2026 01:11:50 +0000 Subject: [PATCH 6/8] chore(objectui): state the ADR-0087 disposition of the pin range's declared-breaking entries Claude-Session: https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn Co-authored-by: Claude --- .changeset/console-9dfaca654311.md | 44 +++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/.changeset/console-9dfaca654311.md b/.changeset/console-9dfaca654311.md index f0e5b1e0f59..9a9073ed7dc 100644 --- a/.changeset/console-9dfaca654311.md +++ b/.changeset/console-9dfaca654311.md @@ -33,6 +33,48 @@ Derived from the changesets objectui declared over the range — 24 releasing of ⚠️ 4 of these carry a breaking change: 4 by the author's own breaking annotation in the changeset body — objectui declares no `major` inside a launch window (`scripts/check-changeset-no-major.mjs`). Each is marked **BREAKING** in the list above — read them before compiling the release record. - + objectui range: `2e818d0b51ec...9dfaca654311` From 39d7347ac85bf32cd1713c5fe07b6546e2f8efa9 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 5 Oct 2026 01:12:19 +0000 Subject: [PATCH 7/8] chore(spec): changeset for the pin-citation re-measure at 9dfaca654311 Claude-Session: https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn Co-authored-by: Claude --- .changeset/console-9dfaca654311.md | 3 ++- .../objectui-pin-citations-9dfaca654311.md | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 .changeset/objectui-pin-citations-9dfaca654311.md diff --git a/.changeset/console-9dfaca654311.md b/.changeset/console-9dfaca654311.md index 9a9073ed7dc..48c2c542cb9 100644 --- a/.changeset/console-9dfaca654311.md +++ b/.changeset/console-9dfaca654311.md @@ -70,7 +70,8 @@ Derived from the changesets objectui declared over the range — 24 releasing of carries its own record. (5) objectui#8347 (`b403bb36f`): `BaseSchema` loses its index signature, a TypeScript narrowing of objectui's node types; no code in this repository compiles against them, - and objectui's tolerant zod mirror keeps its accept set. + and objectui's zod faces keep their accept sets for every key but `visibleWhen`, which + widens on both to the `{ dialect, source }` envelope this repository's own parse writes. Where an entry mirrors an ObjectStack key, the ledger entry belongs to the `packages/spec` PR that lands it, never to the pin bump. Scope of the claim, stated rather than implied: it is a claim about THIS diff, not a diff --git a/.changeset/objectui-pin-citations-9dfaca654311.md b/.changeset/objectui-pin-citations-9dfaca654311.md new file mode 100644 index 00000000000..003051c1e93 --- /dev/null +++ b/.changeset/objectui-pin-citations-9dfaca654311.md @@ -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 `9dfaca654311`. + +Clause-②: no + +Every anchor was mapped through the objectui diff `2e818d0b51ec..9dfaca654311` and re-read at the new pin. One cited line changed: `ObjectKanban.tsx:10`, the type import, gained `SortConfig` beside the `ObjectKanbanSchema` the record cites. Every other change in a cited file sits outside the cited lines, and the anchors moved with their text byte-identical: + +- `plugin-grid/src/ObjectGrid.tsx`, `plugin-tree/src/ObjectTree.tsx`, `plugin-gantt/src/ObjectGantt.tsx`, `plugin-calendar/src/ObjectCalendar.tsx`, `react/src/SchemaRenderer.tsx`, `plugin-map/src/index.tsx`, `plugin-gantt/src/index.tsx` and `plugin-view/src/ObjectView.tsx`: objectui#8347 re-worded docblocks that described `BaseSchema`'s index signature. Anchors below those docblocks moved by at most three lines. +- `plugin-kanban/src/ObjectKanban.tsx`: objectui#8347 added a private `GateBoundKanbanSchema` read type above the board's fetch, so the fetch, the navigation reads and the spread into `KanbanBoardCore` moved by 30 lines. The board still reads `limit` and `navigation` as `ObjectKanbanSchema` declares them. +- `plugin-kanban/src/index.tsx`, `plugin-dashboard/src/index.tsx` and `react/src/element-data-source/ElementDataSourceGate.tsx`: objectui#11605 made `objectName` a non-required input and added the "no object named" hint. The `object-metric` icon input moved from `:281` to `:299`, and it is still `{ name: 'icon', type: 'string' }`. +- `components/src/renderers/layout/containers.tsx`: objectui#11619 added the record picture to the record chrome. The `page:tabs` and `page:accordion` icon anchors moved by three lines. +- `packages/types/src/objectql.ts` and `packages/types/src/zod/objectql.zod.ts`: objectui#11615, objectui#11266 and objectui#8347 grew declarations above the cited members. `ObjectKanbanSchema.limit`, `ObjectMapConfigSchema` and `LIST_VIEW_LOCAL_OVERRIDES` moved with their text byte-identical. + +The six migration entries' corpus counts were re-taken with `git grep -o -F`, the method that first reproduced every `2e818d0b51ec` number. The corpus is now 7632 tracked files. Every zero still reads zero; the three new `Span` hits are a `colSpan` in an objectui test. + +No key, default, enum member or export moves. From 4b9519ea23d31a3b7eb688f32bb52a895f8f7533 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 5 Oct 2026 01:17:10 +0000 Subject: [PATCH 8/8] docs(spec): regenerate the view reference for the re-pinned FormField.span describe Claude-Session: https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn Co-authored-by: Claude --- content/docs/references/ui/view.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/docs/references/ui/view.mdx b/content/docs/references/ui/view.mdx index 3095d2ddad4..405a2e4005f 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` = `2e818d0b51ec`), 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` = `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. | | **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` = `2e818d0b51ec`), 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` = `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. | | **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 |