From 4ebe187c5e986f6bb588e3c98f2eb7ee48a19afa Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 10 Oct 2026 00:24:35 +0000 Subject: [PATCH 1/6] chore(objectui): bump the console pin 47b1f0bb7174 -> 20c6d351ad74 (wip: scripts/bump-objectui.sh output) Claude-Session: https://claude.ai/code/session_01LYXc6ckoWuZyVZpWYizdMh Co-authored-by: Claude --- .changeset/console-20c6d351ad74.md | 51 ++++++++++++++++++++++++++++++ .objectui-sha | 2 +- 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 .changeset/console-20c6d351ad74.md diff --git a/.changeset/console-20c6d351ad74.md b/.changeset/console-20c6d351ad74.md new file mode 100644 index 00000000000..4734f14b4b1 --- /dev/null +++ b/.changeset/console-20c6d351ad74.md @@ -0,0 +1,51 @@ +--- +"@objectstack/console": minor +--- + +Console (objectui) refreshed to `20c6d351ad74`. Frontend changes in this range: + +Derived from the changesets objectui declared over the range — 33 releasing of 33 changesets added across 24 non-merge commits; omitted: 1 commit carrying no changeset (they ship no package code). + +- **minor** — The approval decision panel draws a short notice instead of nothing when it is placed anywhere other than an approval request's record page (objectui#12072). (objectui `20c6d351a`) +- **minor** — The per-group aggregation type that `useGroupedData` takes is declared and exported as `GroupAggregationConfig` instead of `AggregationConfig` (objectui#6349, batch 7). `@object-u… (objectui `c0c0a0d56`) +- **minor** — The view switcher's views are typed as `@object-ui/core`'s `ListViewVisualization`, and this package no longer re-exports that union as `ViewType` (objectui#6349, batch 7). `@obje… (objectui `c0c0a0d56`) +- **minor** — The console sidebar no longer lets a user drag the app's menu into a private order; the Pinned section is now the one place a user orders entries (objectui#12059). Arranging an ap… (objectui `8a55f0ccd`) +- **minor** — feat(types)!: `UnifiedViewConfig.chart` retires with a tombstone that names the spec's list chart block, and the three `object-chart` legacy-axis refusals stop calling those keys… (objectui `c7b30bd66`) +- **minor** — An `element:repeater` node may omit `properties.object` when its `dataSource.object` names the object. The zod arm `ElementRepeaterBlockSchema` now applies the same `object` waive… (objectui `2a48bd408`) +- **minor** — A pointer field draws the record it points at, the console reads an approval request's record page through the approvals routes, and the approval decision panel is built for the r… (objectui `a368ccb1a`) +- **minor** — feat(plugin-list)!: a chart list view binds only an ADR-0021 `dataset`; the legacy inline chart axes and their `name` / `value` floors are retired on every route (objectui#6152, r… (objectui `025341692`) +- **minor** — **BREAKING** — `createObjectStackUploadAdapter` no longer sends an upload's `path` as the storage scope (objectui#12055). (objectui `7282c6a51`) +- **minor** — **BREAKING** — The result type of `useConfirmDialog` is declared as `DesignerConfirmDialogState` instead of `ConfirmDialogState` (objectui#6349, batch 6). `@object-ui/app-shell` declares an unre… (objectui `1f1c4b526`) +- **minor** — feat(plugin-list)!: the renderers stop reading the list-view keys every door refuses: the pre-#2231 aliases, `calendar.defaultView`, and the undeclared keys a per-kind block carri… (objectui `3fd862510`) +- **minor** — **BREAKING** — `objectui validate` and `objectui check` judge a document through the strict authoring face (objectui#5250) (objectui `e4c0b5432`) +- **minor** — The runtime chat contracts have their own names, apart from `@object-ui/types`' authoring `ChatMessage` / `ChatToolInvocation` (objectui#6349, batch 5). The shape ` + +objectui range: `47b1f0bb7174...20c6d351ad74` diff --git a/.objectui-sha b/.objectui-sha index a8091500d35..b286d5e927a 100644 --- a/.objectui-sha +++ b/.objectui-sha @@ -1 +1 @@ -47b1f0bb71748a7d16f36edecc50059367d2e35a +20c6d351ad74d2b14a93becdc134d51b91b2d2e6 From 2981fd74e195342f103c7b0ef323c455654a7456 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 10 Oct 2026 00:37:37 +0000 Subject: [PATCH 2/6] chore(objectui): re-record the SDUI manifest record and lockstep at 20c6d351ad74; re-measure the first pin citations (wip) Claude-Session: https://claude.ai/code/session_01LYXc6ckoWuZyVZpWYizdMh Co-authored-by: Claude --- packages/sdui-parser/objectui-lockstep.json | 6 +-- .../api-methods-batch-conformance.test.ts | 9 +++- .../src/kernel/functional-completeness.ts | 45 +++++++++++++++++-- ...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 | 9 ++-- .../18.tenant-schema-cache-ttl-unit-in-key.ts | 6 +-- scripts/sdui-manifest.record.json | 6 +-- 10 files changed, 77 insertions(+), 31 deletions(-) diff --git a/packages/sdui-parser/objectui-lockstep.json b/packages/sdui-parser/objectui-lockstep.json index b5909a31d97..0c0f3053093 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": "47b1f0bb71748a7d16f36edecc50059367d2e35a", - "revDate": "2026-10-09T08:34:00+00:00", + "rev": "20c6d351ad74d2b14a93becdc134d51b91b2d2e6", + "revDate": "2026-10-09T22:57:23+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": "47b1f0bb71748a7d16f36edecc50059367d2e35a", + "recordedAgainstPin": "20c6d351ad74d2b14a93becdc134d51b91b2d2e6", "grammarRegion": { "file": "packages/sdui-parser/src/parse.ts", "delimiter": "/* ---------------------- the JS literal subset (#6614) ---------------------- */", diff --git a/packages/spec/src/data/api-methods-batch-conformance.test.ts b/packages/spec/src/data/api-methods-batch-conformance.test.ts index 91bd4a34bd4..f647e28d45c 100644 --- a/packages/spec/src/data/api-methods-batch-conformance.test.ts +++ b/packages/spec/src/data/api-methods-batch-conformance.test.ts @@ -61,7 +61,14 @@ 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` = `47b1f0bb7`, re-read there 2026-10-09: + // (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + // every objectui file this record cites is byte-identical across the hop + // from `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved: + // `ObjectGrid.tsx:4868-4895` still hashes to + // `c88443302d40c2db739ddb235470bafa29056e2e` and + // `hooks/useBulkExecutor.ts:298-303` to + // `01083348330f10a201cdf1078b4c21c236402b6a`. At `47b1f0bb7`, re-read there + // 2026-10-09: // in `packages/plugin-grid`, on the hop off `f0268ad78`, `ObjectGrid.tsx` // changed again (19 insertions, 11 deletions: objectui#11865 slice m, // objectui `2063f7a96`: one import line, and the grouped pager's diff --git a/packages/spec/src/kernel/functional-completeness.ts b/packages/spec/src/kernel/functional-completeness.ts index 7f647dd8f5d..af3dd4aec1c 100644 --- a/packages/spec/src/kernel/functional-completeness.ts +++ b/packages/spec/src/kernel/functional-completeness.ts @@ -298,7 +298,19 @@ 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` = `47b1f0bb7`, re-read there 2026-10-09: + * (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * on the hop off `47b1f0bb7` `ObjectCalendar.tsx` is byte-identical (`git diff + * --quiet`), so `getCalendarConfig` `:294`, the `if (!calendarConfig)` arm + * `:1296` and its `tt(…)` lines `:1303-1304` did not move; `ListView.tsx` + * changed (+281/-235: objectui#6152 rounds 14 and 15, objectui#5144, + * objectui#6349 batch 7), its `case 'calendar'` with it, moved `3617` -> + * `3665`: objectui#6152 round 14 (objectui `3fd862510`) retired the block's + * raw spread and its `defaultView` lift and now reads `colorField` / + * `allDayField` by name, while the `startDateField` / `endDateField` / + * `titleField` reads this row rests on are byte-identical and still + * conditional, with no floor; and the `en` / `zh` / `de` packs changed (four + * commits) but not their `calendar.configRequired` strings. At `47b1f0bb7`, + * re-read there 2026-10-09: * on the hop off `f0268ad78` `ObjectCalendar.tsx` is byte-identical (`git diff * --quiet`), so `getCalendarConfig` `:294`, the `if (!calendarConfig)` arm * `:1296` and its `tt(…)` lines `:1303-1304` did not move; `ListView.tsx` @@ -392,7 +404,16 @@ 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` = `47b1f0bb7`, re-read there 2026-10-09: + * this repo builds against (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * on the hop off `47b1f0bb7` `ObjectGantt.tsx` is byte-identical (`git diff + * --quiet`), so `getGanttConfig` `:610` and the `if (!ganttConfig)` arm `:2307` + * did not move, and `ListView.tsx` changed (+281/-235, as above), its + * `case 'gantt'` with it, moved `3754` -> `3804`: objectui#6152 round 14 + * (objectui `3fd862510`) replaced the block's two raw spreads with the typed + * `GANTT_CONFIG_SPELLING` copy of the spec block's declared keys, while the + * `startDateField` / `endDateField` / `titleField` spreads stay conditional and + * no `progress` / `dependencies` floor returns. At `47b1f0bb7`, re-read there + * 2026-10-09: * on the hop off `f0268ad78` `ObjectGantt.tsx` is byte-identical (`git diff * --quiet`), so `getGanttConfig` `:610` and the `if (!ganttConfig)` arm `:2307` * did not move, and `ListView.tsx` changed (+85/-26, objectui#11865 slice p, as @@ -470,7 +491,17 @@ 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` = - * `47b1f0bb7`, re-read there 2026-10-09: + * `20c6d351a`, re-read there 2026-10-10: + * on the hop off `47b1f0bb7` `ObjectTimeline.tsx` changed (+15/-15, + * objectui#6152 round 14, objectui `3fd862510`): its start-date chain + * `:589-591` lost the nested `timeline.dateField` alias rung and still ends + * without a literal rung, unmoved, and its `if (!hasAuthoredItems && + * !startDateField)` refusal arm `:952` is byte-identical and unmoved; and + * `ListView.tsx` changed (+281/-235) with its `case 'timeline'` + * byte-identical, moved by 50, while `resolveTimelineDateBinding` moved `634` + * -> `686` and lost its `dateField` alias rung in the same round, still + * reading a `calendar` block's `startDateField` as an axis. At `47b1f0bb7`, + * re-read there 2026-10-09: * on the hop off `f0268ad78` `ObjectTimeline.tsx` is byte-identical (`git diff * --quiet`), so its start-date chain `:589-591` and its `if (!hasAuthoredItems * && !startDateField)` refusal arm `:952` did not move, and `ListView.tsx` @@ -545,7 +576,13 @@ 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` = `47b1f0bb7`, re-read there 2026-10-09: + * pin (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * on the hop off `47b1f0bb7` `ObjectMap.tsx` is byte-identical (`git diff + * --quiet`), so `getMapConfig` `:421`, `hasCoordinateBinding` `:527` and the + * refusal arm `:1337` did not move; and `ListView.tsx` changed (+281/-235) + * with its `case 'map'` byte-identical, moved by 52, and `resolveListMapConfig` + * byte-identical, moved `:147` -> `:200`. At `47b1f0bb7`, re-read there + * 2026-10-09: * on the hop off `f0268ad78` `ObjectMap.tsx` is byte-identical (`git diff * --quiet`), so `getMapConfig` `:421`, `hasCoordinateBinding` `:527` and the * refusal arm `:1337` did not move; and `ListView.tsx` changed (+85/-26) with 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 ae477e52c21..31fccef2471 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` = `47b1f0bb71748a7d16f36edecc50059367d2e35a` — names ' + + 'against, `.objectui-sha` = `20c6d351ad74d2b14a93becdc134d51b91b2d2e6` — 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 8281 tracked files (0 across the 8234 at f0268ad78, the 7754 at a58626c88, the 7650 at 0abd4f9f8, the 7632 at 9dfaca654, the 7579 at 2e818d0b5, the 10267 at ab1879721, the 10071 at 89cad75d5, the 9912 at 31971ff1e, the 9800 at e420df310, the 9546 at db11afd49, the 9283 at dd3f7e1be, the ' + + 'the string debounceDelay each occur 0 times across its 8351 tracked files (0 across the 8281 at 47b1f0bb7, the 8234 at f0268ad78, the 7754 at a58626c88, the 7650 at 0abd4f9f8, the 7632 at 9dfaca654, the 7579 at 2e818d0b5, the 10267 at ab1879721, the 10071 at 89cad75d5, the 9912 at 31971ff1e, the 9800 at e420df310, the 9546 at db11afd49, the 9283 at dd3f7e1be, the ' + '8512 at f8a9d0fb0 and the 8303 at 62597c588 too), against lit ' + 'controls objectstack 12966 and @objectstack/spec 4997 on the same corpus at 87af769e9, ' + 'which re-count to 13125 and 5043 respectively at 62597c588, to 13347 and 5123 at ' - + 'f8a9d0fb0, to 13745 and 5466 at dd3f7e1be, to 14704 and 5545 at db11afd49, to 15352 and 6024 at e420df310, to 15691 and 6206 at 31971ff1e, to 16044 and 6461 at 89cad75d5, to 16377 and 6665 at ab1879721, to 17227 and 7134 at 2e818d0b5, to 17313 and 7186 at 9dfaca654, to 17390 and 7209 at 0abd4f9f8, to 17468 and 7246 at a58626c88, to 17956 and 7522 at f0268ad78 and to 17980 and 7523 at this pin (git grep -o -F, the method that reproduces ' + + 'f8a9d0fb0, to 13745 and 5466 at dd3f7e1be, to 14704 and 5545 at db11afd49, to 15352 and 6024 at e420df310, to 15691 and 6206 at 31971ff1e, to 16044 and 6461 at 89cad75d5, to 16377 and 6665 at ab1879721, to 17227 and 7134 at 2e818d0b5, to 17313 and 7186 at 9dfaca654, to 17390 and 7209 at 0abd4f9f8, to 17468 and 7246 at a58626c88, to 17956 and 7522 at f0268ad78, to 17980 and 7523 at 47b1f0bb7 and to 18047 and 7545 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 154b2deacf2..52df7cc5add 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` = `47b1f0bb71748a7d16f36edecc50059367d2e35a`, re-read from this tree — ' + + '`.objectui-sha` = `20c6d351ad74d2b14a93becdc134d51b91b2d2e6`, re-read from this tree — ' + 'spells resourceLimits.timeout 0 times across ' - + '8281 tracked files, against lit controls timeout 1674, RuntimeConfig 337 and resourceLimits ' - + '2 on the same corpus (0 across 8234, and 1658 / 337 / 2, at f0268ad78; 0 across 7754, and 1431 / 299 / 2, at a58626c88; 0 across 7650, and 1360 / 293 / 2, at 0abd4f9f8; 0 across 7632, and 1360 / 293 / 2, at 9dfaca654; 0 across 7579, and 1351 / 276 / 2, at 2e818d0b5; 0 across 10267, and 1348 / 273 / 2, at ab1879721; 0 across 10071, and 1331 / 273 / 2, at 89cad75d5; 0 across 9912, and 1303 / 273 / 2, at 31971ff1e; 0 across 9800, and 1293 / 273 / 2, at e420df310; 0 across 9546, and 1197 / 273 / 2, at db11afd49; 0 across 9283, and 1172 / 263 / 2, at dd3f7e1be; 0 across 8512, and 1096 / 245 / 2, at f8a9d0fb0; 0 across 8303, and ' + + '8351 tracked files, against lit controls timeout 1694, RuntimeConfig 337 and resourceLimits ' + + '2 on the same corpus (0 across 8281, and 1674 / 337 / 2, at 47b1f0bb7; 0 across 8234, and 1658 / 337 / 2, at f0268ad78; 0 across 7754, and 1431 / 299 / 2, at a58626c88; 0 across 7650, and 1360 / 293 / 2, at 0abd4f9f8; 0 across 7632, and 1360 / 293 / 2, at 9dfaca654; 0 across 7579, and 1351 / 276 / 2, at 2e818d0b5; 0 across 10267, and 1348 / 273 / 2, at ab1879721; 0 across 10071, and 1331 / 273 / 2, at 89cad75d5; 0 across 9912, and 1303 / 273 / 2, at 31971ff1e; 0 across 9800, and 1293 / 273 / 2, at e420df310; 0 across 9546, and 1197 / 273 / 2, at db11afd49; 0 across 9283, and 1172 / 263 / 2, at dd3f7e1be; 0 across 8512, and 1096 / 245 / 2, at f8a9d0fb0; 0 across 8303, and ' + '1086 / 240 / 2, at 62597c588); both resourceLimits hits are prose in packages/app-shell recording ' + 'that objectui\'s own AppShellRuntimeConfig shares not one key with the spec\'s ' + 'RuntimeConfig, so nothing there authors this key and no pin bump is owed. ADR-0087.', 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 f6e13d864b6..2303c1e67da 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` = `47b1f0bb71748a7d16f36edecc50059367d2e35a` — spells ' + + 'objectui checkout — `.objectui-sha` = `20c6d351ad74d2b14a93becdc134d51b91b2d2e6` — spells ' + '`flushInterval` 0 times, `initialDelay` 0, `HttpDestinationConfig` 0 and `LoggingConfig` 0 ' - + 'across its 8281 tracked files, against lit controls `useState` 2630 and `timeout` 1674 on ' - + 'the same corpus (all four 0 across 8234, against 2622 and 1658, at f0268ad78, 0 across 7754, against 2491 and 1431, at a58626c88, 0 across 7650, against 2478 and 1360, at 0abd4f9f8, 0 across 7632, against 2477 and 1360, at 9dfaca654, 0 across 7579, against 2477 and 1351, at 2e818d0b5, 0 across 10267, against 2476 and 1348, at ab1879721, 0 across 10071, against 2470 and 1331, at 89cad75d5, 0 across 9912, against 2469 and 1303, at 31971ff1e, 0 across 9800, against 2464 and 1293, at e420df310, 0 across 9546, against 2449 and 1197, at db11afd49, 0 across 9283, against 2435 and 1172, at dd3f7e1be, 0 across 8512, ' + + 'across its 8351 tracked files, against lit controls `useState` 2630 and `timeout` 1694 on ' + + 'the same corpus (all four 0 across 8281, against 2630 and 1674, at 47b1f0bb7, 0 across 8234, against 2622 and 1658, at f0268ad78, 0 across 7754, against 2491 and 1431, at a58626c88, 0 across 7650, against 2478 and 1360, at 0abd4f9f8, 0 across 7632, against 2477 and 1360, at 9dfaca654, 0 across 7579, against 2477 and 1351, at 2e818d0b5, 0 across 10267, against 2476 and 1348, at ab1879721, 0 across 10071, against 2470 and 1331, at 89cad75d5, 0 across 9912, against 2469 and 1303, at 31971ff1e, 0 across 9800, against 2464 and 1293, at e420df310, 0 across 9546, against 2449 and 1197, at db11afd49, 0 across 9283, against 2435 and 1172, at dd3f7e1be, 0 across 8512, ' + 'against 2391 and 1096, at f8a9d0fb0, and 0 across ' + '8303, against 2389 and 1086, at 62597c588).', acceptanceCriteria: diff --git a/packages/spec/src/migrations/entries/semantic/18.system-metrics-jsdoc-durations-unit-in-key.ts b/packages/spec/src/migrations/entries/semantic/18.system-metrics-jsdoc-durations-unit-in-key.ts index 4bcf5ee3ed8..5c0f27b634c 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` = `47b1f0bb71748a7d16f36edecc50059367d2e35a`, re-read from this tree — ' - + 'spells all six metrics def names and both distinctive keys 0 times across 8281 tracked ' - + 'files at that sha, against lit controls window 4449, timeout 1674, period 249, ' - + 'interval 213 and metrics 455 on that same corpus and sha (0 across 8234, against 4430 / ' + + '`.objectui-sha` = `20c6d351ad74d2b14a93becdc134d51b91b2d2e6`, re-read from this tree — ' + + 'spells all six metrics def names and both distinctive keys 0 times across 8351 tracked ' + + 'files at that sha, against lit controls window 4470, timeout 1694, period 249, ' + + 'interval 213 and metrics 456 on that same corpus and sha (0 across 8281, against 4449 / ' + + '1674 / 249 / 213 / 455, at 47b1f0bb7, 0 across 8234, against 4430 / ' + '1658 / 249 / 213 / 404, at f0268ad78, 0 across 7754, against 4255 / ' + '1431 / 247 / 200 / 401, at a58626c88, 0 across 7650, against 4194 / ' + '1360 / 238 / 195 / 401, at 0abd4f9f8, 0 across 7632, against 4193 / ' 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 89458eb32e3..941b202bbbc 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` = `47b1f0bb71748a7d16f36edecc50059367d2e35a` — names none of it: all 37 exports of ' - + 'tracing.zod.ts and each of the four key names occur 0 times across the 8281 files ' + + 'pinned objectui checkout — `.objectui-sha` = `20c6d351ad74d2b14a93becdc134d51b91b2d2e6` — names none of it: all 37 exports of ' + + 'tracing.zod.ts and each of the four key names occur 0 times across the 8351 files ' + 'tracked at that sha (the 517 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: 17980 hits for the bare token objectstack, ' - + 'and 7523 for the package specifier @objectstack/spec (at f0268ad78: 0 across 8234, Span 517, ' + + 'two lit controls on that same corpus and sha: 18047 hits for the bare token objectstack, ' + + 'and 7545 for the package specifier @objectstack/spec (at 47b1f0bb7: 0 across 8281, Span 517, ' + + '17980 and 7523; at f0268ad78: 0 across 8234, Span 517, ' + '17956 and 7522; at a58626c88: 0 across 7754, Span 509, ' + '17468 and 7246; at 0abd4f9f8: 0 across 7650, Span 508, ' + '17390 and 7209; at 9dfaca654: 0 across 7632, Span 508, ' 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 c1c88fd636f..73228804c04 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` = `47b1f0bb71748a7d16f36edecc50059367d2e35a` — spells it 0 ' - + 'times across 8281 tracked files, against lit controls `TTL` 184 and `tenant` 1338 on the ' - + 'same corpus (0 across 8234, against 184 and 1338, at f0268ad78; 0 across 7754, against 184 and 1319, at a58626c88; 0 across 7650, against 182 and 1318, at 0abd4f9f8; 0 across 7632, against 182 and 1318, at 9dfaca654; 0 across 7579, against 182 and 1317, at 2e818d0b5; 0 across 10267, against 180 and 1238, at ab1879721; 0 across 10071, against 181 and 1237, at 89cad75d5; 0 across 9912, against 181 and 1237, at 31971ff1e; 0 across 9800, against 181 and 1235, at e420df310; 0 across 9546, against 181 and 1200, at db11afd49; 0 across 9283, against 181 and 1185, at dd3f7e1be; 0 across 8512, against 156 and 1034, at f8a9d0fb0; 0 across 8303, against 156 ' + + 'objectui checkout — `.objectui-sha` = `20c6d351ad74d2b14a93becdc134d51b91b2d2e6` — spells it 0 ' + + 'times across 8351 tracked files, against lit controls `TTL` 184 and `tenant` 1340 on the ' + + 'same corpus (0 across 8281, against 184 and 1338, at 47b1f0bb7; 0 across 8234, against 184 and 1338, at f0268ad78; 0 across 7754, against 184 and 1319, at a58626c88; 0 across 7650, against 182 and 1318, at 0abd4f9f8; 0 across 7632, against 182 and 1318, at 9dfaca654; 0 across 7579, against 182 and 1317, at 2e818d0b5; 0 across 10267, against 180 and 1238, at ab1879721; 0 across 10071, against 181 and 1237, at 89cad75d5; 0 across 9912, against 181 and 1237, at 31971ff1e; 0 across 9800, against 181 and 1235, at e420df310; 0 across 9546, against 181 and 1200, at db11afd49; 0 across 9283, against 181 and 1185, at dd3f7e1be; 0 across 8512, against 156 and 1034, at f8a9d0fb0; 0 across 8303, against 156 ' + 'and 987, at 62597c588).', acceptanceCriteria: 'Every schema-level tenant isolation source spells `performance.schemaCacheTtlSeconds`; ' diff --git a/scripts/sdui-manifest.record.json b/scripts/sdui-manifest.record.json index 51cb4b7548d..ac6d8449833 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": "47b1f0bb71748a7d16f36edecc50059367d2e35a", + "objectuiSha": "20c6d351ad74d2b14a93becdc134d51b91b2d2e6", "source": "built-tree", - "modulesRoot": ".cache/objectui-47b1f0bb7174/apps/console", + "modulesRoot": ".cache/objectui-20c6d351ad74/apps/console", "objectuiWorkspaceVersion": "17.7.0", "generator": "scripts/gen-sdui-manifest-node.mjs", - "generatedAt": "2026-10-09", + "generatedAt": "2026-10-10", "sha256": "097ae3cbcf9533189f0c8d689e385414bf175d19d105480df746f7c3353e0f1f", "components": 107 } From cefbb6b2ae7f204e3a668bc71a5951626b197176 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 10 Oct 2026 00:48:25 +0000 Subject: [PATCH 3/6] chore(spec): re-measure the objectui pin citations at 20c6d351ad74 (wip) Claude-Session: https://claude.ai/code/session_01LYXc6ckoWuZyVZpWYizdMh Co-authored-by: Claude --- packages/spec/src/migrations/registry.ts | 42 ++-- .../src/ui/action-outcome-messages.test.ts | 7 +- packages/spec/src/ui/action.zod.ts | 9 +- packages/spec/src/ui/component.test.ts | 43 +++- packages/spec/src/ui/component.zod.ts | 226 ++++++++++++++---- packages/spec/src/ui/dataset.zod.ts | 3 + packages/spec/src/ui/view.zod.ts | 30 ++- 7 files changed, 283 insertions(+), 77 deletions(-) diff --git a/packages/spec/src/migrations/registry.ts b/packages/spec/src/migrations/registry.ts index 469c31cad37..0434dd48daa 100644 --- a/packages/spec/src/migrations/registry.ts +++ b/packages/spec/src/migrations/registry.ts @@ -15261,13 +15261,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` = `47b1f0bb71748a7d16f36edecc50059367d2e35a` — names ' + + 'against, `.objectui-sha` = `20c6d351ad74d2b14a93becdc134d51b91b2d2e6` — 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 8281 tracked files (0 across the 8234 at f0268ad78, the 7754 at a58626c88, the 7650 at 0abd4f9f8, the 7632 at 9dfaca654, the 7579 at 2e818d0b5, the 10267 at ab1879721, the 10071 at 89cad75d5, the 9912 at 31971ff1e, the 9800 at e420df310, the 9546 at db11afd49, the 9283 at dd3f7e1be, the ' + + 'the string debounceDelay each occur 0 times across its 8351 tracked files (0 across the 8281 at 47b1f0bb7, the 8234 at f0268ad78, the 7754 at a58626c88, the 7650 at 0abd4f9f8, the 7632 at 9dfaca654, the 7579 at 2e818d0b5, the 10267 at ab1879721, the 10071 at 89cad75d5, the 9912 at 31971ff1e, the 9800 at e420df310, the 9546 at db11afd49, the 9283 at dd3f7e1be, the ' + '8512 at f8a9d0fb0 and the 8303 at 62597c588 too), against lit ' + 'controls objectstack 12966 and @objectstack/spec 4997 on the same corpus at 87af769e9, ' + 'which re-count to 13125 and 5043 respectively at 62597c588, to 13347 and 5123 at ' - + 'f8a9d0fb0, to 13745 and 5466 at dd3f7e1be, to 14704 and 5545 at db11afd49, to 15352 and 6024 at e420df310, to 15691 and 6206 at 31971ff1e, to 16044 and 6461 at 89cad75d5, to 16377 and 6665 at ab1879721, to 17227 and 7134 at 2e818d0b5, to 17313 and 7186 at 9dfaca654, to 17390 and 7209 at 0abd4f9f8, to 17468 and 7246 at a58626c88, to 17956 and 7522 at f0268ad78 and to 17980 and 7523 at this pin (git grep -o -F, the method that reproduces ' + + 'f8a9d0fb0, to 13745 and 5466 at dd3f7e1be, to 14704 and 5545 at db11afd49, to 15352 and 6024 at e420df310, to 15691 and 6206 at 31971ff1e, to 16044 and 6461 at 89cad75d5, to 16377 and 6665 at ab1879721, to 17227 and 7134 at 2e818d0b5, to 17313 and 7186 at 9dfaca654, to 17390 and 7209 at 0abd4f9f8, to 17468 and 7246 at a58626c88, to 17956 and 7522 at f0268ad78, to 17980 and 7523 at 47b1f0bb7 and to 18047 and 7545 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 ' @@ -15472,10 +15472,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` = `47b1f0bb71748a7d16f36edecc50059367d2e35a`, re-read from this tree — ' + + '`.objectui-sha` = `20c6d351ad74d2b14a93becdc134d51b91b2d2e6`, re-read from this tree — ' + 'spells resourceLimits.timeout 0 times across ' - + '8281 tracked files, against lit controls timeout 1674, RuntimeConfig 337 and resourceLimits ' - + '2 on the same corpus (0 across 8234, and 1658 / 337 / 2, at f0268ad78; 0 across 7754, and 1431 / 299 / 2, at a58626c88; 0 across 7650, and 1360 / 293 / 2, at 0abd4f9f8; 0 across 7632, and 1360 / 293 / 2, at 9dfaca654; 0 across 7579, and 1351 / 276 / 2, at 2e818d0b5; 0 across 10267, and 1348 / 273 / 2, at ab1879721; 0 across 10071, and 1331 / 273 / 2, at 89cad75d5; 0 across 9912, and 1303 / 273 / 2, at 31971ff1e; 0 across 9800, and 1293 / 273 / 2, at e420df310; 0 across 9546, and 1197 / 273 / 2, at db11afd49; 0 across 9283, and 1172 / 263 / 2, at dd3f7e1be; 0 across 8512, and 1096 / 245 / 2, at f8a9d0fb0; 0 across 8303, and ' + + '8351 tracked files, against lit controls timeout 1694, RuntimeConfig 337 and resourceLimits ' + + '2 on the same corpus (0 across 8281, and 1674 / 337 / 2, at 47b1f0bb7; 0 across 8234, and 1658 / 337 / 2, at f0268ad78; 0 across 7754, and 1431 / 299 / 2, at a58626c88; 0 across 7650, and 1360 / 293 / 2, at 0abd4f9f8; 0 across 7632, and 1360 / 293 / 2, at 9dfaca654; 0 across 7579, and 1351 / 276 / 2, at 2e818d0b5; 0 across 10267, and 1348 / 273 / 2, at ab1879721; 0 across 10071, and 1331 / 273 / 2, at 89cad75d5; 0 across 9912, and 1303 / 273 / 2, at 31971ff1e; 0 across 9800, and 1293 / 273 / 2, at e420df310; 0 across 9546, and 1197 / 273 / 2, at db11afd49; 0 across 9283, and 1172 / 263 / 2, at dd3f7e1be; 0 across 8512, and 1096 / 245 / 2, at f8a9d0fb0; 0 across 8303, and ' + '1086 / 240 / 2, at 62597c588); both resourceLimits hits are prose in packages/app-shell recording ' + 'that objectui\'s own AppShellRuntimeConfig shares not one key with the spec\'s ' + 'RuntimeConfig, so nothing there authors this key and no pin bump is owed. ADR-0087.', @@ -15711,10 +15711,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` = `47b1f0bb71748a7d16f36edecc50059367d2e35a` — spells ' + + 'objectui checkout — `.objectui-sha` = `20c6d351ad74d2b14a93becdc134d51b91b2d2e6` — spells ' + '`flushInterval` 0 times, `initialDelay` 0, `HttpDestinationConfig` 0 and `LoggingConfig` 0 ' - + 'across its 8281 tracked files, against lit controls `useState` 2630 and `timeout` 1674 on ' - + 'the same corpus (all four 0 across 8234, against 2622 and 1658, at f0268ad78, 0 across 7754, against 2491 and 1431, at a58626c88, 0 across 7650, against 2478 and 1360, at 0abd4f9f8, 0 across 7632, against 2477 and 1360, at 9dfaca654, 0 across 7579, against 2477 and 1351, at 2e818d0b5, 0 across 10267, against 2476 and 1348, at ab1879721, 0 across 10071, against 2470 and 1331, at 89cad75d5, 0 across 9912, against 2469 and 1303, at 31971ff1e, 0 across 9800, against 2464 and 1293, at e420df310, 0 across 9546, against 2449 and 1197, at db11afd49, 0 across 9283, against 2435 and 1172, at dd3f7e1be, 0 across 8512, ' + + 'across its 8351 tracked files, against lit controls `useState` 2630 and `timeout` 1694 on ' + + 'the same corpus (all four 0 across 8281, against 2630 and 1674, at 47b1f0bb7, 0 across 8234, against 2622 and 1658, at f0268ad78, 0 across 7754, against 2491 and 1431, at a58626c88, 0 across 7650, against 2478 and 1360, at 0abd4f9f8, 0 across 7632, against 2477 and 1360, at 9dfaca654, 0 across 7579, against 2477 and 1351, at 2e818d0b5, 0 across 10267, against 2476 and 1348, at ab1879721, 0 across 10071, against 2470 and 1331, at 89cad75d5, 0 across 9912, against 2469 and 1303, at 31971ff1e, 0 across 9800, against 2464 and 1293, at e420df310, 0 across 9546, against 2449 and 1197, at db11afd49, 0 across 9283, against 2435 and 1172, at dd3f7e1be, 0 across 8512, ' + 'against 2391 and 1096, at f8a9d0fb0, and 0 across ' + '8303, against 2389 and 1086, at 62597c588).', acceptanceCriteria: @@ -20242,10 +20242,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` = `47b1f0bb71748a7d16f36edecc50059367d2e35a`, re-read from this tree — ' - + 'spells all six metrics def names and both distinctive keys 0 times across 8281 tracked ' - + 'files at that sha, against lit controls window 4449, timeout 1674, period 249, ' - + 'interval 213 and metrics 455 on that same corpus and sha (0 across 8234, against 4430 / ' + + '`.objectui-sha` = `20c6d351ad74d2b14a93becdc134d51b91b2d2e6`, re-read from this tree — ' + + 'spells all six metrics def names and both distinctive keys 0 times across 8351 tracked ' + + 'files at that sha, against lit controls window 4470, timeout 1694, period 249, ' + + 'interval 213 and metrics 456 on that same corpus and sha (0 across 8281, against 4449 / ' + + '1674 / 249 / 213 / 455, at 47b1f0bb7, 0 across 8234, against 4430 / ' + '1658 / 249 / 213 / 404, at f0268ad78, 0 across 7754, against 4255 / ' + '1431 / 247 / 200 / 401, at a58626c88, 0 across 7650, against 4194 / ' + '1360 / 238 / 195 / 401, at 0abd4f9f8, 0 across 7632, against 4193 / ' @@ -20468,12 +20469,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` = `47b1f0bb71748a7d16f36edecc50059367d2e35a` — names none of it: all 37 exports of ' - + 'tracing.zod.ts and each of the four key names occur 0 times across the 8281 files ' + + 'pinned objectui checkout — `.objectui-sha` = `20c6d351ad74d2b14a93becdc134d51b91b2d2e6` — names none of it: all 37 exports of ' + + 'tracing.zod.ts and each of the four key names occur 0 times across the 8351 files ' + 'tracked at that sha (the 517 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: 17980 hits for the bare token objectstack, ' - + 'and 7523 for the package specifier @objectstack/spec (at f0268ad78: 0 across 8234, Span 517, ' + + 'two lit controls on that same corpus and sha: 18047 hits for the bare token objectstack, ' + + 'and 7545 for the package specifier @objectstack/spec (at 47b1f0bb7: 0 across 8281, Span 517, ' + + '17980 and 7523; at f0268ad78: 0 across 8234, Span 517, ' + '17956 and 7522; at a58626c88: 0 across 7754, Span 509, ' + '17468 and 7246; at 0abd4f9f8: 0 across 7650, Span 508, ' + '17390 and 7209; at 9dfaca654: 0 across 7632, Span 508, ' @@ -20590,9 +20592,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` = `47b1f0bb71748a7d16f36edecc50059367d2e35a` — spells it 0 ' - + 'times across 8281 tracked files, against lit controls `TTL` 184 and `tenant` 1338 on the ' - + 'same corpus (0 across 8234, against 184 and 1338, at f0268ad78; 0 across 7754, against 184 and 1319, at a58626c88; 0 across 7650, against 182 and 1318, at 0abd4f9f8; 0 across 7632, against 182 and 1318, at 9dfaca654; 0 across 7579, against 182 and 1317, at 2e818d0b5; 0 across 10267, against 180 and 1238, at ab1879721; 0 across 10071, against 181 and 1237, at 89cad75d5; 0 across 9912, against 181 and 1237, at 31971ff1e; 0 across 9800, against 181 and 1235, at e420df310; 0 across 9546, against 181 and 1200, at db11afd49; 0 across 9283, against 181 and 1185, at dd3f7e1be; 0 across 8512, against 156 and 1034, at f8a9d0fb0; 0 across 8303, against 156 ' + + 'objectui checkout — `.objectui-sha` = `20c6d351ad74d2b14a93becdc134d51b91b2d2e6` — spells it 0 ' + + 'times across 8351 tracked files, against lit controls `TTL` 184 and `tenant` 1340 on the ' + + 'same corpus (0 across 8281, against 184 and 1338, at 47b1f0bb7; 0 across 8234, against 184 and 1338, at f0268ad78; 0 across 7754, against 184 and 1319, at a58626c88; 0 across 7650, against 182 and 1318, at 0abd4f9f8; 0 across 7632, against 182 and 1318, at 9dfaca654; 0 across 7579, against 182 and 1317, at 2e818d0b5; 0 across 10267, against 180 and 1238, at ab1879721; 0 across 10071, against 181 and 1237, at 89cad75d5; 0 across 9912, against 181 and 1237, at 31971ff1e; 0 across 9800, against 181 and 1235, at e420df310; 0 across 9546, against 181 and 1200, at db11afd49; 0 across 9283, against 181 and 1185, at dd3f7e1be; 0 across 8512, against 156 and 1034, at f8a9d0fb0; 0 across 8303, against 156 ' + 'and 987, at 62597c588).', acceptanceCriteria: 'Every schema-level tenant isolation source spells `performance.schemaCacheTtlSeconds`; ' diff --git a/packages/spec/src/ui/action-outcome-messages.test.ts b/packages/spec/src/ui/action-outcome-messages.test.ts index 14ef49579f4..495e7a4acce 100644 --- a/packages/spec/src/ui/action-outcome-messages.test.ts +++ b/packages/spec/src/ui/action-outcome-messages.test.ts @@ -12,7 +12,12 @@ * 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` = - * `47b1f0bb7`, re-read there 2026-10-09: + * `20c6d351a`, re-read there 2026-10-10: + * `ActionRunner.composeSuccessMessage`, in `core/src/actions/ActionRunner.ts`, is + * byte-identical in body to `47b1f0bb7` and MOVED up by 6, `1504` -> `1498` + * (objectui#6349 batch 4, objectui `d32869883`: `ActionContext` and + * `ActionResult` declared once, in the import block and declarations above it). + * At `47b1f0bb7`, re-read there 2026-10-09: * every objectui file this record cites is byte-identical across the hop from * `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At * `f0268ad78`, re-read there 2026-10-09: diff --git a/packages/spec/src/ui/action.zod.ts b/packages/spec/src/ui/action.zod.ts index bd0f0db354c..1de368e1f22 100644 --- a/packages/spec/src/ui/action.zod.ts +++ b/packages/spec/src/ui/action.zod.ts @@ -1364,6 +1364,13 @@ 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` = + * `20c6d351a`, re-read there 2026-10-10: + * `core/src/actions/ActionRunner.ts` changed above the reader only (+29/-35, + * objectui#6349 batch 4, objectui `d32869883`: `ActionContext` and + * `ActionResult` declared once and `UndoableOperation` published, every hunk + * in the import block and those declarations at the top of the file), so + * `composeSuccessMessage` MOVED `1504` -> `1498` with its body byte-identical, + * and the four action renderers are byte-identical (`git diff --quiet`). At * `47b1f0bb7`, re-read there 2026-10-09: * every objectui file this record cites is byte-identical across the hop from * `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At @@ -1382,7 +1389,7 @@ const actionObject = () => strictObject({ * `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:1504`) picks `outcomeMessages[outcome]` + * (`core/src/actions/ActionRunner.ts:1498`) picks `outcomeMessages[outcome]` * off the handler's return value, falls back to `successMessage` and then to * the runner's default text, and fills `${result.*}` in whichever it shows. * The four action renderers forward the key to the runner (`action:bar` diff --git a/packages/spec/src/ui/component.test.ts b/packages/spec/src/ui/component.test.ts index f6ea568218f..4a8a98254e4 100644 --- a/packages/spec/src/ui/component.test.ts +++ b/packages/spec/src/ui/component.test.ts @@ -288,7 +288,10 @@ describe('PageAccordionProps variant — declared because the accordion renderer // same file's `ComponentRegistry.register('accordion', …)` publishes the key to // the Studio block designer at `:1222` (the `items` input, documented as // `[{ label, icon?, collapsed?, children }]`). Measured at the pin this repo -// builds against — `.objectui-sha` = `47b1f0bb7`, re-read there 2026-10-09: +// builds against — `.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: +// every objectui file this record cites is byte-identical across the hop from +// `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At +// `47b1f0bb7`, re-read there 2026-10-09: // every objectui file this record cites is byte-identical across the hop from // `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At // `f0268ad78`, re-read there 2026-10-09: @@ -448,7 +451,10 @@ describe('PageTabsProps items[].value / items[].count — declared because the t // same file's `ComponentRegistry.register('tabs', …)` publishes the key to the // Studio block designer at `:1007` (the `items` input, documented as // `[{ label, value?, icon?, count?, visibleWhen?, children }]`). Measured at -// the pin this repo builds against — `.objectui-sha` = `47b1f0bb7`, re-read there 2026-10-09: +// the pin this repo builds against — `.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: +// every objectui file this record cites is byte-identical across the hop from +// `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At +// `47b1f0bb7`, re-read there 2026-10-09: // every objectui file this record cites is byte-identical across the hop from // `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At // `f0268ad78`, re-read there 2026-10-09: @@ -3715,7 +3721,16 @@ describe('object-* block props schemas — declared, so the props gate has a sch // #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` = `47b1f0bb7`, re-read there 2026-10-09: +// against (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: +// every objectui file this record cites is byte-identical across the hop from +// `47b1f0bb7` (`git diff --quiet`) except `objectql.ts` (+14/-13, comments +// only: objectui#12063, objectui `c7b30bd66`, and objectui#6152 round 15, +// objectui `025341692`, re-word the `object-chart` legacy-axis docblocks), +// whose every hunk is below the member, at `:5441` or later, so the member +// `4838` did not move and is byte-identical, still inside +// `ObjectKanbanSchema`; the `$top` read `:762`, the default `:98`, the `limit` +// row, the `limit: 250` snippet and the mapping `488-492` held unmoved. At +// `47b1f0bb7`, re-read there 2026-10-09: // every objectui file this record cites is byte-identical across the hop from // `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At // `f0268ad78`, re-read there 2026-10-09: @@ -3906,7 +3921,15 @@ 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` = `47b1f0bb7`, re-read there 2026-10-09: +// against (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: +// `KanbanBoardCore.tsx` and `ObjectKanban.tsx` are byte-identical across the +// hop from `47b1f0bb7` (`git diff --quiet`), so `:78`, `:111-112` and the +// spread `:1731` did not move, and the counts re-read the same, 2 / 2 / 11; +// `KanbanImpl.tsx` changed (+9/-6, objectui#6349 batch 7, objectui +// `c0c0a0d56`: its rule type spelled `KanbanConditionalFormattingRule` by that +// name, three lines of comment added above the props), so the gate MOVED +// `:668` / `:681` -> `:671` / `:684`, both lines byte-identical and still +// reading `quickAdd && onQuickAdd`. At `47b1f0bb7`, re-read there 2026-10-09: // `KanbanBoardCore.tsx`, `ObjectKanban.tsx` and `KanbanImpl.tsx` are // byte-identical across the hop from `f0268ad78` (`git diff --quiet`), so // `:78`, `:111-112`, the spread `:1731` and the gate `:668` / `:681` did not @@ -3988,7 +4011,7 @@ describe('ObjectKanbanPropsSchema limit — the row cap four objectui faces alre // 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 -// `quickAdd && onQuickAdd` (`KanbanImpl.tsx:668`, `:681` — the file is spelled +// `quickAdd && onQuickAdd` (`KanbanImpl.tsx:671`, `:684` — the file is spelled // here because those two ranges are NOT in `ObjectKanban.tsx`), while // `onQuickAdd` is a // host-supplied FUNCTION no producer puts on an `object-kanban` node @@ -4089,7 +4112,10 @@ describe('ObjectKanbanPropsSchema quickAdd is retired', () => { // #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` = `47b1f0bb7`, re-read there 2026-10-09: +// `.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: +// every objectui file this record cites is byte-identical across the hop from +// `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At +// `47b1f0bb7`, re-read there 2026-10-09: // every objectui file this record cites is byte-identical across the hop from // `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At // `f0268ad78`, re-read there 2026-10-09: @@ -4266,7 +4292,10 @@ describe('ObjectMetricPropsSchema icon liveness', () => { // // 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` = `47b1f0bb7`, re-read there 2026-10-09: +// (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: +// every objectui file this record cites is byte-identical across the hop from +// `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At +// `47b1f0bb7`, re-read there 2026-10-09: // every objectui file this record cites is byte-identical across the hop from // `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At // `f0268ad78`, re-read there 2026-10-09: diff --git a/packages/spec/src/ui/component.zod.ts b/packages/spec/src/ui/component.zod.ts index bac77ac9c8f..b4fd648272f 100644 --- a/packages/spec/src/ui/component.zod.ts +++ b/packages/spec/src/ui/component.zod.ts @@ -831,7 +831,10 @@ export const PageTabsProps = strictObject({ * false candidate a component over). * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `47b1f0bb7`, re-read there 2026-10-09: + * (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * every objectui file this record cites is byte-identical across the hop + * from `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At + * `47b1f0bb7`, re-read there 2026-10-09: * every objectui file this record cites is byte-identical across the hop * from `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At * `f0268ad78`, re-read there 2026-10-09: @@ -1065,7 +1068,10 @@ export const PageCardProps = strictObject({ * declarations identical. * * Each clause is read off the objectui pin this repo builds against - * (`.objectui-sha` = `47b1f0bb7174`, re-read there 2026-10-09: + * (`.objectui-sha` = `20c6d351ad74`, re-read there 2026-10-10: + * every objectui file this record cites is byte-identical across the hop from + * `47b1f0bb7174` (`git diff --quiet`), so every anchor held unmoved. At + * `47b1f0bb7174`, re-read there 2026-10-09: * every objectui file this record cites is byte-identical across the hop from * `f0268ad78485` (`git diff --quiet`), so every anchor held unmoved. At * `f0268ad78485`, re-read there 2026-10-09: @@ -2394,7 +2400,10 @@ export const PageAccordionProps = strictObject({ * re-derive the same false candidate). * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `47b1f0bb7`, re-read there 2026-10-09: + * (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * every objectui file this record cites is byte-identical across the hop + * from `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At + * `47b1f0bb7`, re-read there 2026-10-09: * every objectui file this record cites is byte-identical across the hop * from `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At * `f0268ad78`, re-read there 2026-10-09: @@ -2750,7 +2759,10 @@ export const ElementButtonPropsSchema = lazySchema(() => strictObject({ * the button. * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `47b1f0bb7`, re-read there 2026-10-09: + * (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * every objectui file this record cites is byte-identical across the hop from + * `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At + * `47b1f0bb7`, re-read there 2026-10-09: * every objectui file this record cites is byte-identical across the hop from * `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At * `f0268ad78`, re-read there 2026-10-09: @@ -3245,7 +3257,19 @@ 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` = `47b1f0bb7`, re-read there 2026-10-09: + * against, `.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * `public-blocks.ts`, `auto-trigger.ts`, `static-params.ts`, `ui/button.tsx`, + * the four `action-*.tsx` renderers and `basic/data-list.tsx` are + * byte-identical across the hop from `47b1f0bb7` (`git diff --quiet`), so + * their anchors held unmoved; `data-objectstack/src/index.ts` changed in three + * docblocks above the `translateFilterArray` arm (+15/-9, objectui#5144, + * objectui `3c3115e38`: the inline-edit toggle no longer writes `inlineEdit`), + * which MOVED `5042-5053` -> `5048-5059` byte-identical and left + * `serializeOrderBy` (`868-894`) unmoved; and `previews/block-config.ts` + * changed below the `columns` control (+10/-4, objectui#12056, objectui + * `2a48bd408`: the repeater's inspector rows write the node-level + * `dataSource`), which did not move from `335`. At `47b1f0bb7`, re-read there + * 2026-10-09: * every objectui file this record cites is byte-identical across the hop from * `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At * `f0268ad78`, re-read there 2026-10-09: @@ -3780,7 +3804,10 @@ export type ActionIconPropsParsed = z.infer; * inventory. A member's `params` is its `ActionParam[]` input list: both * containers forward an array as `actionParams` (group `:346-348`, menu * `:270-272`, re-read at the pin this repo builds against, `.objectui-sha` = - * `47b1f0bb7`, 2026-10-09: `action-group.tsx`, `action-menu.tsx` and + * `20c6d351a`, 2026-10-10: `action-group.tsx`, `action-menu.tsx` and + * `static-params.ts` are byte-identical across the hop from `47b1f0bb7` (`git + * diff --quiet`), so both held unmoved; at `47b1f0bb7`, 2026-10-09: + * `action-group.tsx`, `action-menu.tsx` and * `static-params.ts` are byte-identical across the hop from `f0268ad78` (`git * diff --quiet`), so both held unmoved; at `f0268ad78`, 2026-10-09: both MOVED * with their text byte-identical, by 21 @@ -4190,7 +4217,7 @@ export type ElementDefinitionListProps = z.input 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` = `47b1f0bb7`, re-read there 2026-10-09: + * pin this repo builds against (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * every objectui file this record cites is byte-identical across the hop from + * `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved, and the same + * method still finds 15 hit lines against 3 for the control. At `47b1f0bb7`, + * re-read there 2026-10-09: * `ObjectGrid.tsx` changed across the hop from `f0268ad78` (+19/-11: * objectui#11865 slice m, objectui `2063f7a96`: one import line, and the * grouped pager's rows-per-page picker drawn with the shared `Select`) and @@ -4549,7 +4580,10 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({ * same members, and objectui's grid follows this declaration. * * ⚠️ That gap is closed at the pin this repo builds against (`.objectui-sha` - * = `47b1f0bb7`, re-read there 2026-10-09: + * = `20c6d351a`, re-read there 2026-10-10: + * every objectui file this record cites is byte-identical across the hop from + * `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At + * `47b1f0bb7`, re-read there 2026-10-09: * `ObjectGrid.tsx` changed across the hop from `f0268ad78` (+19/-11: * objectui#11865 slice m, objectui `2063f7a96`: one import line, and the * grouped pager's rows-per-page picker drawn with the shared `Select`), every @@ -4952,7 +4986,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` = `47b1f0bb7`, re-read there 2026-10-09: + * Read at the pin this repo builds against (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * every objectui file this record cites is byte-identical across the hop from + * `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At + * `47b1f0bb7`, re-read there 2026-10-09: * `ObjectGrid.tsx` changed across the hop from `f0268ad78` (+19/-11: * objectui#11865 slice m, objectui `2063f7a96`: one import line, and the * grouped pager's rows-per-page picker drawn with the shared `Select`) and @@ -5371,7 +5408,10 @@ export const ObjectMetricPropsSchema = lazySchema(() => strictObject({ * same record for the metric tile. * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `47b1f0bb7`, re-read there 2026-10-09: + * (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * every objectui file this record cites is byte-identical across the hop from + * `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At + * `47b1f0bb7`, re-read there 2026-10-09: * every objectui file this record cites is byte-identical across the hop from * `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At * `f0268ad78`, re-read there 2026-10-09: @@ -5622,7 +5662,10 @@ const ObjectKanbanLaneSchema = lazySchema(() => strictObject({ * DESIGNER's spelling with * zero read points (#7973 class) — aliased to the `groupBy` the board reads. * `limit` (#16503) was measured later, at the pin this repo builds against - * (`.objectui-sha` = `47b1f0bb7`, re-read there 2026-10-09: + * (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * every objectui file this record cites is byte-identical across the hop from + * `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At + * `47b1f0bb7`, re-read there 2026-10-09: * every objectui file this record cites is byte-identical across the hop from * `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At * `f0268ad78`, re-read there 2026-10-09: @@ -5732,7 +5775,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` = `47b1f0bb7`, re-read there 2026-10-09: + * repo builds against (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * every objectui file this record cites is byte-identical across the hop from + * `47b1f0bb7` (`git diff --quiet`) except `objectql.ts` (+14/-13, comments + * only: objectui#12063, objectui `c7b30bd66`, and objectui#6152 round 15, + * objectui `025341692`, re-word the `object-chart` legacy-axis docblocks), + * whose every hunk is below the member, at `:5441` or later, so the member + * `4838` did not move and is byte-identical, still inside + * `ObjectKanbanSchema`; every other anchor held unmoved, and + * `plugin-kanban/src/types.ts` still declares no row-cap member. At + * `47b1f0bb7`, re-read there 2026-10-09: * every objectui file this record cites is byte-identical across the hop from * `f0268ad78` (`git diff --quiet`), so every anchor held unmoved, and * `plugin-kanban/src/types.ts` still declares no row-cap member. At @@ -6001,7 +6053,16 @@ 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` = `47b1f0bb7`, re-read there 2026-10-09: + * (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * `KanbanBoardCore.tsx`, `ObjectKanban.tsx` and `plugin-kanban/src/index.tsx` + * are byte-identical across the hop from `47b1f0bb7` (`git diff --quiet`), so + * `:78` and `345-346` did not move; `KanbanImpl.tsx` changed (+9/-6, + * objectui#6349 batch 7, objectui `c0c0a0d56`: its rule type spelled + * `KanbanConditionalFormattingRule` by that name, three comment lines added + * above the props), so the gate MOVED `:668` / `:681` -> `:671` / `:684`, + * both lines byte-identical; `ObjectKanban.tsx` still names `quickAdd` and + * `onQuickAdd` 2 times each against 11 for `onCardClick`, and objectui still + * registers no `kanban-ui` block. At `47b1f0bb7`, re-read there 2026-10-09: * `KanbanBoardCore.tsx`, `ObjectKanban.tsx`, `KanbanImpl.tsx` and * `plugin-kanban/src/index.tsx` are byte-identical across the hop from * `f0268ad78` (`git diff --quiet`), so `:78`, `:668`, `:681` and `345-346` @@ -6106,7 +6167,7 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ * which passes * `quickAdd={schema.quickAdd}` and `onQuickAdd={schema.onQuickAdd}` * (`plugin-kanban/src/index.tsx:357-358` there, `:345-346` at this pin) — but the affordance is gated on - * BOTH (`KanbanImpl.tsx:668` and `:681`), and `onQuickAdd` is a + * BOTH (`KanbanImpl.tsx:671` and `:684`), and `onQuickAdd` is a * host-supplied FUNCTION that JSON cannot carry and no producer puts on an * `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 @@ -6199,6 +6260,9 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ * element schemas). * * Measured at the pin this repo builds against (`.objectui-sha` = + * `20c6d351a`, re-read there 2026-10-10: + * every objectui file this record cites is byte-identical across the hop from + * `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At * `47b1f0bb7`, re-read there 2026-10-09: * every objectui file this record cites is byte-identical across the hop from * `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At @@ -6414,6 +6478,9 @@ export const ObjectCalendarPropsSchema = lazySchema(() => strictObject({ * `object-kanban`'s above. * * Measured at the pin this repo builds against (`.objectui-sha` = + * `20c6d351a`, re-read there 2026-10-10: + * every objectui file this record cites is byte-identical across the hop from + * `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At * `47b1f0bb7`, re-read there 2026-10-09: * every objectui file this record cites is byte-identical across the hop from * `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At @@ -7626,7 +7693,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` = `47b1f0bb7`, re-read there 2026-10-09: + * `.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * every objectui file this record cites is byte-identical across the hop from + * `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At + * `47b1f0bb7`, re-read there 2026-10-09: * every objectui file this record cites is byte-identical across the hop from * `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At * `f0268ad78`, re-read there 2026-10-09: @@ -7818,7 +7888,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` = `47b1f0bb7`, re-read there 2026-10-09: + * pin this repo builds against (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * every objectui file this record cites is byte-identical across the hop from + * `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At + * `47b1f0bb7`, re-read there 2026-10-09: * every objectui file this record cites is byte-identical across the hop from * `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At * `f0268ad78`, re-read there 2026-10-09: @@ -7889,7 +7962,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` = `47b1f0bb7`, re-read there 2026-10-09: + * (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * every objectui file this record cites is byte-identical across the hop from + * `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At + * `47b1f0bb7`, re-read there 2026-10-09: * every objectui file this record cites is byte-identical across the hop from * `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At * `f0268ad78`, re-read there 2026-10-09: @@ -8082,7 +8158,12 @@ 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` = `47b1f0bb7`, re-read there 2026-10-09: + * — `.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * `ObjectGantt.tsx`, `record-source.ts` and `plugin-gantt/src/index.tsx` are + * byte-identical across the hop from `47b1f0bb7` (`git diff --quiet`), so every + * anchor in them held unmoved; `ListView.tsx` changed (+281/-235), and its + * `case 'gantt'` still writes the toolbar Search term onto the node as `search` + * / `searchableFields`. At `47b1f0bb7`, re-read there 2026-10-09: * `ObjectGantt.tsx`, `record-source.ts` and `plugin-gantt/src/index.tsx` are * byte-identical across the hop from `f0268ad78` (`git diff --quiet`), so every * anchor in them held unmoved. At `f0268ad78`, re-read there 2026-10-09: @@ -8329,7 +8410,19 @@ export type ObjectGanttPropsParsed = z.infer; * they flatten `options.tree` (`ListView.tsx:3913-3932`, `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` = `47b1f0bb7`, re-read there 2026-10-09: + * pin this repo builds against (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * `ObjectTree.tsx` and `plugin-tree/src/index.tsx` are byte-identical to + * `47b1f0bb7` (`git diff --quiet`), so `289-302` and `240-261` did not move; + * `ListView.tsx` changed (+281/-235), its `case 'tree'` arm with it, which + * MOVED `3913-3932` -> `3965-3989`: objectui#6152 round 14 (objectui + * `3fd862510`) retired the arm's `treeCfg.titleField` label rung and its raw + * `...treeCfg` spread, so the arm now emits `parentField`, `labelField: + * treeCfg.labelField || 'name'` (`:3986`), `fields` and + * `defaultExpandedDepth` by name and NO `titleField`. The read `:3927` that the + * `titleField` paragraph below cites is therefore GONE at this pin, not moved; + * that paragraph is left as written and reported to the pin bump's review, + * because changing the key set it justifies is a schema change this re-read + * does not make. At `47b1f0bb7`, re-read there 2026-10-09: * `ObjectTree.tsx` and `plugin-tree/src/index.tsx` are byte-identical to * `f0268ad78` (`git diff --quiet`), so `289-302` and `240-261` did not move; * `ListView.tsx` changed above and below its `case 'tree'` arm (+85/-26: @@ -8443,7 +8536,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` = `47b1f0bb7`, re-read there 2026-10-09: + * — `.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * every objectui file this record cites is byte-identical across the hop from + * `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At + * `47b1f0bb7`, re-read there 2026-10-09: * every objectui file this record cites is byte-identical across the hop from * `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At * `f0268ad78`, re-read there 2026-10-09: @@ -8633,7 +8729,14 @@ 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` = `47b1f0bb7`, re-read there 2026-10-09: + * builds against (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * re-COUNTED by the same method, 0 for the tree, 3 each for + * `plugin-calendar` and `plugin-gantt` and 4 for `plugin-map`, those four + * shells byte-identical across the hop from `47b1f0bb7` (`git diff --quiet`), + * and 3 for `plugin-grid`, whose shell changed in one type re-export only + * (+1/-1, objectui#6349 batch 7, objectui `c0c0a0d56`: `AggregationConfig` + * re-exported as `GroupAggregationConfig`), its wiring unchanged. At + * `47b1f0bb7`, re-read there 2026-10-09: * re-COUNTED by the same method, all five `src/index.tsx` shells are * byte-identical across the hop from `f0268ad78` (`git diff --quiet`) and * read 0 for the tree, 3 each for `plugin-calendar`, `plugin-gantt` and @@ -9026,7 +9129,17 @@ 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` = `47b1f0bb7`, re-read there 2026-10-09: + * repo builds against (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * `renderer.tsx` and `index.tsx` are byte-identical to `47b1f0bb7` (`git diff + * --quiet`), so their anchors held unmoved; `ObjectTimeline.tsx` changed + * (+15/-15, objectui#6152 round 14, objectui `3fd862510`: the nested + * `timeline.dateField` alias rung retired from the start-date chain and from + * the refusal's key list, with their comments) without touching a cited line, + * so every anchor in it held or MOVED with its cited text byte-identical — by + * 1 between the key list and the start-date chain (`:306` -> `:307` through + * `:565` -> `:566`), `:30` and everything from `:591` on not moving — and each + * is cited below at this pin. The `schema.*` read set of all three is + * unchanged. At `47b1f0bb7`, re-read there 2026-10-09: * every objectui file this record cites is byte-identical across the hop from * `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At * `f0268ad78`, re-read there 2026-10-09: @@ -9146,29 +9259,29 @@ function objectTimelineItemsFitVariant() { * directions: nothing accepted a real key and nothing refused a typo. * * Read points per key, in `ObjectTimeline.tsx` unless named otherwise: - * `objectName` (`:308` the fetch gate, `:388-391` the object-def load through - * `useSettledSchema`, `:426` the `fetchesForItself` gate — the check that + * `objectName` (`:309` the fetch gate, `:389-392` the object-def load through + * `useSettledSchema`, `:427` the `fetchesForItself` gate — the check that * sat inside the fetch effect at `:420` is hoisted to render scope at this - * pin, where `:427` also subscribes the invalidation bus on it - * (objectui#10623) and the effect reads it at `:531` — `:433` / `:491` + * pin, where `:428` also subscribes the invalidation bus on it + * (objectui#10623) and the effect reads it at `:532` — `:434` / `:492` * inside the fetch effect, * `:832` the pull-to-refresh gate, `:617` the entry composition and `:845` - * the navigation binding), `timeline` (`:325`, + * the navigation binding), `timeline` (`:326`, * the canonical nested config every field resolution prefers), `filter` - * (`:414`, read once through `useResolvedFilter`, which resolves its context - * tokens — objectui#10666 — and holds the result; `:415` keys the fetch on - * it and `:492` sends it to `$filter`, where `f8a9d0fb0` sent `schema.filter` - * verbatim at `:341` / `:405`), `sort` (`:416`, `:493` — through + * (`:415`, read once through `useResolvedFilter`, which resolves its context + * tokens — objectui#10666 — and holds the result; `:416` keys the fetch on + * it and `:493` sends it to `$filter`, where `f8a9d0fb0` sent `schema.filter` + * verbatim at `:341` / `:405`), `sort` (`:417`, `:494` — through * the shared `convertSortToQueryParams` sink, as `object-calendar`'s does), - * `limit` (`:494`, the fetch's one top-level `$top`, through + * `limit` (`:495`, the fetch's one top-level `$top`, through * `resolveRowLimit(schema.limit, DEFAULT_TIMELINE_LIMIT)` with the default - * `100` at `:30` and the refused-cap diagnostic at `:342`), `items` (`:306`, `:426`, `:602`, + * `100` at `:30` and the refused-cap diagnostic at `:343`), `items` (`:307`, `:427`, `:602`, * `:861` — the authored pass-through that short-circuits the object query), - * `data` (`:307`, `:426`, `:553`, `:555` — the pre-fetched record source, + * `data` (`:308`, `:427`, `:554`, `:556` — the pre-fetched record source, * read off REACT PROPS rather than `schema`; the door's own docblock carries * how an authored key reaches that channel and why a `schema.*` sweep alone * publishes a false refusal), - * `descriptionField` (`:593`), `mapping` (`:565`, `:591`, `:593`, `:594`), + * `descriptionField` (`:593`), `mapping` (`:566`, `:591`, `:593`, `:594`), * `variant` (`:899`) and `navigation` (`:843-846` → `:978` → `:1033-1034`). * Four more are read by the presentational renderer off the schema this * component spreads into it (`effectiveSchema`, `:962-981`): `dateFormat` @@ -9186,7 +9299,7 @@ function objectTimelineItemsFitVariant() { * ({@link OBJECT_TIMELINE_FLAT_CONFIG_GUIDANCE}) — the runtime handoff * `ListView` emits, not a second authoring spelling; * - `bind` — the objectui data-scope key the section header above rules out - * for every block in this family (`:346` here); + * for every block in this family (`:347` here); * - `className` (`:965`) — a node-level key on `PageComponentSchema`, not a * per-block prop; * - `onItemClick` / `onRowClick` — host callbacks JSON cannot carry. @@ -9262,7 +9375,17 @@ 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` = - * `47b1f0bb7`, re-read there 2026-10-09: + * `20c6d351a`, re-read there 2026-10-10: + * `record-source.ts` and `SchemaRenderer.tsx` are byte-identical across the hop + * from `47b1f0bb7` (`git diff --quiet`), so the prop channel above still + * carries the key; the file changed (+15/-15, objectui#6152 round 14, objectui + * `3fd862510`: the nested `timeline.dateField` alias rung and its entry in + * the refusal's key list retired, with their comments), away from these + * reads, so every anchor held or MOVED with its cited read byte-identical, by + * 1 between the key list and the start-date chain and by 0 below it: `:307` + * -> `:308`, `:426` -> `:427`, `:531` -> `:532`, `:553` -> `:554`, `:555` -> + * `:556`, while `:678-679` and `:709` held. At `47b1f0bb7`, re-read there + * 2026-10-09: * every objectui file this record cites is byte-identical across the hop from * `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At * `f0268ad78`, re-read there 2026-10-09: @@ -9345,9 +9468,9 @@ export const ObjectTimelinePropsSchema = lazySchema(() => strictObject({ * `recordDisplayValueAt` (`:653`, objectui#10530), not `item[titleField]`. * At `f8a9d0fb0` the file was byte-identical to `62597c588` and * `87af769e9`, where they were re-READ 2026-09-22), all in - * `ObjectTimeline.tsx`: `:307` seeds the loading state off it, `:426` + * `ObjectTimeline.tsx`: `:308` seeds the loading state off it, `:427` * SKIPS the object query when it is present (the gate the effect reads at - * `:531`), `:553` tracks it, and `:555` + * `:532`), `:554` tracks it, and `:556` * is the row source itself — `(props as any).data || boundData || * fetchedData`, so it wins over both the data-scope binding and the fetch. * Unlike `items` one line down, these rows are RECORDS: they go through the @@ -9589,6 +9712,15 @@ 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` = + // `20c6d351a`, re-read there 2026-10-10: + // `public-blocks.ts`, `data-list.tsx` and `block-types.ts` are byte-identical + // across the hop from `47b1f0bb7` (`git diff --quiet`), so `:117-118`, + // `:85`, `:311` and `137-138` did not move; `block-config.ts` changed (+10/-4, + // objectui#12056, objectui `2a48bd408`) between and inside the two + // inspectors: a six-line comment above the repeater's, and its object, + // title-field, fields and limit rows now writing and reading the node-level + // `dataSource` binding, so the two inspectors were re-READ and span + // `311-345` -> `311-351`, each still the block's own inspector. At // `47b1f0bb7`, re-read there 2026-10-09: // every objectui file this record cites is byte-identical across the hop from // `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At @@ -9644,7 +9776,7 @@ export const ComponentPropsMap = { // tracked `sdui.manifest.json` carries both; // - authorship: the Studio page designer's palette offers both // (`app-shell/src/views/metadata-admin/previews/block-types.ts:137-138`), - // each with its own inspector (`previews/block-config.ts:311-345`), so + // each with its own inspector (`previews/block-config.ts:311-351`), so // stored pages hold them. 'element:definition-list': ElementDefinitionListPropsSchema, 'element:repeater': ElementRepeaterPropsSchema, @@ -9678,6 +9810,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` = + // `20c6d351a`, re-read there 2026-10-10: + // every objectui file this record cites is byte-identical across the hop from + // `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At // `47b1f0bb7`, re-read there 2026-10-09: // every objectui file this record cites is byte-identical across the hop from // `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At @@ -9755,7 +9890,14 @@ 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` = - // `47b1f0bb7`, re-read there 2026-10-09: + // `20c6d351a`, re-read there 2026-10-10: + // `renderer.tsx` and `index.tsx` are byte-identical to `47b1f0bb7` (`git diff + // --quiet`); `ObjectTimeline.tsx` changed (+15/-15, objectui#6152 round 14, + // objectui `3fd862510`: the nested `timeline.dateField` alias rung retired, + // with its entry in the refusal's key list and their comments) and was + // re-READ: every anchor held or moved with its text byte-identical, the + // `schema.*` read set is unchanged (the same 19 names at both pins), and no + // declared key set moved. At `47b1f0bb7`, re-read there 2026-10-09: // every objectui file this record cites is byte-identical across the hop from // `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At // `f0268ad78`, re-read there 2026-10-09: diff --git a/packages/spec/src/ui/dataset.zod.ts b/packages/spec/src/ui/dataset.zod.ts index 33eac541ec3..a8009333f2e 100644 --- a/packages/spec/src/ui/dataset.zod.ts +++ b/packages/spec/src/ui/dataset.zod.ts @@ -283,6 +283,9 @@ 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` = + * `20c6d351a`, re-read there 2026-10-10: + * every objectui file this record cites is byte-identical across the hop from + * `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At * `47b1f0bb7`, re-read there 2026-10-09: * every objectui file this record cites is byte-identical across the hop from * `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At diff --git a/packages/spec/src/ui/view.zod.ts b/packages/spec/src/ui/view.zod.ts index b86652a3429..ce51d5818a4 100644 --- a/packages/spec/src/ui/view.zod.ts +++ b/packages/spec/src/ui/view.zod.ts @@ -2195,14 +2195,26 @@ export const TreeConfigSchema = lazySchema(() => strictObject({ * `.strict()`, and `LIST_VIEW_LOCAL_OVERRIDES` `1437` -> `1506`, the whole * list byte-identical and still without `map`; and the two `getMapConfig` * lines `415` -> `449` and `420` -> `454`, byte-identical, objectui#11819's - * WebGL2 probe landing above them. Each anchor quotes the line it was read at, + * WebGL2 probe landing above them. RE-READ again at pin `20c6d351a` on + * 2026-10-10: that bump redded three anchors, and none of them changed what + * it reads. `ListView.tsx` (+281/-235: objectui#6152 rounds 14 and 15 among + * others) grew above `resolveListMapConfig`, `147` -> `200`, byte-identical, + * while `FLAT_MAP_CONFIG_SPELLING` did not move from `86`; `case 'map':` in + * `ObjectView.tsx` `2340` -> `2461`, the whole arm byte-identical + * (objectui#6152 rounds 14 and 15, objectui#5144 and objectui#12053 changed + * the file around it); in `objectql.zod.ts` (+49/-38: objectui#6152 rounds 14 + * and 15, objectui#12063) `ObjectMapConfigSchema` `2513` -> `2523`, its + * declaration byte-identical and still closed with `.strict()`, while + * `LIST_VIEW_LOCAL_OVERRIDES` did not move from `1506`, the whole list + * byte-identical and still without `map`; `ObjectMap.tsx` is byte-identical, + * so the two `getMapConfig` lines 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:147` first line + * (`packages/plugin-list/src/ListView.tsx:200` first line * `function resolveListMapConfig(schema: { map?: unknown; options?: { map?: unknown } }): Record {`) - * and `ObjectView` (`packages/plugin-view/src/ObjectView.tsx:2340` first line + * and `ObjectView` (`packages/plugin-view/src/ObjectView.tsx:2461` first line * `case 'map':`) copy it through a HAND-LISTED whitelist * (`packages/plugin-list/src/ListView.tsx:86` first line * `export const FLAT_MAP_CONFIG_SPELLING = {`) — ⚠️ re-read at the new pin: @@ -2214,7 +2226,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:2513` first line + * `packages/types/src/zod/objectql.zod.ts:2523` 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()` @@ -3286,7 +3298,13 @@ 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` = `47b1f0bb7`, re-read there 2026-10-09: + * (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * `autoLayout.ts`, `fields`' `field-type-alias.ts` and `form.tsx` are + * byte-identical to `47b1f0bb7` (`git diff --quiet`), so `resolveColSpan` + * `:154`, `WIDE_FIELD_TYPES` `:58-69`, the `repeater` -> `field:grid` + * mapping, `spanLadderFor` `:274-301` and its one call site `:3202` held + * unmoved, so it still emits the ladder. At `47b1f0bb7`, re-read there + * 2026-10-09: * `autoLayout.ts`, `fields`' `field-type-alias.ts` and `form.tsx` are * byte-identical to `f0268ad78` (`git diff --quiet`), so `resolveColSpan` * `:154`, `WIDE_FIELD_TYPES` `:58-69`, the `repeater` -> `field:grid` @@ -3365,7 +3383,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` = `47b1f0bb7174`), 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` = `20c6d351ad74`), 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 be0225c2302cdede7194330b99b4130db1c7c627 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 10 Oct 2026 01:02:18 +0000 Subject: [PATCH 4/6] chore(objectui): answer the console bump's ADR-0087 disposition; add the spec pin-citation changeset Claude-Session: https://claude.ai/code/session_01LYXc6ckoWuZyVZpWYizdMh Co-authored-by: Claude --- .changeset/console-20c6d351ad74.md | 43 ++++++++++++++++++- .../objectui-pin-citations-20c6d351ad74.md | 21 +++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 .changeset/objectui-pin-citations-20c6d351ad74.md diff --git a/.changeset/console-20c6d351ad74.md b/.changeset/console-20c6d351ad74.md index 4734f14b4b1..1f3964b8c17 100644 --- a/.changeset/console-20c6d351ad74.md +++ b/.changeset/console-20c6d351ad74.md @@ -46,6 +46,47 @@ Derived from the changesets objectui declared over the range — 33 releasing of - _(no changeset)_ docs(agents): an authored `events` bag is refused by `objectui validate` once PR objectui#11069 lands (objectui#5250) (#12050) (objectui `972e56659`) - + objectui range: `47b1f0bb7174...20c6d351ad74` diff --git a/.changeset/objectui-pin-citations-20c6d351ad74.md b/.changeset/objectui-pin-citations-20c6d351ad74.md new file mode 100644 index 00000000000..8878ec5cb20 --- /dev/null +++ b/.changeset/objectui-pin-citations-20c6d351ad74.md @@ -0,0 +1,21 @@ +--- +'@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 `20c6d351ad74`. + +Clause-②: no + +Every anchor was mapped through the objectui diff `47b1f0bb7174..20c6d351ad74`: 320 paths over 24 commits, 2 of them deleted test files, none renamed. Ten files a record cites changed on the hop, plus the `en` / `zh` / `de` packs: `ListView.tsx` and `ObjectTimeline.tsx` (objectui#6152 rounds 14 and 15), plugin-view's `ObjectView.tsx`, `objectql.ts` and `objectql.zod.ts` (the same rounds and objectui#12063), `KanbanImpl.tsx` and `plugin-grid/src/index.tsx` (objectui#6349 batch 7), `ActionRunner.ts` (objectui#6349 batch 4), `data-objectstack/src/index.ts` (objectui#5144) and `previews/block-config.ts` (objectui#12056). Every cited line in them moved or held with its text byte-identical, except in the four readings below, and each record that cites one is re-pointed with a hop sentence that says by how much. The records that cite only byte-identical files gain a hop sentence that says so. + +Three readings changed around a cited read, and each hop sentence says what it found: + +- The calendar, gantt and tree arms of `ListView.tsx` changed inside (objectui `3fd862510` retired their raw block spreads, the calendar's `defaultView` lift and the tree's `titleField` label rung). The calendar and gantt rows of `functional-completeness.ts` still hold: their date bindings stay conditional, with no floor. +- `previews/block-config.ts` now writes the repeater's object and limit into the node-level `dataSource` (objectui#12056); the two inspectors span `311-351`. +- `ObjectTimeline.tsx`'s start-date chain lost its nested `timeline.dateField` rung; it still ends without a literal rung, and the component's `schema.*` read set is unchanged. + +The fourth reading: one record names a read that is gone at this pin. The `OBJECT_TREE_FLAT_CONFIG_GUIDANCE` docblock keeps `titleField` in the flat tree key set because `ListView`'s flatten resolved `treeCfg.titleField` into `labelField`. objectui `3fd862510` removed that rung. The hop sentence records it; the paragraph and the key set are left as they are, because changing the key set is a schema decision this re-read does not make. + +The six migration entries' corpus counts were re-taken with `git grep -o -F`, the method that reproduces every `47b1f0bb7174` number. The corpus is now 8351 tracked files. Every token an entry counts as zero still reads zero (97 tokens). The controls moved with the corpus, for example `objectstack` from 17980 to 18047 and `timeout` from 1674 to 1694. + +No key, default, enum member or export moves. From 6ae8a6d9e26535f59cb88b8350b5d2623dc9ff52 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 10 Oct 2026 01:12:06 +0000 Subject: [PATCH 5/6] docs(spec): regenerate the view reference for the FormField.span pin re-citation Claude-Session: https://claude.ai/code/session_01LYXc6ckoWuZyVZpWYizdMh 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 63d5f3eda96..01f325c0aff 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` = `47b1f0bb7174`), 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` = `20c6d351ad74`), 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` = `47b1f0bb7174`), 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` = `20c6d351ad74`), 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 c1eb5b6d824069c0338addfe83a335cccde6e559 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 10 Oct 2026 01:39:23 +0000 Subject: [PATCH 6/6] docs(spec): regenerate the view reference after merging main Claude-Session: https://claude.ai/code/session_01LYXc6ckoWuZyVZpWYizdMh Co-authored-by: Claude --- content/docs/references/ui/view.mdx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/docs/references/ui/view.mdx b/content/docs/references/ui/view.mdx index 01f325c0aff..76fc5efec84 100644 --- a/content/docs/references/ui/view.mdx +++ b/content/docs/references/ui/view.mdx @@ -785,7 +785,7 @@ Map view configuration | **gantt** | `{ startDateField: string; endDateField: string; titleField: string; progressField?: string; … }` | optional | Gantt-timeline configuration — applies when the view renders as a gantt layout | | **gallery** | `{ coverField?: string; coverFit?: Enum<'cover' \| 'contain'>; cardSize?: Enum<'small' \| 'medium' \| 'large'>; titleField?: string; … }` | optional | Gallery/card view configuration | | **timeline** | `{ startDateField: string; endDateField?: string; titleField: string; groupByField?: string; … }` | optional | Timeline view configuration | -| **chart** | `{ chartType?: Enum<'bar' \| 'line' \| 'pie' \| 'area' \| 'scatter'>; dataset: string; dimensions?: string[]; values: string[] }` | optional | List chart view configuration | +| **chart** | `{ chartType?: Enum<'bar' \| 'line' \| 'pie' \| 'area' \| 'scatter'>; dataset: string; dimensions?: string[]; values: string[] }` | optional | Chart binding — applies when the view renders as a chart. A `type: 'chart'` view must bind one: it names the ADR-0021 `dataset` and the measures (`values`) the chart plots, and there is no default binding | | **map** | `{ latitudeField?: string; longitudeField?: string; locationField?: string; titleField?: string; … }` | optional | Map configuration — applies when the view renders as a map layout | | **tree** | `{ parentField?: string; labelField?: string; fields?: string[]; defaultExpandedDepth?: integer }` | optional | Tree/hierarchy configuration — applies when the view renders as a tree layout | | **pageName** | `never` | optional | [REMOVED] `view.pageName` was removed in @objectstack/spec 17.5.0 (ADR-0049 enforce-or-remove) — it named the page a `type: 'page'` view was to mount, and that mount was never built: no renderer read the key, so the named page was never reached and the view drew an empty grid. Delete the key; to put a published page in front of users, give the app a navigation item — `{ type: 'page', pageName: '' }` under the app's `navigation` — which is a different key on a different surface and is the page mount that has always rendered. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; `--write` applies the ones it can prove, and you apply the rest by hand. | @@ -1177,7 +1177,7 @@ View filter rule | **gantt** | `{ startDateField: string; endDateField: string; titleField: string; progressField?: string; … }` | optional | Gantt-timeline configuration — applies when the view renders as a gantt layout | | **gallery** | `{ coverField?: string; coverFit?: Enum<'cover' \| 'contain'>; cardSize?: Enum<'small' \| 'medium' \| 'large'>; titleField?: string; … }` | optional | Gallery/card view configuration | | **timeline** | `{ startDateField: string; endDateField?: string; titleField: string; groupByField?: string; … }` | optional | Timeline view configuration | -| **chart** | `{ chartType?: Enum<'bar' \| 'line' \| 'pie' \| 'area' \| 'scatter'>; dataset: string; dimensions?: string[]; values: string[] }` | optional | List chart view configuration | +| **chart** | `{ chartType?: Enum<'bar' \| 'line' \| 'pie' \| 'area' \| 'scatter'>; dataset: string; dimensions?: string[]; values: string[] }` | optional | Chart binding — applies when the view renders as a chart. A `type: 'chart'` view must bind one: it names the ADR-0021 `dataset` and the measures (`values`) the chart plots, and there is no default binding | | **map** | `{ latitudeField?: string; longitudeField?: string; locationField?: string; titleField?: string; … }` | optional | Map configuration — applies when the view renders as a map layout | | **tree** | `{ parentField?: string; labelField?: string; fields?: string[]; defaultExpandedDepth?: integer }` | optional | Tree/hierarchy configuration — applies when the view renders as a tree layout | | **pageName** | `never` | optional | [REMOVED] `view.pageName` was removed in @objectstack/spec 17.5.0 (ADR-0049 enforce-or-remove) — it named the page a `type: 'page'` view was to mount, and that mount was never built: no renderer read the key, so the named page was never reached and the view drew an empty grid. Delete the key; to put a published page in front of users, give the app a navigation item — `{ type: 'page', pageName: '' }` under the app's `navigation` — which is a different key on a different surface and is the page mount that has always rendered. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; `--write` applies the ones it can prove, and you apply the rest by hand. | @@ -1760,7 +1760,7 @@ Tab configuration for multi-tab view interface | **gantt** | `{ startDateField: string; endDateField: string; titleField: string; progressField?: string; … }` | optional | Gantt-timeline configuration — applies when the view renders as a gantt layout | | **gallery** | `{ coverField?: string; coverFit?: Enum<'cover' \| 'contain'>; cardSize?: Enum<'small' \| 'medium' \| 'large'>; titleField?: string; … }` | optional | Gallery/card view configuration | | **timeline** | `{ startDateField: string; endDateField?: string; titleField: string; groupByField?: string; … }` | optional | Timeline view configuration | -| **chart** | `{ chartType?: Enum<'bar' \| 'line' \| 'pie' \| 'area' \| 'scatter'>; dataset: string; dimensions?: string[]; values: string[] }` | optional | List chart view configuration | +| **chart** | `{ chartType?: Enum<'bar' \| 'line' \| 'pie' \| 'area' \| 'scatter'>; dataset: string; dimensions?: string[]; values: string[] }` | optional | Chart binding — applies when the view renders as a chart. A `type: 'chart'` view must bind one: it names the ADR-0021 `dataset` and the measures (`values`) the chart plots, and there is no default binding | | **map** | `{ latitudeField?: string; longitudeField?: string; locationField?: string; titleField?: string; … }` | optional | Map configuration — applies when the view renders as a map layout | | **tree** | `{ parentField?: string; labelField?: string; fields?: string[]; defaultExpandedDepth?: integer }` | optional | Tree/hierarchy configuration — applies when the view renders as a tree layout | | **pageName** | `never` | optional | [REMOVED] `view.pageName` was removed in @objectstack/spec 17.5.0 (ADR-0049 enforce-or-remove) — it named the page a `type: 'page'` view was to mount, and that mount was never built: no renderer read the key, so the named page was never reached and the view drew an empty grid. Delete the key; to put a published page in front of users, give the app a navigation item — `{ type: 'page', pageName: '' }` under the app's `navigation` — which is a different key on a different surface and is the page mount that has always rendered. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; `--write` applies the ones it can prove, and you apply the rest by hand. | @@ -1845,7 +1845,7 @@ Tab configuration for multi-tab view interface | **gantt** | `{ startDateField: string; endDateField: string; titleField: string; progressField?: string; … }` | optional | Gantt-timeline configuration — applies when the view renders as a gantt layout | | **gallery** | `{ coverField?: string; coverFit?: Enum<'cover' \| 'contain'>; cardSize?: Enum<'small' \| 'medium' \| 'large'>; titleField?: string; … }` | optional | Gallery/card view configuration | | **timeline** | `{ startDateField: string; endDateField?: string; titleField: string; groupByField?: string; … }` | optional | Timeline view configuration | -| **chart** | `{ chartType?: Enum<'bar' \| 'line' \| 'pie' \| 'area' \| 'scatter'>; dataset: string; dimensions?: string[]; values: string[] }` | optional | List chart view configuration | +| **chart** | `{ chartType?: Enum<'bar' \| 'line' \| 'pie' \| 'area' \| 'scatter'>; dataset: string; dimensions?: string[]; values: string[] }` | optional | Chart binding — applies when the view renders as a chart. A `type: 'chart'` view must bind one: it names the ADR-0021 `dataset` and the measures (`values`) the chart plots, and there is no default binding | | **map** | `{ latitudeField?: string; longitudeField?: string; locationField?: string; titleField?: string; … }` | optional | Map configuration — applies when the view renders as a map layout | | **tree** | `{ parentField?: string; labelField?: string; fields?: string[]; defaultExpandedDepth?: integer }` | optional | Tree/hierarchy configuration — applies when the view renders as a tree layout | | **pageName** | `never` | optional | [REMOVED] `view.pageName` was removed in @objectstack/spec 17.5.0 (ADR-0049 enforce-or-remove) — it named the page a `type: 'page'` view was to mount, and that mount was never built: no renderer read the key, so the named page was never reached and the view drew an empty grid. Delete the key; to put a published page in front of users, give the app a navigation item — `{ type: 'page', pageName: '' }` under the app's `navigation` — which is a different key on a different surface and is the page mount that has always rendered. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; `--write` applies the ones it can prove, and you apply the rest by hand. | @@ -2086,7 +2086,7 @@ This schema accepts one of the following structures: | **gantt** | `{ startDateField: string; endDateField: string; titleField: string; progressField?: string; … }` | optional | Gantt-timeline configuration — applies when the view renders as a gantt layout | | **gallery** | `{ coverField?: string; coverFit?: Enum<'cover' \| 'contain'>; cardSize?: Enum<'small' \| 'medium' \| 'large'>; titleField?: string; … }` | optional | Gallery/card view configuration | | **timeline** | `{ startDateField: string; endDateField?: string; titleField: string; groupByField?: string; … }` | optional | Timeline view configuration | -| **chart** | `{ chartType?: Enum<'bar' \| 'line' \| 'pie' \| 'area' \| 'scatter'>; dataset: string; dimensions?: string[]; values: string[] }` | optional | List chart view configuration | +| **chart** | `{ chartType?: Enum<'bar' \| 'line' \| 'pie' \| 'area' \| 'scatter'>; dataset: string; dimensions?: string[]; values: string[] }` | optional | Chart binding — applies when the view renders as a chart. A `type: 'chart'` view must bind one: it names the ADR-0021 `dataset` and the measures (`values`) the chart plots, and there is no default binding | | **map** | `{ latitudeField?: string; longitudeField?: string; locationField?: string; titleField?: string; … }` | optional | Map configuration — applies when the view renders as a map layout | | **tree** | `{ parentField?: string; labelField?: string; fields?: string[]; defaultExpandedDepth?: integer }` | optional | Tree/hierarchy configuration — applies when the view renders as a tree layout | | **pageName** | `never` | optional | [REMOVED] `view.pageName` was removed in @objectstack/spec 17.5.0 (ADR-0049 enforce-or-remove) — it named the page a `type: 'page'` view was to mount, and that mount was never built: no renderer read the key, so the named page was never reached and the view drew an empty grid. Delete the key; to put a published page in front of users, give the app a navigation item — `{ type: 'page', pageName: '' }` under the app's `navigation` — which is a different key on a different surface and is the page mount that has always rendered. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; `--write` applies the ones it can prove, and you apply the rest by hand. | @@ -2264,7 +2264,7 @@ This schema accepts one of the following structures: | **gantt** | `{ startDateField: string; endDateField: string; titleField: string; progressField?: string; … }` | optional | Gantt-timeline configuration — applies when the view renders as a gantt layout | | **gallery** | `{ coverField?: string; coverFit?: Enum<'cover' \| 'contain'>; cardSize?: Enum<'small' \| 'medium' \| 'large'>; titleField?: string; … }` | optional | Gallery/card view configuration | | **timeline** | `{ startDateField: string; endDateField?: string; titleField: string; groupByField?: string; … }` | optional | Timeline view configuration | -| **chart** | `{ chartType?: Enum<'bar' \| 'line' \| 'pie' \| 'area' \| 'scatter'>; dataset: string; dimensions?: string[]; values: string[] }` | optional | List chart view configuration | +| **chart** | `{ chartType?: Enum<'bar' \| 'line' \| 'pie' \| 'area' \| 'scatter'>; dataset: string; dimensions?: string[]; values: string[] }` | optional | Chart binding — applies when the view renders as a chart. A `type: 'chart'` view must bind one: it names the ADR-0021 `dataset` and the measures (`values`) the chart plots, and there is no default binding | | **map** | `{ latitudeField?: string; longitudeField?: string; locationField?: string; titleField?: string; … }` | optional | Map configuration — applies when the view renders as a map layout | | **tree** | `{ parentField?: string; labelField?: string; fields?: string[]; defaultExpandedDepth?: integer }` | optional | Tree/hierarchy configuration — applies when the view renders as a tree layout | | **pageName** | `never` | optional | [REMOVED] `view.pageName` was removed in @objectstack/spec 17.5.0 (ADR-0049 enforce-or-remove) — it named the page a `type: 'page'` view was to mount, and that mount was never built: no renderer read the key, so the named page was never reached and the view drew an empty grid. Delete the key; to put a published page in front of users, give the app a navigation item — `{ type: 'page', pageName: '' }` under the app's `navigation` — which is a different key on a different surface and is the page mount that has always rendered. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; `--write` applies the ones it can prove, and you apply the rest by hand. |