From f3f986df79c4fffed666f55ef4a180ff3c4ae0cf Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 4 Oct 2026 07:53:32 +0000 Subject: [PATCH 1/6] chore(objectui): bump the console pin to 2e818d0b51ec Written by scripts/bump-objectui.sh 2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6 --no-commit. Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv Co-authored-by: Claude --- .changeset/console-2e818d0b51ec.md | 40 ++++++++++++++++++++++++++++++ .objectui-sha | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 .changeset/console-2e818d0b51ec.md diff --git a/.changeset/console-2e818d0b51ec.md b/.changeset/console-2e818d0b51ec.md new file mode 100644 index 00000000000..46f095992a4 --- /dev/null +++ b/.changeset/console-2e818d0b51ec.md @@ -0,0 +1,40 @@ +--- +"@objectstack/console": minor +--- + +Console (objectui) refreshed to `2e818d0b51ec`. Frontend changes in this range: + +Derived from the changesets objectui declared over the range — 17 releasing of 18 changesets added across 22 non-merge commits; omitted: 1 release-nothing changeset, 6 commits carrying no changeset (they ship no package code). + +- **minor** — `FlexBlockNode`, the TypeScript type of an authored `flex` node, types its bag's child list as nodes: `properties.children` is `SchemaNode | SchemaNode[]`, where it was `unknown[]… (objectui `b10c68e58`) +- **minor** — The dashboards' metric card node, `plugin-dashboard:metric`, is a declared node type, and both dashboard surfaces hand `SchemaRenderer` declared nodes with no cast (objectui#11466… (objectui `83e3f8377`) +- **minor** — **BREAKING** — **An `object-metric` node in a dashboard widget's legacy `component` envelope now draws the retired-format prompt instead of its number (objectui#11466).** This follows the mainta… (objectui `83e3f8377`) +- **minor** — **BREAKING** — A node slot and `SchemaRenderer`'s `schema` prop take the union of the declared node types, `DeclaredNode` (objectui#11466). (objectui `83e3f8377`) +- **minor** — `safeValidateSchema`, and so `objectui validate`, accepts `record:line_items`, the last ADR-0080 public block it refused at `type` (objectui#10872). `@objectstack/spec` 17.6.0 car… (objectui `8d0ca9183`) +- **minor** — `ObjectKanbanSchema.grouping` is declared on both faces, as `@objectstack/spec`'s `GroupingConfig`, by reference (objectui#11216). (objectui `a7557a7d4`) +- **patch** — The dashboard surfaces read every `widgets[]` entry without leaning on `BaseSchema`'s index signature: a widget key is read on the widget arm alone, and the `chart` node is built… (objectui `2e818d0b5`) +- **patch** — A refused save, pin, reorder, view setting, report save, publish or discard in the console is now said to the user, and the view-config panel no longer reports a refused save as s… (objectui `e8c0b9614`) +- **patch** — The `object-grid` summary footer reads `currency`, `defaultCurrency`, `precision` and `scale` from the object field only. A column that carries one of these keys no longer changes… (objectui `d768c3178`) +- **patch** — fix(types): `AnyComponentSchema`'s declaration prints every category union by name, so `@object-ui/types` no longer sits at the edge of TypeScript's serialization ceiling (objectu… (objectui `bdc9049ed`) +- **patch** — "Save as view" now saves a Kanban view the platform accepts, and both Create View doors save the same view from the same dialog choices (objectui#11581). (objectui `b65aa5e65`) +- **patch** — The console and runner stylesheets compile only from their declared `@source` lines. Tailwind's automatic source detection is now off (`source(none)`), as it already was for `@obj… (objectui `5a2ca6b12`) +- **patch** — A refused view save is now said to the user, and the Create View dialog no longer closes as if the view were saved (objectui#11578). (objectui `f1c937966`) +- **patch** — The console's Create View dialog now creates chart views the platform accepts (objectui#11576). (objectui `d0097af2e`) +- **patch** — fix(plugin-grid): switching a server-grouped grid's grouping field shows exactly the new field's groups (objectui `2f54dca53`) +- **patch** — fix(app-shell): an interface page relays its source view's `tree` and `chart` blocks, and its own `allowPrinting` (objectui#11572) (objectui `09036173c`) +- **patch** — A stored list view now renders the same on an interface page and on the object page when it carries a legacy `options` bag (objectui#10380). (objectui `068564691`) + +⚠️ 2 of these carry a breaking change: 2 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. + +**In this console build, declared nowhere** — objectui merged 6 commits in this range with no `.changeset/*.md`. The code is inside the pin above and ships here, but nothing upstream declared them, so they appear in no objectui CHANGELOG and in no entry above. Listed by subject rather than counted, because a count cannot tell a dependency bump from a form-behaviour change (objectstack#6174); the upstream gate that would prevent this is objectui#3387. + +- _(no changeset)_ fix(release): the publish lane pushes the version's git tags and creates its GitHub Releases itself — changesets/action@v1 finds no `New tag:` line under CLI v3 (objectui#11596) (… (objectui `973fc20f3`) +- _(no changeset)_ docs(skills): `schema-expressions.md` states `{ condition, style }` as the only authorable conditional-formatting rule on every list carrier (objectui#11534) (#11595) (objectui `94985a92b`) +- _(no changeset)_ chore: release packages (#5400) (objectui `b493919c7`) +- _(no changeset)_ docs(plugin-detail): the reference-rail README says `entries` go in the `properties` bag, and that the validator refuses a flat one (objectui#10872) (#11584) (objectui `7a7660c65`) +- _(no changeset)_ docs(skills): the page-builder guide's object-form example names its fields; a per-form override goes on a section entry (objectui#11550) (#11561) (objectui `0a53c67f9`) +- _(no changeset)_ docs(skills): type three marked fences' schema as SchemaRendererProps['schema'] (objectui#11543) (#11558) (objectui `5cde2c6fe`) + + + +objectui range: `ab1879721595...2e818d0b51ec` diff --git a/.objectui-sha b/.objectui-sha index 3638e699372..2986d77d7f1 100644 --- a/.objectui-sha +++ b/.objectui-sha @@ -1 +1 @@ -ab187972159583b595facdcae3c73b50f6f312e9 +2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6 From 33406f3994b48344de93a93d2299c88ff15b2735 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 4 Oct 2026 08:00:58 +0000 Subject: [PATCH 2/6] chore(spec): re-measure the six migration entries' objectui corpus citations at 2e818d0b5 Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv 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 fdc2f388168..93df61c9aee 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` = `ab187972159583b595facdcae3c73b50f6f312e9` — names ' + + 'against, `.objectui-sha` = `2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6` — 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 10267 tracked files (0 across 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 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 ' + '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 and to 16377 and 6665 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 and to 17227 and 7134 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 401b8853500..9aec71ff7f5 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` = `ab187972159583b595facdcae3c73b50f6f312e9`, re-read from this tree — ' + + '`.objectui-sha` = `2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6`, re-read from this tree — ' + 'spells resourceLimits.timeout 0 times across ' - + '10267 tracked files, against lit controls timeout 1348, RuntimeConfig 273 and resourceLimits ' - + '2 on the same corpus (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 ' + + '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 ' + '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 644fddbec7b..326d526fdc1 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` = `ab187972159583b595facdcae3c73b50f6f312e9` — spells ' + + 'objectui checkout — `.objectui-sha` = `2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6` — spells ' + '`flushInterval` 0 times, `initialDelay` 0, `HttpDestinationConfig` 0 and `LoggingConfig` 0 ' - + 'across its 10267 tracked files, against lit controls `useState` 2476 and `timeout` 1348 on ' - + 'the same corpus (all four 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 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, ' + '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 d7beded6b88..85e706e0052 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` = `ab187972159583b595facdcae3c73b50f6f312e9`, re-read from this tree — ' - + 'spells all six metrics def names and both distinctive keys 0 times across 10267 tracked ' - + 'files at that sha, against lit controls window 4044, timeout 1348, period 231, ' - + 'interval 196 and metrics 354 on that same corpus and sha (0 across 10071, against 4002 / ' + + '`.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 / ' + + '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 / ' + '1293 / 233 / 196 / 352, at e420df310, 0 across 9546, against 3772 / ' 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 58eb991ac8c..70f9b789b66 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` = `ab187972159583b595facdcae3c73b50f6f312e9` — names none of it: all 37 exports of ' - + 'tracing.zod.ts and each of the four key names occur 0 times across the 10267 files ' - + 'tracked at that sha (the 491 Span and 56 SpanSchema hits are objectui\'s own HTML ' + + '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 ' + 'text-span component, TextSpanSchema, an unrelated name, plus colSpan and prose), against ' - + 'two lit controls on that same corpus and sha: 16377 hits for the bare token objectstack, ' - + 'and 6665 for the package specifier @objectstack/spec (at 89cad75d5: 0 across 10071, Span 489, ' + + '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, ' + + '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, ' + '15352 and 6024; at db11afd49: 0 across 9546, 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 6570ecafba4..28889d2c1b2 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` = `ab187972159583b595facdcae3c73b50f6f312e9` — spells it 0 ' - + 'times across 10267 tracked files, against lit controls `TTL` 180 and `tenant` 1238 on the ' - + 'same corpus (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` = `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 ' + '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 6e4aed70f79..538011118bd 100644 --- a/packages/spec/src/migrations/registry.ts +++ b/packages/spec/src/migrations/registry.ts @@ -14072,13 +14072,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` = `ab187972159583b595facdcae3c73b50f6f312e9` — names ' + + 'against, `.objectui-sha` = `2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6` — 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 10267 tracked files (0 across 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 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 ' + '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 and to 16377 and 6665 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 and to 17227 and 7134 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 ' @@ -14283,10 +14283,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` = `ab187972159583b595facdcae3c73b50f6f312e9`, re-read from this tree — ' + + '`.objectui-sha` = `2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6`, re-read from this tree — ' + 'spells resourceLimits.timeout 0 times across ' - + '10267 tracked files, against lit controls timeout 1348, RuntimeConfig 273 and resourceLimits ' - + '2 on the same corpus (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 ' + + '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 ' + '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.', @@ -14522,10 +14522,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` = `ab187972159583b595facdcae3c73b50f6f312e9` — spells ' + + 'objectui checkout — `.objectui-sha` = `2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6` — spells ' + '`flushInterval` 0 times, `initialDelay` 0, `HttpDestinationConfig` 0 and `LoggingConfig` 0 ' - + 'across its 10267 tracked files, against lit controls `useState` 2476 and `timeout` 1348 on ' - + 'the same corpus (all four 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 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, ' + 'against 2391 and 1096, at f8a9d0fb0, and 0 across ' + '8303, against 2389 and 1086, at 62597c588).', acceptanceCriteria: @@ -18288,10 +18288,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` = `ab187972159583b595facdcae3c73b50f6f312e9`, re-read from this tree — ' - + 'spells all six metrics def names and both distinctive keys 0 times across 10267 tracked ' - + 'files at that sha, against lit controls window 4044, timeout 1348, period 231, ' - + 'interval 196 and metrics 354 on that same corpus and sha (0 across 10071, against 4002 / ' + + '`.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 / ' + + '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 / ' + '1293 / 233 / 196 / 352, at e420df310, 0 across 9546, against 3772 / ' @@ -18508,12 +18509,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` = `ab187972159583b595facdcae3c73b50f6f312e9` — names none of it: all 37 exports of ' - + 'tracing.zod.ts and each of the four key names occur 0 times across the 10267 files ' - + 'tracked at that sha (the 491 Span and 56 SpanSchema hits are objectui\'s own HTML ' + + '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 ' + 'text-span component, TextSpanSchema, an unrelated name, plus colSpan and prose), against ' - + 'two lit controls on that same corpus and sha: 16377 hits for the bare token objectstack, ' - + 'and 6665 for the package specifier @objectstack/spec (at 89cad75d5: 0 across 10071, Span 489, ' + + '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, ' + + '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, ' + '15352 and 6024; at db11afd49: 0 across 9546, Span 486, ' @@ -18624,9 +18626,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` = `ab187972159583b595facdcae3c73b50f6f312e9` — spells it 0 ' - + 'times across 10267 tracked files, against lit controls `TTL` 180 and `tenant` 1238 on the ' - + 'same corpus (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` = `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 ' + 'and 987, at 62597c588).', acceptanceCriteria: 'Every schema-level tenant isolation source spells `performance.schemaCacheTtlSeconds`; ' From bc8a5820ac5a0610126c313af1b1b51d9a6d14b6 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 4 Oct 2026 08:04:35 +0000 Subject: [PATCH 3/6] chore(spec): re-measure the objectui pin citations at 2e818d0b5 Every asserting citation moves to the new pin with its anchors re-mapped through the ab1879721..2e818d0b5 diff; the object-metric icon input and registration move by 12 in plugin-dashboard/src/index.tsx, every other cited file is byte-identical or changed away from the cited lines. Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv Co-authored-by: Claude --- .../api-methods-batch-conformance.test.ts | 7 +- .../src/kernel/functional-completeness.ts | 19 +- .../src/ui/action-outcome-messages.test.ts | 3 +- packages/spec/src/ui/action.zod.ts | 4 +- packages/spec/src/ui/component.test.ts | 40 ++++- packages/spec/src/ui/component.zod.ts | 164 +++++++++++++----- packages/spec/src/ui/dataset.zod.ts | 5 +- packages/spec/src/ui/view.zod.ts | 8 +- 8 files changed, 190 insertions(+), 60 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 2d3aca11af8..ccb6593e846 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,11 @@ 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` = `ab1879721`, `packages/plugin-grid`; re-measured at - // that pin, 2026-10-03. On the hop off `89cad75d5`, `ObjectGrid.tsx` changed + // (`.objectui-sha` = `2e818d0b5`, `packages/plugin-grid`; re-measured at + // that pin, 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 // again (74 insertions, 11 deletions: objectui#11544's group-header labels // read from the object field's `options` only, objectui#11475's percent // storage `max` copied onto the cell's field meta on three paths and one diff --git a/packages/spec/src/kernel/functional-completeness.ts b/packages/spec/src/kernel/functional-completeness.ts index 626a2825633..05b9710ae11 100644 --- a/packages/spec/src/kernel/functional-completeness.ts +++ b/packages/spec/src/kernel/functional-completeness.ts @@ -287,7 +287,10 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] { * English sentence. So the loss is total rather than partial — every * record, on every object — and the author is told at render time as well * as here. Both reads hold at the pin this repo builds against - * (`.objectui-sha` = `ab1879721`, re-read 2026-10-03: on the hop off + * (`.objectui-sha` = `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 * `89cad75d5` `ObjectCalendar.tsx` changed in one comment line only, line * for line (`:1250`, objectui#11438 re-citing the installed spec as * 17.6.0), so `getCalendarConfig` `:294`, the `if (!calendarConfig)` arm @@ -344,8 +347,10 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] { * This repo already records the same deletion one door over: the #13817 * check in `../ui/view.zod.ts` names objectui#7029 as its runtime half. * - `gantt` → NO fallback, and no silence [#19630]. Measured at the pin - * this repo builds against (`.objectui-sha` = `ab1879721`, re-read - * 2026-10-03; on the hop off `89cad75d5` `ObjectGantt.tsx` changed (8 + * this repo builds against (`.objectui-sha` = `2e818d0b5`, re-read + * 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 * argument on the tooltip's `percent` row), none of it in `getGanttConfig` * or the refusal arm, which are byte-identical and moved `:608` → `:609` @@ -398,7 +403,9 @@ 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` = - * `ab1879721`; on the hop off `89cad75d5` `ObjectTimeline.tsx` is + * `2e818d0b5`; `ObjectTimeline.tsx` and `ListView.tsx` are byte-identical + * across the hop off `ab1879721`, so every anchor held unmoved; 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 * `resolveTimelineDateBinding` are byte-identical, moved by 14 and by 9 @@ -444,7 +451,9 @@ 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` = `ab1879721`; on the hop off `89cad75d5` + * 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` * `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 3bbe14f758e..c188d12b5c8 100644 --- a/packages/spec/src/ui/action-outcome-messages.test.ts +++ b/packages/spec/src/ui/action-outcome-messages.test.ts @@ -12,7 +12,8 @@ * 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` = - * `ab1879721`; `ActionRunner.composeSuccessMessage`), where the ledger row + * `2e818d0b5`; `ActionRunner.composeSuccessMessage`, in + * `core/src/actions/ActionRunner.ts`, byte-identical to `ab1879721`), 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 d2c988a7d21..d6b0a4cbbb2 100644 --- a/packages/spec/src/ui/action.zod.ts +++ b/packages/spec/src/ui/action.zod.ts @@ -1364,7 +1364,9 @@ 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` = - * `ab1879721`, read 2026-10-03). The reader is objectui#11344 (objectui + * `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 * `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 216b90c947b..1d3c90e30ba 100644 --- a/packages/spec/src/ui/component.test.ts +++ b/packages/spec/src/ui/component.test.ts @@ -288,8 +288,11 @@ describe('PageAccordionProps variant (#6776)', () => { // same file's `ComponentRegistry.register('accordion', …)` publishes the key to // the Studio block designer at `:1219` (the `items` input, documented as // `[{ label, icon?, collapsed?, children }]`). Measured at the pin this repo -// builds against — `.objectui-sha` = `ab1879721`. Re-derived at that pin -// 2026-10-03: `containers.tsx` changed across the hop from `89cad75d5` (23 +// builds against — `.objectui-sha` = `2e818d0b5`. Re-derived at that pin +// 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` (23 // insertions, 27 deletions: objectui#11445's i18next count family for the // `page:tabs` count badge, and objectui#11438 dropping the `page:header` // registration's inert `breadcrumb` input), so both anchors were re-READ rather @@ -422,8 +425,11 @@ describe('PageTabsProps items[].value / items[].count (#5775)', () => { // same file's `ComponentRegistry.register('tabs', …)` publishes the key to the // Studio block designer at `:1004` (the `items` input, documented as // `[{ label, value?, icon?, count?, visibleWhen?, children }]`). Measured at -// the pin this repo builds against — `.objectui-sha` = `ab1879721`. Re-derived at -// that pin 2026-10-03: `containers.tsx` changed across the hop from `89cad75d5` +// 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 +// 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` // (23 insertions, 27 deletions: objectui#11445's i18next count family, which // rewrote the tab-count translation table above both anchors and the count // badge's `aria-label` between them, and objectui#11438 dropping the @@ -3664,7 +3670,15 @@ 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` = `ab1879721`; re-measured there 2026-10-03 — +// against (`.objectui-sha` = `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` / +// `:97` / `487-491` did not move; `plugin-kanban.mdx` gained a `grouping` +// Properties row below the `limit` row (objectui#11216) and still teaches +// `limit: 250`; `objectql.ts` changed only below the member (objectui#11216's +// `grouping` declaration on `ObjectKanbanSchema`), so `:4720` did not move. +// At `ab1879721`, re-measured there 2026-10-03 — // `plugin-kanban/src/types.ts`, `ObjectKanban.tsx` and `plugin-kanban.mdx` are // byte-identical to `89cad75d5` (`git diff --quiet`), so `types.ts` still // declares no `limit`, `:722` / `:97` did not move and were re-read in place, @@ -3808,7 +3822,10 @@ describe('ObjectKanbanPropsSchema limit — the row cap four objectui faces alre // since retired that block, objectui#8257). Unlike `limit` above — a key four // objectui faces already implemented, so the spec was the half that was wrong // — `quickAdd` was FORWARDED and never read: at the pin this repo builds -// against (`.objectui-sha` = `ab1879721`; re-measured there 2026-10-03 — +// against (`.objectui-sha` = `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 — // `KanbanBoardCore.tsx` and `ObjectKanban.tsx` are byte-identical to // `89cad75d5` (`git diff --quiet`), so `:78`, `:111-112` and the spread // `:1639` did not move and were re-read in place, and the counts re-read the @@ -3958,7 +3975,10 @@ describe('ObjectKanbanPropsSchema quickAdd is retired (#17260)', () => { // #9881 and commit 60e0f900a recorded the accordion and tab items; these two close the set. // // The button record re-measured at the pin this repo builds against — -// `.objectui-sha` = `ab1879721`, re-derived there 2026-10-03: `button.tsx`, +// `.objectui-sha` = `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`, // `lazy-icon.tsx`, `resolve-icon.ts` and the generated // `lucide-record-icon-names.ts` are byte-identical to `89cad75d5` // (`git diff --quiet`), so every anchor below holds unmoved and was re-read in @@ -4116,7 +4136,11 @@ 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` = `ab1879721`; re-measured there 2026-10-03 — +// (`.objectui-sha` = `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 +// 2026-10-03 — // `ObjectMap.tsx`, `ObjectTree.tsx` and `record-source.ts` are byte-identical // across the hop off `89cad75d5` (`git diff --quiet`), so every anchor in them // held unmoved; `ObjectGantt.tsx` +8/-0 gained one import line and, in the diff --git a/packages/spec/src/ui/component.zod.ts b/packages/spec/src/ui/component.zod.ts index b3bba43a354..73aef275659 100644 --- a/packages/spec/src/ui/component.zod.ts +++ b/packages/spec/src/ui/component.zod.ts @@ -815,8 +815,11 @@ export const PageTabsProps = strictObject({ * false candidate a component over). * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `ab1879721`; re-derived at that pin 2026-10-03 — - * `containers.tsx` changed across the hop from `89cad75d5` (23 insertions, + * (`.objectui-sha` = `2e818d0b5`; re-derived at that pin 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 + * across the hop from `89cad75d5` (23 insertions, * 27 deletions: objectui#11445's i18next count family, which rewrote the * tab-count translation table above both anchors and the count badge's * `aria-label` between them, and objectui#11438 dropping the `page:header` @@ -1023,7 +1026,10 @@ export const PageCardProps = strictObject({ * declarations identical. * * Each clause is read off the objectui pin this repo builds against - * (`.objectui-sha` = `ab1879721595`, re-read there 2026-10-03: across the hop + * (`.objectui-sha` = `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 * from `89cad75d5570` all four `record-*.tsx` renderers and the three * `permissions` files are byte-identical (`git diff --quiet`), so NO anchor * below moved, and each was re-read in place. At `89cad75d5570`, 2026-10-02: across the hop @@ -2313,8 +2319,11 @@ export const PageAccordionProps = strictObject({ * re-derive the same false candidate). * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `ab1879721`; re-derived at that pin 2026-10-03 — - * `containers.tsx` changed across the hop from `89cad75d5` (23 insertions, + * (`.objectui-sha` = `2e818d0b5`; re-derived at that pin 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 + * across the hop from `89cad75d5` (23 insertions, * 27 deletions: objectui#11445's i18next count family for the `page:tabs` * count badge, and objectui#11438 dropping the `page:header` * registration's inert `breadcrumb` input below both anchors), so both @@ -2643,10 +2652,13 @@ export const ElementButtonPropsSchema = lazySchema(() => strictObject({ * the button. * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `ab1879721`; re-derived at that pin 2026-10-03 — + * (`.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 `89cad75d5` - * across the hop onto this pin, so every anchor below holds unmoved and was + * 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 + * 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 * re-checked in place; they were byte-identical to `31971ff1e` across the hop * onto `89cad75d5` (2026-10-02), byte-identical to `e420df310` across the hop * onto `31971ff1e` (2026-10-01), byte-identical to `db11afd49` across the hop @@ -3119,9 +3131,11 @@ export const ElementTextInputPropsSchema = lazySchema(() => strictObject({ * had no row for — `action:button`, `action:group`, `action:menu`, * `action:icon`, `element:definition-list`, `element:repeater` * (`core/src/registry/public-blocks.ts:117-122` at the pin this repo builds - * against, `.objectui-sha` = `ab1879721`; first measured at `.objectui-sha` + * against, `.objectui-sha` = `2e818d0b5`; first measured at `.objectui-sha` * pin `f8a9d0fb0`, every read point below re-derived at the current pin - * 2026-10-03: `public-blocks.ts`, `auto-trigger.ts`, `static-params.ts`, + * 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` * (`git diff --quiet`), so their anchors held unmoved and were re-read in * place, and all four `action-*.tsx` renderers changed in one way: @@ -3974,10 +3988,12 @@ 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` = `ab1879721`, 2026-10-03): - * the BUILD landed — objectui `154075ab1` (objectui#11068), inside + * pin this repo builds against (`.objectui-sha` = `2e818d0b5`, 2026-10-04; + * `ObjectGrid.tsx` and `data-table.tsx` are 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 this pin, against 3 for the + * 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` * hands `schema.keyboardNavigation ?? inlineEditable` to the `data-table` it * renders, and `components/src/renderers/complex/data-table.tsx` acts on it. @@ -4057,7 +4073,8 @@ 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` - * = `ab1879721`, re-measured 2026-10-03): objectui#11227 (carried by objectui + * = `2e818d0b5`, re-measured 2026-10-04: `ObjectGrid.tsx` is 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 @@ -4438,8 +4455,10 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({ * `ComponentPropsMap` key. This record said to drop the marker in the change * that lands the BUILD at the pin, and it is dropped here. * - * Read at the pin this repo builds against (`.objectui-sha` = `ab1879721`, - * re-measured 2026-10-03; the BUILD is objectui `154075ab1`, objectui#11068): + * Read at the pin this repo builds against (`.objectui-sha` = `2e818d0b5`, + * re-measured 2026-10-04: `ObjectGrid.tsx` and `data-table.tsx` are + * 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 * `keyboardNavigation: schema.keyboardNavigation ?? inlineEditable`, where * `inlineEditable` (`:1812`) is the authored `editable` AND the viewer's @@ -4805,7 +4824,16 @@ 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` = `ab1879721`; re-derived at that pin 2026-10-03 — + * (`.objectui-sha` = `2e818d0b5`; re-derived at that pin 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) + * gained objectui#11466's `DashboardMetricNodeSchema` type export, its + * declared-node comment on the bare `metric` registration and a re-worded + * `ObjectMetricBlock` docblock sentence, all above the `object-metric` + * registration, so its start MOVED `244` -> `256` and the icon input `269` + * -> `281`, both byte-identical, still `{ name: 'icon', type: 'string' }`. + * At `ab1879721`, re-derived there 2026-10-03 — * `MetricCard.tsx` and `lazy-icon.tsx` are byte-identical to `89cad75d5`, * so their anchors hold unmoved and were re-read in place; the other three * files changed and every one of their anchors MOVED with its cited text @@ -4865,7 +4893,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:269` publishes it as a designer input + * `plugin-dashboard/src/index.tsx:281` 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 @@ -5017,9 +5045,12 @@ 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` = `ab1879721`; re-measured there 2026-10-03 — - * `ObjectKanban.tsx` is byte-identical across the hop from `89cad75d5` - * (`git diff --quiet`), so the anchor did not move and was re-read in place. + * (`.objectui-sha` = `2e818d0b5`; re-measured there 2026-10-04 — + * `ObjectKanban.tsx` is 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 + * re-read in place. * At `89cad75d5` (2026-10-02) `ObjectKanban.tsx` was byte-identical across * the hop from `31971ff1e` (`git diff --quiet`), so the anchor did not move * and was re-read in place. At `31971ff1e` (2026-10-01) @@ -5106,8 +5137,16 @@ 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` = `ab1879721`; re-measured there - * 2026-10-03 — `ObjectKanban.tsx`, `plugin-kanban/src/types.ts` (still no + * repo builds against (`.objectui-sha` = `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 + * anchor in them held unmoved; `plugin-kanban.mdx` gained a `grouping` + * Properties row below the `limit` row (objectui#11216), which, with the + * `limit: 250` snippet, did not change; and `objectql.ts` changed only below + * the member (objectui#11216's `grouping` declaration on + * `ObjectKanbanSchema`), so `:4720` did not move. At `ab1879721`, + * re-measured there 2026-10-03 — `ObjectKanban.tsx`, `plugin-kanban/src/types.ts` (still no * row-cap member), `ElementDataSourceGate.tsx`, `element-data-source.ts` * and `plugin-kanban.mdx` are byte-identical to `89cad75d5`, so the query * `715-725`, the default `:97`, the `queryFilter` resolution `:584-585`, @@ -5316,7 +5355,10 @@ 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` = `ab1879721`; re-measured there 2026-10-03 — + * (`.objectui-sha` = `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 — * `KanbanBoardCore.tsx` and `ObjectKanban.tsx` are byte-identical to * `89cad75d5`, so `:78` and `:1639` did not move and were re-read in place; * `KanbanImpl.tsx` changed only in two comments above the gate @@ -5432,8 +5474,10 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ * element schemas). * * Measured at the pin this repo builds against (`.objectui-sha` = - * `ab1879721`; re-measured there 2026-10-03 — `ObjectKanban.tsx` and - * `useNavigationOverlay.ts` are byte-identical to `89cad75d5` + * `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` * (`git diff --quiet`), so every anchor held unmoved and was re-read in * place: the read `1280`, the hand-off `1288-1289`, the overlay render * `1538` and its `NavigationOverlay` `1554-1567`, and the card click @@ -5617,7 +5661,10 @@ export const ObjectCalendarPropsSchema = lazySchema(() => strictObject({ * `object-kanban`'s above. * * Measured at the pin this repo builds against (`.objectui-sha` = - * `ab1879721`; re-measured there 2026-10-03 — `ObjectCalendar.tsx` changed + * `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 * across the hop from `89cad75d5` in one comment line only, line for line * (`:1250`, objectui#11438 re-citing the installed spec as 17.6.0), and * `useNavigationOverlay.ts` is byte-identical, so every anchor held unmoved @@ -6176,8 +6223,10 @@ const OBJECT_MAP_FLAT_CONFIG_GUIDANCE: readonly KeySetGuidance[] = [ /** * `object-map` (objectui `plugin-map/src/ObjectMap.tsx` plus the registry shell * `plugin-map/src/index.tsx`, read at the pin this repo builds against — - * `.objectui-sha` = `ab1879721`, re-measured there 2026-10-03: `ObjectMap.tsx`, + * `.objectui-sha` = `2e818d0b5`, re-measured there 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 * the hop from `89cad75d5` (`git diff --quiet`), so every anchor held unmoved * and was re-read in place. At `89cad75d5` (2026-10-02) all three * files changed across the hop from `31971ff1e`, so every anchor was @@ -6342,7 +6391,10 @@ export const ObjectMapPropsSchema = lazySchema(() => strictObject({ * Base query filter — the `ViewFilterRule` ARRAY form, the one filter * orthography every `filter` door in this map shares (ui#6206-B reaching the * `object-*` family: #15449, decision batch #55, option A). Measured at the - * pin this repo builds against (`.objectui-sha` = `ab1879721`, re-READ there + * pin this repo builds against (`.objectui-sha` = `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 * 2026-10-03: `ObjectMap.tsx` and `plugin-map/src/index.tsx` are * byte-identical to `89cad75d5` (`git diff --quiet`), so all three anchors * and the `filter` input held unmoved and were re-read in place. At @@ -6390,7 +6442,10 @@ export const ObjectMapPropsSchema = lazySchema(() => strictObject({ * Marker order — the `SortItem` ARRAY form, the one sort orthography every * DECLARED `sort` door on this platform carries (objectui#8221, decision batch * #77, option B). Measured at the pin this repo builds against - * (`.objectui-sha` = `ab1879721`, re-READ there 2026-10-03 — `ObjectMap.tsx` + * (`.objectui-sha` = `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` * and `plugin-map/src/index.tsx` are byte-identical to `89cad75d5` * (`git diff --quiet`), so both anchors and the `sort` input held unmoved * and were re-read in place. At `89cad75d5`, re-READ there 2026-10-02 — @@ -6513,7 +6568,10 @@ const OBJECT_GANTT_FLAT_CONFIG_GUIDANCE: readonly KeySetGuidance[] = [ /** * `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` = `ab1879721`, re-measured there 2026-10-03: + * — `.objectui-sha` = `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: * `plugin-gantt/src/index.tsx` and `record-source.ts` are byte-identical to * `89cad75d5` (`git diff --quiet`), so their anchors held unmoved; and * `ObjectGantt.tsx` +8/-0 gained one import line above `getGanttConfig` and, @@ -6727,7 +6785,10 @@ export type ObjectGanttPropsParsed = z.infer; * they flatten `options.tree` (`ListView.tsx:3770-3789`, `case 'tree'`: the * product carries these keys, the EFFECTIVE `filter` objectui#10250 added, and * NO `tree` key). Both halves re-READ at the - * pin this repo builds against (`.objectui-sha` = `ab1879721`) on 2026-10-03 — + * pin this repo builds against (`.objectui-sha` = `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 — * `ObjectTree.tsx` and `plugin-tree/src/index.tsx` are byte-identical to * `89cad75d5`, so `281-294` and `233-254` did not move and were re-read in * place; `ListView.tsx` changed around its `case 'tree'` arm (+36/-18: @@ -6805,7 +6866,10 @@ const OBJECT_TREE_FLAT_CONFIG_GUIDANCE: readonly KeySetGuidance[] = [ /** * `object-tree` (objectui `plugin-tree/src/ObjectTree.tsx` plus the registry * shell `plugin-tree/src/index.tsx`, read at the pin this repo builds against - * — `.objectui-sha` = `ab1879721`, re-measured there 2026-10-03: + * — `.objectui-sha` = `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: * `plugin-tree/src/index.tsx`, `ObjectTree.tsx` and * `core/src/utils/record-source.ts` are byte-identical to `89cad75d5` * (`git diff --quiet`), so every anchor held unmoved and was re-read in @@ -6963,7 +7027,11 @@ 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` = `ab1879721`, re-COUNTED there 2026-10-03 by + * builds against (`.objectui-sha` = `2e818d0b5`, re-COUNTED there 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`; + * re-COUNTED at `ab1879721` 2026-10-03 by * the same method — 0 for the tree, whose shell is byte-identical across the * hop, 3 each for `plugin-gantt` and `plugin-calendar` (both byte-identical) * and `plugin-grid` (changed on the hop: objectui#11068's @@ -7095,7 +7163,10 @@ const OBJECT_TIMELINE_FLAT_CONFIG_GUIDANCE: readonly KeySetGuidance[] = [ * `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` = `ab1879721`), re-measured there + * repo builds against (`.objectui-sha` = `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 * 2026-10-03: `ObjectTimeline.tsx`, `renderer.tsx` and `index.tsx` are * byte-identical to `89cad75d5` (`git diff --quiet`), so every anchor held * unmoved and was re-read in place, and the `schema.*` read set of all three @@ -7291,7 +7362,15 @@ 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` = - * `ab1879721`, re-READ there 2026-10-03 — the file, `SchemaRenderer.tsx` + * `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 + * `SchemaRendererProps` docblock and `schema` type only (`DeclaredNode` in + * place of `BaseSchema | AuthoringNode`), not in the `properties.*` hoist, + * its strip list or the `createElement` spread, so the prop channel above + * still carries the key. At `ab1879721`, re-READ there 2026-10-03 — the + * file, `SchemaRenderer.tsx` * and `record-source.ts` are byte-identical across the hop from * `89cad75d5` (`git diff --quiet`), so every anchor held unmoved and was * re-read in place, and the prop channel above still carries the key. At @@ -7552,7 +7631,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` = - // `ab1879721`; re-measured there 2026-10-03: `data-list.tsx`, + // `2e818d0b5`; re-measured there 2026-10-04: all four files below are + // 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 // byte-identical to `89cad75d5` (`git diff --quiet`), so every anchor below // holds unmoved and was re-read in place, both registrations still in the @@ -7614,7 +7695,9 @@ 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` = - // `ab1879721`), all three re-measured there 2026-10-03 (`ObjectMap.tsx` and + // `2e818d0b5`), all three re-measured there 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` // (+8/-0) gained one import line and, in its tooltip's `percent` row, // objectui#11475's scaling at the field definition's declared storage — a @@ -7666,7 +7749,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` = - // `ab1879721`), re-measured there 2026-10-03 (`renderer.tsx`, + // `2e818d0b5`), re-measured there 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`, // `ObjectTimeline.tsx` and `index.tsx` byte-identical to `89cad75d5`, so // every anchor held unmoved, the `schema.*` read set unchanged and no // declared key set moved. At `89cad75d5`, 2026-10-02: `renderer.tsx` diff --git a/packages/spec/src/ui/dataset.zod.ts b/packages/spec/src/ui/dataset.zod.ts index 370691ef0ed..b1ef9ba7b48 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` = - * `ab1879721`; re-derived at that pin 2026-10-03 — `date-display.ts` is + * `2e818d0b5`; re-derived at that pin 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 * byte-identical to `89cad75d5`, so `formatDate` `445-480` and the ±7-day * fallback `399` held unmoved and were re-READ in place; `dataset-format.ts` * changed (+53/-36, objectui#11475: `scalePercent` scales at the storage diff --git a/packages/spec/src/ui/view.zod.ts b/packages/spec/src/ui/view.zod.ts index 68d2bb9d652..ad06fd73b64 100644 --- a/packages/spec/src/ui/view.zod.ts +++ b/packages/spec/src/ui/view.zod.ts @@ -3267,8 +3267,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` = `ab1879721`, re-read 2026-10-03: `autoLayout.ts` and - * `form.tsx` are byte-identical to `89cad75d5`, so `resolveColSpan` `:154`, + * (`.objectui-sha` = `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`, * `WIDE_FIELD_TYPES` `:58-69`, `spanLadderFor` `:204-231` and its one call * site `:2986` held unmoved and were re-READ in place, so it still emits the * ladder; `fields`' `field-type-alias.ts` changed one mapping (+6/-1, @@ -3314,7 +3316,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` = `ab1879721595`), 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` = `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."), /** Custom widget override — only needed when auto-inference is insufficient */ widget: z.string().optional().describe('Custom widget/component name (overrides type-based inference)'), From 22e559dbcddc01704cc756c2a3e2725902e2e6b9 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 4 Oct 2026 08:05:02 +0000 Subject: [PATCH 4/6] chore(objectui): re-record the SDUI manifest and the sdui-parser lockstep at 2e818d0b51ec; spec citation changeset Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv Co-authored-by: Claude --- .../objectui-pin-citations-2e818d0b51ec.md | 18 ++++++++++++++++++ packages/sdui-parser/objectui-lockstep.json | 6 +++--- scripts/sdui-manifest.record.json | 8 ++++---- 3 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 .changeset/objectui-pin-citations-2e818d0b51ec.md diff --git a/.changeset/objectui-pin-citations-2e818d0b51ec.md b/.changeset/objectui-pin-citations-2e818d0b51ec.md new file mode 100644 index 00000000000..64878e06a8f --- /dev/null +++ b/.changeset/objectui-pin-citations-2e818d0b51ec.md @@ -0,0 +1,18 @@ +--- +'@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 `2e818d0b51ec`. + +Clause-②: no + +Every anchor was mapped through the objectui diff `ab1879721595..2e818d0b51ec`. Every cited file is byte-identical across the hop except four, and in those the cited text is byte-identical too: + +- `plugin-dashboard/src/index.tsx`: objectui#11466 added lines above the `object-metric` registration, so the `object-metric` icon input record moves from `:269` to `:281`. It is still `{ name: 'icon', type: 'string' }`. +- `packages/types/src/objectql.ts`: objectui#11216 declared `grouping` on `ObjectKanbanSchema` below the cited `limit` member. +- `plugin-kanban.mdx`: objectui#11216 added a `grouping` row below the cited `limit` row. +- `SchemaRenderer.tsx`: objectui#11466 changed the type of `schema`. Its `properties.*` hoist and `createElement` spread are unchanged. + +The six migration entries' corpus counts were re-taken with `git grep -o -F`, the method that reproduces the previous pin's numbers. objectui's 17.7.0 release removed 2726 consumed changesets, so the corpus is now 7579 tracked files. Every zero still reads zero. + +No key, default, enum member or export moves. diff --git a/packages/sdui-parser/objectui-lockstep.json b/packages/sdui-parser/objectui-lockstep.json index c3f4d102080..5f35537b738 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": "ab187972159583b595facdcae3c73b50f6f312e9", - "revDate": "2026-10-03T17:12:55+00:00", + "rev": "2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6", + "revDate": "2026-10-04T07:05:00+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": "ab187972159583b595facdcae3c73b50f6f312e9", + "recordedAgainstPin": "2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6", "grammarRegion": { "file": "packages/sdui-parser/src/parse.ts", "delimiter": "/* ---------------------- the JS literal subset (#6614) ---------------------- */", diff --git a/scripts/sdui-manifest.record.json b/scripts/sdui-manifest.record.json index ce050430ec4..231661826dc 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": "ab187972159583b595facdcae3c73b50f6f312e9", + "objectuiSha": "2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6", "source": "built-tree", - "modulesRoot": ".cache/objectui-ab1879721595/apps/console", - "objectuiWorkspaceVersion": "17.6.0", + "modulesRoot": ".cache/objectui-2e818d0b51ec/apps/console", + "objectuiWorkspaceVersion": "17.7.0", "generator": "scripts/gen-sdui-manifest-node.mjs", - "generatedAt": "2026-10-03", + "generatedAt": "2026-10-04", "sha256": "0ead67c1111d73e6f48424510a002a626edd75d7dc5617d663bd022434106458", "components": 107 } From 00731f734d17461672f91d6802b8fc6ac323d8ca Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 4 Oct 2026 08:09:54 +0000 Subject: [PATCH 5/6] docs(spec): regenerate view.mdx for the FormField.span pin citation Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv Co-authored-by: Claude --- .changeset/objectui-pin-citations-2e818d0b51ec.md | 2 +- content/docs/references/ui/view.mdx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.changeset/objectui-pin-citations-2e818d0b51ec.md b/.changeset/objectui-pin-citations-2e818d0b51ec.md index 64878e06a8f..53db8a30350 100644 --- a/.changeset/objectui-pin-citations-2e818d0b51ec.md +++ b/.changeset/objectui-pin-citations-2e818d0b51ec.md @@ -6,7 +6,7 @@ The spec's objectui citations, and the shipped description text that names the ` Clause-②: no -Every anchor was mapped through the objectui diff `ab1879721595..2e818d0b51ec`. Every cited file is byte-identical across the hop except four, and in those the cited text is byte-identical too: +Every anchor was mapped through the objectui diff `ab1879721595..2e818d0b51ec`. Every file a current anchor cites is byte-identical across the hop except four, and in those the cited text is byte-identical too: - `plugin-dashboard/src/index.tsx`: objectui#11466 added lines above the `object-metric` registration, so the `object-metric` icon input record moves from `:269` to `:281`. It is still `{ name: 'icon', type: 'string' }`. - `packages/types/src/objectql.ts`: objectui#11216 declared `grouping` on `ObjectKanbanSchema` below the cited `limit` member. diff --git a/content/docs/references/ui/view.mdx b/content/docs/references/ui/view.mdx index 8daef70fdcd..3095d2ddad4 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` = `ab1879721595`), 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` = `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. | | **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` = `ab1879721595`), 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` = `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. | | **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 | From 378d42491572782995e2a67da1b6729735f54f5e Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 4 Oct 2026 08:10:19 +0000 Subject: [PATCH 6/6] chore(objectui): answer the ADR-0087 disposition on the 2e818d0b51ec console changeset Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv Co-authored-by: Claude --- .changeset/console-2e818d0b51ec.md | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/.changeset/console-2e818d0b51ec.md b/.changeset/console-2e818d0b51ec.md index 46f095992a4..dd6d3c82410 100644 --- a/.changeset/console-2e818d0b51ec.md +++ b/.changeset/console-2e818d0b51ec.md @@ -35,6 +35,30 @@ Derived from the changesets objectui declared over the range — 17 releasing of - _(no changeset)_ docs(skills): the page-builder guide's object-form example names its fields; a per-form override goes on a section entry (objectui#11550) (#11561) (objectui `0a53c67f9`) - _(no changeset)_ docs(skills): type three marked fences' schema as SchemaRendererProps['schema'] (objectui#11543) (#11558) (objectui `5cde2c6fe`) - + objectui range: `ab1879721595...2e818d0b51ec`