diff --git a/.changeset/console-0df67f237c5a.md b/.changeset/console-0df67f237c5a.md new file mode 100644 index 00000000000..56913631adc --- /dev/null +++ b/.changeset/console-0df67f237c5a.md @@ -0,0 +1,72 @@ +--- +"@objectstack/console": minor +--- + +Console (objectui) refreshed to `0df67f237c5a`. Frontend changes in this range: + +Derived from the changesets objectui declared over the range — 28 releasing of 29 changesets added across 21 non-merge commits; omitted: 1 release-nothing changeset, 1 commit carrying no changeset (they ship no package code). + +- **minor** — The Setup catalog for positions and permission sets reads the registry. It is built from the metadata-admin list and editors in their environment scope, not from new pages (object… (objectui `0df67f237`) +- **minor** — A bulk action's field-backed param now renders its real control on the selection bar, and the confirm step names the picked record (objectui#12105). (objectui `29b994902`) +- **minor** — A create form says when the server will fill a field: "Set automatically when saved." under a field whose `defaultValue` the server resolves at insert, while the field is empty (o… (objectui `b7cd5c891`) +- **minor** — A calendar view in a list draws every record of the days it shows, not the first 100 records of the object (objectui#12081 item 2). (objectui `16c8810ac`) +- **minor** — In-place edit on the record page and a list's in-cell edit honour the caller's field write grant, and the owner field honours the transfer grant (objectui#12103). (objectui `5f75cfad1`) +- **minor** — List views read an absent `userActions.editInline` as on, the v18 protocol default (objectui#12086, the consumer half of objectstack#22605). A list view is editable in place by de… (objectui `5330afd1f`) +- **minor** — Five write affordances that read no grant at all now read the affordance-to-grant map, so a caller without the grant is no longer offered a write the server then refuses (objectui… (objectui `5af42dbbd`) +- **minor** — After a marketplace install into the environment the console is rendering, the package page waits until that environment serves the installed package's app, and only then refreshe… (objectui `3c0f8069e`) +- **minor** — `element:repeater` and `element:number` publish the node-level `dataSource` binding as their only query input (objectui#12085). `@objectstack/spec` retires the element layer's fla… (objectui `ce991bd70`) +- **minor** — A create form asks its fields the create question, so a role that may create records but not edit them can fill and submit the form (objectui#12082). Every console affordance that… (objectui `023f00d46`) +- **minor** — **BREAKING** — The row type of the `VersionHistory` timeline is declared as `VersionHistoryEntry` instead of `VersionEntry` (objectui#6349, batch 10). `@object-ui/collaboration` publishes an unr… (objectui `12ff25631`) +- **minor** — The props of this package's `ThemeProvider` are declared and exported as `ThemePreferenceProviderProps` instead of `ThemeProviderProps` (objectui#6349, batch 10). `@object-ui/reac… (objectui `12ff25631`) +- **minor** — `ConnectionState` is a new export: the lifecycle state of one client connection, `'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'error'` (objectui#6349, batch 10)… (objectui `12ff25631`) +- **minor** — The props of this package's minimal `AppShell` container are declared and exported as `MinimalAppShellProps` instead of `AppShellProps` (objectui#6349, batch 9). `@object-ui/layou… (objectui `1b2d0160f`) +- **minor** — The props of this package's view switcher are declared and exported as `ListViewSwitcherProps` instead of `ViewSwitcherProps` (objectui#6349, batch 8). `@object-ui/plugin-view` pu… (objectui `d758f2f20`) +- **patch** — **The console no longer offers an object to a caller who cannot read it** (objectui#12109). A navigation entry bound to an object (`type: 'object'`, by its `objectName`) is not dr… (objectui `5a65f7d57`) +- **patch** — An object timeline with a `groupByField` draws one group per value, headed by the value's display name (objectui#12104). (objectui `206505c34`) +- **patch** — An org install from the Marketplace catalog's "Your organization" strip, on a cloud-managed environment, now waits until the environment serves the installed package's app before… (objectui `a21ff9a95`) +- **patch** — The console asks for recent activity only when the signed-in user may read it, and a failed read no longer shows as "No recent activity" (objectui#12081, item 8). (objectui `029bdaf45`) +- **patch** — An app that serves the signed-in user no navigation now opens on an app-level empty state, not on the Studio home (objectui#12079). (objectui `417e24567`) +- **patch** — The record chatter stores each reaction as the member's own `sys_comment_reaction` record, and stops writing the whole `sys_comment.reactions` column (objectui#12078; ruling A, am… (objectui `de302c731`) +- **patch** — fix(console): a long flow screen or action parameter list keeps its Submit / Confirm on screen (objectui#12080) (objectui `4d0ff2331`) +- **patch** — `ConnectionState` is re-exported from `@object-ui/types` instead of being declared a second time here (objectui#6349, batch 10). `@object-ui/data-objectstack` declared the same fi… (objectui `12ff25631`) +- **patch** — `ConnectionState` is re-exported from `@object-ui/types` instead of being declared a second time here (objectui#6349, batch 10). `@object-ui/collaboration` declared the same five… (objectui `12ff25631`) +- **patch** — Doc comments only. `UserDataAdapter` now carries the contract notes `@object-ui/app-shell` kept on its own copy of the interface: implementations must be safe to call concurrently… (objectui `1b2d0160f`) +- **patch** — The props of the console's page header are declared as `ConsolePageHeaderProps` instead of `PageHeaderComponentProps` (objectui#6349, batch 8). `@object-ui/layout` publishes `Page… (objectui `d758f2f20`) +- **patch** — Doc comment only. The `PageHeaderComponentProps` comment no longer says `@object-ui/app-shell` shares the name: the console's header props are now `ConsolePageHeaderProps`, so thi… (objectui `d758f2f20`) +- **patch** — The props of the dashboard's read-only record drill drawer are declared as `DashboardRecordDetailDrawerProps` instead of `RecordDetailDrawerProps` (objectui#6349, batch 8). `@obje… (objectui `d758f2f20`) + +⚠️ 1 of these carries a breaking change: 1 by the author's own breaking annotation in the changeset body — objectui declares no `major` inside a launch window (`scripts/check-changeset-no-major.mjs`). Each is marked **BREAKING** in the list above — read them before compiling the release record. + +**In this console build, declared nowhere** — objectui merged 1 commit in this range with no `.changeset/*.md`. The code is inside the pin above and ships here, but nothing upstream declared it, so it appears in no objectui CHANGELOG and in no entry above. Listed by subject rather than counted, because a count cannot tell a dependency bump from a form-behaviour change (objectstack#6174); the upstream gate that would prevent this is objectui#3387. + +- _(no changeset)_ fix(scripts): an injected tree hashes apart from an installed one, so a local Spec Main Shape Gate reproduction cannot leave verdicts a sibling worktree replays (objectui#12114) (… (objectui `a194b4e37`) + +Clause-②: yes (widening: the html-page save gate and `os validate` read the SDUI manifest this console ships, and at this pin `element:repeater` and `element:number` publish the node-level `dataSource` binding as their only query input. A page source with `` and no flat `object` was refused with `missing-required-prop` against the previous manifest and passes against this one; a flat `object` / `filter` / `sort` / `limit` still passes, now with a non-gating `unknown-prop` warning.) + + + +objectui range: `20c6d351ad74...0df67f237c5a` diff --git a/.changeset/objectui-pin-citations-0df67f237c5a.md b/.changeset/objectui-pin-citations-0df67f237c5a.md new file mode 100644 index 00000000000..4254fd130fd --- /dev/null +++ b/.changeset/objectui-pin-citations-0df67f237c5a.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 `0df67f237c5a`. + +Clause-②: no + +Every anchor was mapped through the objectui diff `20c6d351ad74..0df67f237c5a`: 293 paths over 21 commits, none deleted and one renamed (`resolveActionParams.ts`, which no record cites). Seventeen files a record cites changed on the hop, plus the `en` / `zh` / `de` packs (whose `calendar.configRequired` strings did not change): `ObjectGrid.tsx`, `ListView.tsx`, `ObjectCalendar.tsx`, `plugin-calendar/src/index.tsx`, `ObjectTimeline.tsx` and plugin-timeline's `renderer.tsx`, `ObjectKanban.tsx`, `KanbanBoardCore.tsx`, `KanbanImpl.tsx`, `plugin-kanban.mdx`, `MePermissionsProvider.tsx`, `PermissionProvider.tsx`, `record-details.tsx`, `basic/data-list.tsx`, `data-objectstack/src/index.ts`, `form.tsx` and plugin-view's `ObjectView.tsx`. Every cited line in them moved or held with its text byte-identical, 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: + +- `basic/data-list.tsx`: the `element:repeater` registration no longer publishes the flat `object` / `filter` / `sort` / `limit` inputs; the node-level `dataSource` binding is its one published query input (objectui#12085). The renderer still reads the four as the binding's fallback. The row's two sentences that named the published inputs are rewritten where they stand. +- `ObjectGrid.tsx`: the `delete` verdict the implicit bulk-delete is gated on now comes from the affordance-to-grant map's `rowDelete` row (objectui#12082). It still asks the managed-object policy and the object's effective API operations, now with the caller's delete grant beside them, so the `sys_api_key` reading holds. The `inlineEditable` verdict reads the same map's `listInlineEdit` row. +- `ListView.tsx`: the calendar arm gained objectui#12081's fetch window. Its date-field reads are byte-identical and still declared-only, with no floor. + +The re-read also corrects two anchors the previous hop left on the `object-tree` flat-config record: its opening still named the `case 'tree'` arm at its `47b1f0bb7` span, and its hop cited the `labelField` line one line low. + +The six migration entries' corpus counts were re-taken with `git grep -o -F`, the method that reproduces every `20c6d351ad74` number. The corpus is now 8424 tracked files. Every token an entry counts as zero still reads zero (98 tokens). The controls moved with the corpus, for example `objectstack` from 18047 to 18248 and `timeout` from 1694 to 1705. + +No key, default, enum member or export moves. diff --git a/.objectui-sha b/.objectui-sha index b286d5e927a..8341ee8b200 100644 --- a/.objectui-sha +++ b/.objectui-sha @@ -1 +1 @@ -20c6d351ad74d2b14a93becdc134d51b91b2d2e6 +0df67f237c5ab46cbc65252c5f6bd05f2be44c48 diff --git a/content/docs/references/ui/view.mdx b/content/docs/references/ui/view.mdx index 1511dacde97..8fd7765ea6c 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` = `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. | +| **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` = `0df67f237c5a`), 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` = `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. | +| **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` = `0df67f237c5a`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. | | **widget** | `string` | optional | Custom widget/component name (overrides type-based inference) | | **language** | `string` | optional | Code editor language (for type=code) | | **keyField** | `{ field?: string; label?: string \| Record; placeholder?: string \| Record; helpText?: string \| Record; … }` | optional | Key column config for record-typed fields | diff --git a/packages/sdui-parser/objectui-lockstep.json b/packages/sdui-parser/objectui-lockstep.json index 0c0f3053093..d5b9b0c7bae 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": "20c6d351ad74d2b14a93becdc134d51b91b2d2e6", - "revDate": "2026-10-09T22:57:23+00:00", + "rev": "0df67f237c5ab46cbc65252c5f6bd05f2be44c48", + "revDate": "2026-10-11T07:26:10+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": "20c6d351ad74d2b14a93becdc134d51b91b2d2e6", + "recordedAgainstPin": "0df67f237c5ab46cbc65252c5f6bd05f2be44c48", "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 f647e28d45c..d4ce1410d85 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,24 @@ 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` = `20c6d351a`, re-read there 2026-10-10: + // (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + // in `packages/plugin-grid`, on the hop off `20c6d351a`, `ObjectGrid.tsx` + // changed again (82 insertions, 32 deletions: objectui#12082's + // affordance-to-grant map, objectui#12103's per-column write grant and + // objectui#12105's promoted bulk-action params), none of it inside the + // selection block, which only MOVED by +29: `ObjectGrid.tsx:4897-4924` here + // (`4868-4895` at `20c6d351a`), still hashing to + // `c88443302d40c2db739ddb235470bafa29056e2e` (hash-object of the block), + // re-READ with the same reading below. Two hunks touch that reading and were + // re-READ as well: the `delete` verdict the implicit bulk-delete is gated on + // now comes from `resolveAffordance('rowDelete', …)` (`:1786`), which still + // asks the managed-object policy and the object's effective API operations, + // with the caller's delete grant beside them; and a promoted def's params + // now resolve when its dialog opens (`:5097-5116`, called at `:5132`), its + // rows still fanned out through `useBulkExecutor`. `hooks/useBulkExecutor.ts` + // is byte-identical to `20c6d351a` and its `:298-303` still hashes to + // `01083348330f10a201cdf1078b4c21c236402b6a`. At `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 diff --git a/packages/spec/src/kernel/functional-completeness.ts b/packages/spec/src/kernel/functional-completeness.ts index af3dd4aec1c..fac7035d786 100644 --- a/packages/spec/src/kernel/functional-completeness.ts +++ b/packages/spec/src/kernel/functional-completeness.ts @@ -298,7 +298,21 @@ 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` = `20c6d351a`, re-read there 2026-10-10: + * (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * on the hop off `20c6d351a` `ObjectCalendar.tsx` changed (+75/-19: + * objectui#12081 item 2's windowed fetch and objectui#12082's write + * affordances), no hunk inside a cited read, so `getCalendarConfig` moved + * `:294` -> `:311` and the `if (!calendarConfig)` arm `:1296` -> `:1354` with + * its `tt(…)` lines `:1303-1304` -> `:1361-1362`, each byte-identical; + * `ListView.tsx` changed (+229/-57: objectui#12081 item 2, objectui#12086 and + * objectui#12082), its `case 'calendar'` with it, moved `3665` -> `3813`: + * objectui#12081 (objectui `16c8810ac`) added a comment and hands the calendar + * an `onVisibleRangeChange` callback when the view windows its fetch, while + * the `startDateField` / `endDateField` / `titleField` reads this row rests on + * are byte-identical and still conditional, with no floor (the fetch window's + * own copies at `:2495-2498` read the declared bindings only); and the `en` / + * `zh` / `de` packs changed (three commits) but not their + * `calendar.configRequired` strings. At `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` @@ -404,7 +418,12 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] { * This repo already records the same deletion one door over: the #13817 * check in `../ui/view.zod.ts` names objectui#7029 as its runtime half. * - `gantt` → NO fallback, and no silence [#19630]. Measured at the pin - * this repo builds against (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * this repo builds against (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * on the hop off `20c6d351a` `ObjectGantt.tsx` is byte-identical (`git diff + * --quiet`), so `getGanttConfig` `:610` and the `if (!ganttConfig)` arm `:2307` + * did not move, and `ListView.tsx` changed (+229/-57, as above) with its + * `case 'gantt'` byte-identical, moved `3804` -> `3959`. At `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 @@ -491,7 +510,15 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] { * requires. So the view does not draw a blank chart: it refuses, by name. * - `timeline` → date axis: NO fallback [#19630]; title: `titleField || 'name'`, * which still stands. Measured at the same pin (`.objectui-sha` = - * `20c6d351a`, re-read there 2026-10-10: + * `0df67f237`, re-read there 2026-10-11: + * on the hop off `20c6d351a` `ObjectTimeline.tsx` changed (+42/-20, + * objectui#12104, objectui `206505c34`: an explicit `groupByField` groups by + * its display value), every hunk below `:730`, so its start-date chain + * `:589-591` is byte-identical and unmoved and its `if (!hasAuthoredItems && + * !startDateField)` refusal arm is byte-identical, moved `:952` -> `:974`; and + * `ListView.tsx` changed (+229/-57) with its `case 'timeline'` byte-identical, + * moved `3747` -> `3902`, and `resolveTimelineDateBinding` byte-identical, + * moved `686` -> `695`. At `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 @@ -576,7 +603,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` = `20c6d351a`, re-read there 2026-10-10: + * pin (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * on the hop off `20c6d351a` `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 (+229/-57) with + * its `case 'map'` byte-identical, moved `3924` -> `4079`, and + * `resolveListMapConfig` byte-identical, moved `:200` -> `:209` under nine new + * import lines. At `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) 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 31fccef2471..7210dfb14ee 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` = `20c6d351ad74d2b14a93becdc134d51b91b2d2e6` — names ' + + 'against, `.objectui-sha` = `0df67f237c5ab46cbc65252c5f6bd05f2be44c48` — 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 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 ' + + 'the string debounceDelay each occur 0 times across its 8424 tracked files (0 across the 8351 at 20c6d351a, 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, to 17980 and 7523 at 47b1f0bb7 and to 18047 and 7545 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, to 18047 and 7545 at 20c6d351a and to 18248 and 7582 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 52df7cc5add..19ac1e2b8e0 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` = `20c6d351ad74d2b14a93becdc134d51b91b2d2e6`, re-read from this tree — ' + + '`.objectui-sha` = `0df67f237c5ab46cbc65252c5f6bd05f2be44c48`, re-read from this tree — ' + 'spells resourceLimits.timeout 0 times across ' - + '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 ' + + '8424 tracked files, against lit controls timeout 1705, RuntimeConfig 347 and resourceLimits ' + + '2 on the same corpus (0 across 8351, and 1694 / 337 / 2, at 20c6d351a; 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 2303c1e67da..81f0d711245 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` = `20c6d351ad74d2b14a93becdc134d51b91b2d2e6` — spells ' + + 'objectui checkout — `.objectui-sha` = `0df67f237c5ab46cbc65252c5f6bd05f2be44c48` — spells ' + '`flushInterval` 0 times, `initialDelay` 0, `HttpDestinationConfig` 0 and `LoggingConfig` 0 ' - + '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, ' + + 'across its 8424 tracked files, against lit controls `useState` 2645 and `timeout` 1705 on ' + + 'the same corpus (all four 0 across 8351, against 2630 and 1694, at 20c6d351a, 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 5c0f27b634c..43c66424172 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` = `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 / ' + + '`.objectui-sha` = `0df67f237c5ab46cbc65252c5f6bd05f2be44c48`, re-read from this tree — ' + + 'spells all six metrics def names and both distinctive keys 0 times across 8424 tracked ' + + 'files at that sha, against lit controls window 4596, timeout 1705, period 251, ' + + 'interval 233 and metrics 456 on that same corpus and sha (0 across 8351, against 4470 / ' + + '1694 / 249 / 213 / 456, at 20c6d351a, 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 / ' 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 941b202bbbc..19891d0d191 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` = `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 ' + + 'pinned objectui checkout — `.objectui-sha` = `0df67f237c5ab46cbc65252c5f6bd05f2be44c48` — names none of it: all 37 exports of ' + + 'tracing.zod.ts and each of the four key names occur 0 times across the 8424 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: 18047 hits for the bare token objectstack, ' - + 'and 7545 for the package specifier @objectstack/spec (at 47b1f0bb7: 0 across 8281, Span 517, ' + + 'two lit controls on that same corpus and sha: 18248 hits for the bare token objectstack, ' + + 'and 7582 for the package specifier @objectstack/spec (at 20c6d351a: 0 across 8351, Span 517, ' + + '18047 and 7545; 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, ' 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 73228804c04..b85eb98b1c0 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` = `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 ' + + 'objectui checkout — `.objectui-sha` = `0df67f237c5ab46cbc65252c5f6bd05f2be44c48` — spells it 0 ' + + 'times across 8424 tracked files, against lit controls `TTL` 184 and `tenant` 1357 on the ' + + 'same corpus (0 across 8351, against 184 and 1340, at 20c6d351a; 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 495e7a4acce..30da4bd021e 100644 --- a/packages/spec/src/ui/action-outcome-messages.test.ts +++ b/packages/spec/src/ui/action-outcome-messages.test.ts @@ -12,6 +12,9 @@ * runner default) and the `${result.*}` INTERPOLATION are the console's — the * reader is objectstack-ai/objectui#11344, a later link of the same ruling, * carried from the pin this repo builds against (`.objectui-sha` = + * `0df67f237`, re-read there 2026-10-11: + * every objectui file this record cites is byte-identical across the hop from + * `20c6d351a` (`git diff --quiet`), so every anchor held unmoved. At * `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` diff --git a/packages/spec/src/ui/action.zod.ts b/packages/spec/src/ui/action.zod.ts index 1de368e1f22..b2676a757ed 100644 --- a/packages/spec/src/ui/action.zod.ts +++ b/packages/spec/src/ui/action.zod.ts @@ -1364,6 +1364,9 @@ const actionObject = () => strictObject({ * * Liveness: the ledger row was `planned` until the console reader landed, * and it is `live` from the pin this repo builds against (`.objectui-sha` = + * `0df67f237`, re-read there 2026-10-11: + * every objectui file this record cites is byte-identical across the hop from + * `20c6d351a` (`git diff --quiet`), so every anchor held unmoved. At * `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 diff --git a/packages/spec/src/ui/component.test.ts b/packages/spec/src/ui/component.test.ts index 974f8de9f29..b66c78759e6 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` = `20c6d351a`, re-read there 2026-10-10: +// builds against — `.objectui-sha` = `0df67f237`, re-read there 2026-10-11: +// every objectui file this record cites is byte-identical across the hop from +// `20c6d351a` (`git diff --quiet`), so every anchor held unmoved. At +// `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: @@ -451,7 +454,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` = `20c6d351a`, re-read there 2026-10-10: +// the pin this repo builds against — `.objectui-sha` = `0df67f237`, re-read there 2026-10-11: +// every objectui file this record cites is byte-identical across the hop from +// `20c6d351a` (`git diff --quiet`), so every anchor held unmoved. At +// `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: @@ -3487,7 +3493,18 @@ 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` = `20c6d351a`, re-read there 2026-10-10: +// against (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: +// `plugin-kanban/src/index.tsx`, `plugin-kanban/src/types.ts` and +// `objectql.ts` are byte-identical across the hop from `20c6d351a` (`git diff +// --quiet`), so the mapping `488-492` and the member `4838` did not move; +// `ObjectKanban.tsx` changed (+21/-1, objectui#12082, objectui `5af42dbbd`: +// the card move reads the affordance-to-grant map), two import lines above +// `:98` and every other hunk below the fetch, so the default MOVED `:98` -> +// `:100` and the `$top` read `:762` -> `:764`, both byte-identical; and +// `plugin-kanban.mdx` changed in its drag-and-drop feature bullet only +// (+5/-1, the same commit), above the `limit` row and the `limit: 250` +// snippet, neither of which changed. At `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, @@ -3687,7 +3704,16 @@ 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` = `20c6d351a`, re-read there 2026-10-10: +// against (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: +// all three files changed across the hop from `20c6d351a` for one commit, +// objectui#12082 (objectui `5af42dbbd`: a card is draggable only for a caller +// the `kanbanCardMove` row of the affordance-to-grant map allows), no hunk on +// a cited line, so every anchor MOVED with its line byte-identical: +// `KanbanBoardCore.tsx` (+9/-0) `:78` -> `:85` and `:111-112` -> `:120-121`, +// `ObjectKanban.tsx` (+21/-1) the spread `:1731` -> `:1751`, and +// `KanbanImpl.tsx` (+30/-7) the gate `:671` / `:684` -> `:688` / `:701`, still +// reading `quickAdd && onQuickAdd`; and the counts re-read the same, 2 / 2 / +// 11. At `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; @@ -3878,7 +3904,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` = `20c6d351a`, re-read there 2026-10-10: +// `.objectui-sha` = `0df67f237`, re-read there 2026-10-11: +// every objectui file this record cites is byte-identical across the hop from +// `20c6d351a` (`git diff --quiet`), so every anchor held unmoved. At +// `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: @@ -4058,7 +4087,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` = `20c6d351a`, re-read there 2026-10-10: +// (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: +// every objectui file this record cites is byte-identical across the hop from +// `20c6d351a` (`git diff --quiet`), so every anchor held unmoved. At +// `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: diff --git a/packages/spec/src/ui/component.zod.ts b/packages/spec/src/ui/component.zod.ts index 911294d48c1..2b2da0d90ab 100644 --- a/packages/spec/src/ui/component.zod.ts +++ b/packages/spec/src/ui/component.zod.ts @@ -840,7 +840,10 @@ export const PageTabsProps = strictObject({ * false candidate a component over). * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * every objectui file this record cites is byte-identical across the hop from + * `20c6d351a` (`git diff --quiet`), so every anchor held unmoved. At + * `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: @@ -1077,7 +1080,19 @@ export const PageCardProps = strictObject({ * declarations identical. * * Each clause is read off the objectui pin this repo builds against - * (`.objectui-sha` = `20c6d351ad74`, re-read there 2026-10-10: + * (`.objectui-sha` = `0df67f237c5a`, re-read there 2026-10-11: + * across the hop from `20c6d351ad74` `record-highlights.tsx`, + * `record-related-list.tsx`, `record-quick-actions.tsx` and `usePermissions.ts` + * are byte-identical (`git diff --quiet`), so NO anchor in those four moved; + * `record-details.tsx` (+13/-7) and `PermissionProvider.tsx` (+6/-1) changed + * for objectui#12082 (objectui `023f00d46`: the record body's in-place edit + * reads the affordance-to-grant map) in a same-length import edit and below + * every cited line, so NO anchor in those two moved either; and + * `MePermissionsProvider.tsx` (+36/-5, objectui#12082 and objectui#12103's + * owner-field transfer grant) changed above `hasCapabilities` without touching + * it, so its anchors MOVED by 31 with their cited text byte-identical — `414` + * -> `445`, `416` -> `447` — and each is cited below at this pin. At + * `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: @@ -1167,7 +1182,7 @@ export const PageCardProps = strictObject({ * (`record-details.tsx:336`, `record-highlights.tsx:81`, * `record-related-list.tsx:415`, `record-quick-actions.tsx:271`). `read` * is looked up in the capability set like any other name. - * 2. ALL OF THEM. `MePermissionsProvider.tsx:416` is + * 2. ALL OF THEM. `MePermissionsProvider.tsx:447` is * `required.every((p) => held.has(p))`. * 3. THE OUTCOME. Each block returns a `role="status"` "Insufficient * permissions to view …" notice instead of its content — @@ -1185,10 +1200,10 @@ export const PageCardProps = strictObject({ * de-duplicates those fields out of its body. To keep a value from a * user, gate the object, the field or the action. * 5. UNRESOLVED CAPABILITIES FAIL OPEN. `hasCapabilities` answers `true` when - * `systemPermissions` was never reported (`MePermissionsProvider.tsx:414`), + * `systemPermissions` was never reported (`MePermissionsProvider.tsx:445`), * under the role-based provider (`PermissionProvider.tsx:77`) and with no * provider mounted (`usePermissions.ts:45`); a REPORTED empty array reaches - * the `every` at `:416` and gates. + * the `every` at `:447` and gates. * * Unlike the field's own `requiredPermissions` (ADR-0066 D3, enforced by the * server before the payload leaves it), this key authorises @@ -2456,7 +2471,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` = `20c6d351a`, re-read there 2026-10-10: + * (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * every objectui file this record cites is byte-identical across the hop from + * `20c6d351a` (`git diff --quiet`), so every anchor held unmoved. At + * `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: @@ -2884,7 +2902,10 @@ export const ElementButtonPropsSchema = lazySchema(() => strictObject({ * the button. * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * every objectui file this record cites is byte-identical across the hop from + * `20c6d351a` (`git diff --quiet`), so every anchor held unmoved. At + * `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: @@ -3353,7 +3374,27 @@ 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` = `20c6d351a`, re-read there 2026-10-10: + * against, `.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * `public-blocks.ts`, `auto-trigger.ts`, `static-params.ts`, `ui/button.tsx`, + * the four `action-*.tsx` renderers and `previews/block-config.ts` are + * byte-identical across the hop from `20c6d351a` (`git diff --quiet`), so + * their anchors held unmoved; `data-objectstack/src/index.ts` changed in one + * import line and two lines of `createQuietHttpLogger` (+5/-2, objectui#6349 + * batch 10, objectui `12ff25631`: `ConnectionState` declared once, in + * `@object-ui/types`), which MOVED `serializeOrderBy` `868-894` -> `869-895` + * and the `translateFilterArray` arm `5048-5059` -> `5051-5062`, both + * byte-identical; and `basic/data-list.tsx` changed for objectui#12085 + * (objectui `ce991bd70`, +17/-26): every `element:definition-list` anchor and + * the repeater's `readProps` span held unmoved, one comment line added in the + * repeater's binding note MOVED every repeater read point from `:172` on by 1 + * with its text byte-identical, and the repeater's registration no longer + * publishes the flat `object` / `filter` / `sort` / `limit` inputs — the + * binding is its one published query input — so the row's two sentences that + * named those published inputs (the required `object` input at `:320-326`, and + * the binding published "beside these keys") are false at this pin and are + * rewritten where they stand; the renderer still READS the four as the + * binding's fallback, byte-identical. Each moved anchor is cited below at this + * pin. At `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 @@ -3900,7 +3941,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` = - * `20c6d351a`, 2026-10-10: `action-group.tsx`, `action-menu.tsx` and + * `0df67f237`, 2026-10-11: `action-group.tsx`, `action-menu.tsx` and + * `static-params.ts` are byte-identical across the hop from `20c6d351a` (`git + * diff --quiet`), so both held unmoved; at `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 @@ -4294,19 +4338,21 @@ 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` = `20c6d351a`, re-read there 2026-10-10: + * pin this repo builds against (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * `ObjectGrid.tsx` changed across the hop from `20c6d351a` (+82/-32: + * objectui#12082, objectui#12103 and objectui#12105) and `data-table.tsx` is + * byte-identical (`git diff --quiet`); the read MOVED `5520` -> `5570` with its + * line byte-identical, and the same method still finds 15 hit lines against 3 + * for the control. At `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`, @@ -4620,7 +4672,7 @@ const GridOperationsSchema = lazySchema(() => strictObject({ * `ab1879721`): the BUILD landed — objectui `154075ab1` (objectui#11068), inside * `89cad75d5570..ab1879721595` — and the grid reads the key. The same method * finds 0 hit lines at `89cad75d5570` and 15 at `ab1879721595`, at `2e818d0b51ec` and at this pin, against 3 for the - * control `schema.editable` in `ObjectGrid.tsx` at each: `ObjectGrid.tsx:5520` + * control `schema.editable` in `ObjectGrid.tsx` at each: `ObjectGrid.tsx:5570` * hands `schema.keyboardNavigation ?? inlineEditable` to the `data-table` it * renders, and `components/src/renderers/complex/data-table.tsx` acts on it. * So the marker is gone, as the member's record prescribed; see the member. @@ -4699,7 +4751,12 @@ 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` - * = `20c6d351a`, re-read there 2026-10-10: + * = `0df67f237`, re-read there 2026-10-11: + * `ObjectGrid.tsx` changed across the hop from `20c6d351a` (+82/-32: + * objectui#12082, objectui#12103 and objectui#12105), every hunk above both + * reads (the last at `:5609`), so both MOVED by 50 with their lines + * byte-identical: `6537-6538` -> `6587-6588`, `6554-6555` -> `6604-6605`. At + * `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: @@ -4728,7 +4785,7 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({ * `6158e4c93`) resolves both members against the display locale before they * reach `DataEmptyState` — * `resolveInlineI18nLabel(authoredEmptyState?.title, displayLocale)` and the - * same for `message` (`ObjectGrid.tsx:6537-6538`, drawn at `:6554-6555`) — so + * same for `message` (`ObjectGrid.tsx:6587-6588`, drawn at `:6604-6605`) — so * both `I18nLabel` forms draw, and a locale map with no usable entry keeps * that member's default. At `89cad75d5570` the two still reached * `DataEmptyState` raw. @@ -5092,7 +5149,18 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({ * `ComponentPropsMap` key. This record said to drop the marker in the change * that lands the BUILD at the pin, and it is dropped here. * - * Read at the pin this repo builds against (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * Read at the pin this repo builds against (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * `ObjectGrid.tsx` changed across the hop from `20c6d351a` (+82/-32: + * objectui#12082, objectui#12103 and objectui#12105) and `data-table.tsx` is + * byte-identical (`git diff --quiet`), so the five `data-table.tsx` anchors + * held unmoved and the two grid anchors MOVED with their lines + * byte-identical — `5520` -> `5570`, `1825` -> `1850`; the one hunk near them + * re-wrote the viewer's write verdict `objectInlineEditable` above `:1850` to + * read the affordance-to-grant map's `listInlineEdit` row (objectui#12082), + * which asks the object's edit policy (the managed-object policy against the + * effective API operations) and the update grant, so `inlineEditable` is + * still the authored `editable` AND the viewer's write verdict. At + * `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: @@ -5128,9 +5196,9 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({ * and `data-table.tsx` were * byte-identical across the hop from `ab1879721`, where they were measured * 2026-10-03; the BUILD is objectui `154075ab1`, objectui#11068): - * `plugin-grid/src/ObjectGrid.tsx:5520` hands the data table + * `plugin-grid/src/ObjectGrid.tsx:5570` hands the data table * `keyboardNavigation: schema.keyboardNavigation ?? inlineEditable`, where - * `inlineEditable` (`:1825`) is the authored `editable` AND the viewer's + * `inlineEditable` (`:1850`) is the authored `editable` AND the viewer's * write verdict — so an absent key follows whether the grid RENDERS * editable, `true` turns the navigation on for a read-only grid, and `false` * turns it off on an editable one. `components/src/renderers/complex/data-table.tsx` @@ -5514,7 +5582,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` = `20c6d351a`, re-read there 2026-10-10: + * (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * every objectui file this record cites is byte-identical across the hop from + * `20c6d351a` (`git diff --quiet`), so every anchor held unmoved. At + * `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: @@ -5768,7 +5839,12 @@ const ObjectKanbanLaneSchema = lazySchema(() => strictObject({ * DESIGNER's spelling with * zero read points (#7973 class) — aliased to the `groupBy` the board reads. * `limit` (#16503) was measured later, at the pin this repo builds against - * (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * `ObjectKanban.tsx` changed across the hop from `20c6d351a`, +21/-1 + * (objectui#12082, objectui `5af42dbbd`: the card move reads the + * affordance-to-grant map), two import lines above the anchor and every other + * hunk below it, so the anchor was re-READ and MOVED `762` -> `764` with its + * text byte-identical. At `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: @@ -5828,7 +5904,7 @@ const ObjectKanbanLaneSchema = lazySchema(() => strictObject({ * having put a refusal in front of it — a contract-refused row cap is dropped * and reported at `:554` instead of being sent. The pinned fact is unchanged: * `schema.limit` still lowers into the query's top-level `$top`): - * `ObjectKanban.tsx:762`, the `$top` of the + * `ObjectKanban.tsx:764`, the `$top` of the * board's one query — its docblock below carries the four-face record. */ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ @@ -5881,7 +5957,19 @@ 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` = `20c6d351a`, re-read there 2026-10-10: + * repo builds against (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * `plugin-kanban/src/types.ts` (still no row-cap member), + * `plugin-kanban/src/index.tsx`, `element-data-source.ts`, + * `ElementDataSourceGate.tsx` and `objectql.ts` are byte-identical across the + * hop from `20c6d351a` (`git diff --quiet`), so `488-492`, `:268-272`, + * `:218-220`, `:437-456` and `4838` did not move; `plugin-kanban.mdx` changed + * in its drag-and-drop feature bullet only (+5/-1), above the `limit` row and + * the `limit: 250` snippet, neither of which changed; and `ObjectKanban.tsx` + * changed (+21/-1, objectui#12082, objectui `5af42dbbd`: the card move reads + * the affordance-to-grant map), so the type import `:10` did not move and the + * default `:98` -> `:100`, the query `755-765` -> `757-767` and the + * `queryFilter` resolution `:624-625` -> `:626-627` MOVED byte-identical. At + * `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, @@ -6051,10 +6139,10 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ * while this map refused the key by name: the board's one query is * `dataSource.find(objectName, { $filter: queryFilter, $orderby: …, $top: * resolveRowLimit(schema.limit, DEFAULT_KANBAN_FETCH_BATCH_SIZE) })` - * (`plugin-kanban/src/ObjectKanban.tsx:755-765`, where `queryFilter` is - * `schema.filter` with its context tokens resolved at `:624-625` — + * (`plugin-kanban/src/ObjectKanban.tsx:757-767`, where `queryFilter` is + * `schema.filter` with its context tokens resolved at `:626-627` — * objectui#10666; at `f8a9d0fb0` the member read `schema.filter` verbatim — - * the default `100` at `:98`, named `DEFAULT_KANBAN_LIMIT` until + * the default `100` at `:100`, named `DEFAULT_KANBAN_LIMIT` until * objectui#9853 — a REAL top-level `$top` since objectui#4025; * before that the cap sat under a `options` key no adapter read, and the * bare `??` became `resolveRowLimit` in objectui#9925, which drops and @@ -6159,7 +6247,17 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ * quick-add control and no block a document can name offers one either). * * Measured at the objectui pin this repo builds against - * (`.objectui-sha` = `20c6d351a`, re-read there 2026-10-10: + * (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * `plugin-kanban/src/index.tsx` is byte-identical across the hop from + * `20c6d351a` (`git diff --quiet`), so `345-346` did not move; + * `KanbanBoardCore.tsx` (+9/-0), `ObjectKanban.tsx` (+21/-1) and + * `KanbanImpl.tsx` (+30/-7) changed for objectui#12082 (objectui `5af42dbbd`: + * a card is draggable only for a caller the affordance-to-grant map's + * `kanbanCardMove` row allows), no hunk on a cited line, so `:78` MOVED to + * `:85` and the gate `:671` / `:684` to `:688` / `:701`, every line + * 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 `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, @@ -6273,7 +6371,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:671` and `:684`), and `onQuickAdd` is a + * BOTH (`KanbanImpl.tsx:688` and `:701`), 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 @@ -6366,7 +6464,15 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ * element schemas). * * Measured at the pin this repo builds against (`.objectui-sha` = - * `20c6d351a`, re-read there 2026-10-10: + * `0df67f237`, re-read there 2026-10-11: + * `useNavigationOverlay.ts` is byte-identical to `20c6d351a` (`git diff + * --quiet`), and `ObjectKanban.tsx` changed above and between the anchors + * here (+21/-1, objectui#12082, objectui `5af42dbbd`: the card move reads the + * affordance-to-grant map) without touching one, so each MOVED with its cited + * text byte-identical: the read `1368` -> `1370`, the hand-off `1376-1377` -> + * `1378-1379`, the overlay render `1626` -> `1642` and its + * `NavigationOverlay` `1642-1655` -> `1658-1671`, and the card click `1755` + * -> `1775`. At `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: @@ -6447,11 +6553,11 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ * re-READ at `87af769e9` 2026-09-22 — every anchor re-derived from that * tree rather than carried, none of them at its `53ded82bf` number and one * of them no longer spelled the way this record quoted it): - * `ObjectKanban.tsx:1368` + * `ObjectKanban.tsx:1370` * reads `schema.navigation ?? { mode: 'drawer' }` and hands it to - * `useNavigationOverlay` (`:1376-1377`), whose result drives the card click - * (`:1755`) and the detail overlay (`:1626`, whose `NavigationOverlay` is - * `:1642-1655`) — on a STANDALONE board, with no enclosing view to resolve + * `useNavigationOverlay` (`:1378-1379`), whose result drives the card click + * (`:1775`) and the detail overlay (`:1642`, whose `NavigationOverlay` is + * `:1658-1671`) — on a STANDALONE board, with no enclosing view to resolve * a mode from. ⚠️ The `(schema as any)` cast this record used to quote is * GONE at this pin: the read is spelled `schema.navigation`, and it now * compiles through a DECLARED `ObjectKanbanSchema.navigation` member @@ -6584,7 +6690,15 @@ 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: + * `0df67f237`, re-read there 2026-10-11: + * `useNavigationOverlay.ts` is byte-identical to `20c6d351a` (`git diff + * --quiet`), and `ObjectCalendar.tsx` changed above and between the anchors + * here (+75/-19: objectui#12081 item 2's windowed fetch and objectui#12082's + * write affordances) without touching one, so each MOVED with its cited text + * byte-identical: the read `1018` -> `1055`, the hand-off `1020-1021` -> + * `1057-1058`, the overlay render `1333` -> `1391` and its + * `NavigationOverlay` `1346-1359` -> `1404-1417`, and the event click `1413` + * -> `1471`. At `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: @@ -6676,10 +6790,10 @@ export const ObjectCalendarPropsSchema = lazySchema(() => strictObject({ * `1218` -> `1237`, its `NavigationOverlay` `1228-1241` -> `1250-1263`. At * `87af769e9` (2026-09-22) none was at its `53ded82bf` number. Through * `e420df310` the cast was still spelled here, unlike its `object-kanban` - * twin; at this pin it is gone on both): `ObjectCalendar.tsx:1018` - * reads `schema.navigation ?? { mode: 'drawer' }`, `:1020-1021` hands - * it to `useNavigationOverlay`, `:1413` fires it on an event click and - * `:1333` renders the overlay (its `NavigationOverlay` is `:1346-1359`) — + * twin; at this pin it is gone on both): `ObjectCalendar.tsx:1055` + * reads `schema.navigation ?? { mode: 'drawer' }`, `:1057-1058` hands + * it to `useNavigationOverlay`, `:1471` fires it on an event click and + * `:1391` renders the overlay (its `NavigationOverlay` is `:1404-1417`) — * standalone, with no enclosing view. */ navigation: NavigationConfigSchema.optional() @@ -7799,7 +7913,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` = `20c6d351a`, re-read there 2026-10-10: + * `.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * every objectui file this record cites is byte-identical across the hop from + * `20c6d351a` (`git diff --quiet`), so every anchor held unmoved. At + * `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: @@ -7994,7 +8111,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` = `20c6d351a`, re-read there 2026-10-10: + * pin this repo builds against (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * every objectui file this record cites is byte-identical across the hop from + * `20c6d351a` (`git diff --quiet`), so every anchor held unmoved. At + * `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: @@ -8068,7 +8188,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` = `20c6d351a`, re-read there 2026-10-10: + * (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * every objectui file this record cites is byte-identical across the hop from + * `20c6d351a` (`git diff --quiet`), so every anchor held unmoved. At + * `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: @@ -8264,7 +8387,13 @@ 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` = `20c6d351a`, re-read there 2026-10-10: + * — `.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * `ObjectGantt.tsx`, `record-source.ts` and `plugin-gantt/src/index.tsx` are + * byte-identical across the hop from `20c6d351a` (`git diff --quiet`), so every + * anchor in them held unmoved; `ListView.tsx` changed (+229/-57), and its + * `case 'gantt'` is byte-identical, moved `3804` -> `3959`, and still writes + * the toolbar Search term onto the node as `search` / `searchableFields`. At + * `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 @@ -8513,10 +8642,23 @@ export type ObjectGanttPropsParsed = z.infer; /** * The flat `TreeConfig` spellings `getTreeConfig` reads ahead of the `tree` * block (`ObjectTree.tsx:289-302`) and that `ObjectView` / `ListView` EMIT when - * they flatten `options.tree` (`ListView.tsx:3913-3932`, `case 'tree'`: the + * they flatten `options.tree` (`ListView.tsx:4120-4144`, `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` = `20c6d351a`, re-read there 2026-10-10: + * pin this repo builds against (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * `ObjectTree.tsx` and `plugin-tree/src/index.tsx` are byte-identical to + * `20c6d351a` (`git diff --quiet`), so `289-302` and `240-261` did not move; + * `ListView.tsx` changed above and below its `case 'tree'` arm (+229/-57: + * objectui#12081 item 2, objectui#12086 and objectui#12082), which MOVED + * byte-identical `3965-3989` -> `4120-4144`, so the flat key set it emits did + * not move: `parentField`, `labelField: treeCfg.labelField || 'name'` + * (`:4140`), `fields` and `defaultExpandedDepth`, and NO `titleField`. This + * re-read also corrects two anchors the hop below left: this paragraph's + * opening still named the arm at `3913-3932`, its `47b1f0bb7` span, and the + * hop below cites the `labelField` line as `:3986`, which at `20c6d351a` is + * the `fields` line under it (`labelField` was `:3985` there, as the + * `titleField` paragraph below says). At `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 @@ -8648,7 +8790,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` = `20c6d351a`, re-read there 2026-10-10: + * — `.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * every objectui file this record cites is byte-identical across the hop from + * `20c6d351a` (`git diff --quiet`), so every anchor held unmoved. At + * `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: @@ -8841,7 +8986,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` = `20c6d351a`, re-read there 2026-10-10: + * builds against (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * re-COUNTED by the same method, 0 for the tree, 3 each for `plugin-gantt` + * and `plugin-grid` and 4 for `plugin-map`, those four shells byte-identical + * across the hop from `20c6d351a` (`git diff --quiet`), and 3 for + * `plugin-calendar`, whose shell changed in its host-callback list only + * (+3/-0, objectui#12081 item 2, objectui `16c8810ac`: `onVisibleRangeChange` + * added to `HOST_CALLBACKS`), its wiring unchanged. At `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`), @@ -9241,7 +9393,18 @@ 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` = `20c6d351a`, re-read there 2026-10-10: + * repo builds against (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * `index.tsx` is byte-identical to `20c6d351a` (`git diff --quiet`), so its + * anchors held unmoved; `ObjectTimeline.tsx` (+42/-20) and `renderer.tsx` + * (+28/-8) changed for objectui#12104 (objectui `206505c34`: an explicit + * `groupByField` groups by the field's display value, one group per key) + * without touching a cited line, so every anchor in them held or MOVED with + * its cited text byte-identical — in `ObjectTimeline.tsx` nothing above + * `:730` moved and everything from `:832` on MOVED by 22 (`:832` -> `:854` + * through `:1033-1034` -> `:1055-1056`), and the three in `renderer.tsx` MOVED + * by 20 (`1569` -> `1589`, `1794-1809` -> `1814-1829`, `1869` -> `1889`) — and + * each is cited below at this pin. The `schema.*` read set of all three is + * unchanged. At `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 @@ -9377,7 +9540,7 @@ function objectTimelineItemsFitVariant() { * 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` + * `:854` the pull-to-refresh gate, `:617` the entry composition and `:867` * the navigation binding), `timeline` (`:326`, * the canonical nested config every field resolution prefers), `filter` * (`:415`, read once through `useResolvedFilter`, which resolves its context @@ -9388,20 +9551,20 @@ function objectTimelineItemsFitVariant() { * `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 `:343`), `items` (`:307`, `:427`, `:602`, - * `:861` — the authored pass-through that short-circuits the object query), + * `:883` — the authored pass-through that short-circuits the object query), * `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` (`:566`, `:591`, `:593`, `:594`), - * `variant` (`:899`) and `navigation` (`:843-846` → `:978` → `:1033-1034`). + * `variant` (`:921`) and `navigation` (`:865-868` → `:1000` → `:1055-1056`). * Four more are read by the presentational renderer off the schema this - * component spreads into it (`effectiveSchema`, `:962-981`): `dateFormat` - * (`plugin-timeline/src/renderer.tsx:1569`, every variant — its number was the + * component spreads into it (`effectiveSchema`, `:984-1003`): `dateFormat` + * (`plugin-timeline/src/renderer.tsx:1589`, every variant — its number was the * same at `53ded82bf` and `87af769e9`, as `plugin-timeline/src/index.tsx:333`'s * also was (`:334` since the hop off `31971ff1e`), which is why the number alone is never the reading) and the gantt - * trio `rowLabel` (`plugin-timeline/src/renderer.tsx:1869`), `minDate` / - * `maxDate` (`plugin-timeline/src/renderer.tsx:1794-1809`). ⚠️ All three name their + * trio `rowLabel` (`plugin-timeline/src/renderer.tsx:1889`), `minDate` / + * `maxDate` (`plugin-timeline/src/renderer.tsx:1814-1829`). ⚠️ All three name their * package because objectui has a second `renderer.tsx` (in `plugin-chatbot`): * a suffix that matches two files names neither, and the gate drops it from * the population rather than guessing. @@ -9412,7 +9575,7 @@ function objectTimelineItemsFitVariant() { * `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 (`:347` here); - * - `className` (`:965`) — a node-level key on `PageComponentSchema`, not a + * - `className` (`:987`) — a node-level key on `PageComponentSchema`, not a * per-block prop; * - `onItemClick` / `onRowClick` — host callbacks JSON cannot carry. * @@ -9434,8 +9597,8 @@ function objectTimelineItemsFitVariant() { * (`plugin-timeline/src/index.tsx:446`, in the one `OBJECT_TIMELINE_INPUTS` * list both registrations spread) and the renderer reads it — but the * OBJECT-BOUND composed path REFUSES it loudly (objectui#6655, - * `ObjectTimeline.tsx:899-901`: - * `:899` gates on `!hasAuthoredItems && schema.variant === 'gantt'` and `:901` + * `ObjectTimeline.tsx:921-923`: + * `:921` gates on `!hasAuthoredItems && schema.variant === 'gantt'` and `:923` * renders `timeline-unsupported-variant`. ⚠️ The `:518` this clause carried is * that gate at the RETIRED `53ded82bf` and was a comment line at `31971ff1e`. It sat on * a line the 2026-09-22 conversion never touched — and so did eight other @@ -9487,7 +9650,14 @@ export const ObjectTimelinePropsSchema = lazySchema(() => strictObject({ * first publishes a refusal for a key the renderer honours. * * Read points at the pin this repo builds against (`.objectui-sha` = - * `20c6d351a`, re-read there 2026-10-10: + * `0df67f237`, re-read there 2026-10-11: + * `record-source.ts` and `SchemaRenderer.tsx` are byte-identical across the hop + * from `20c6d351a` (`git diff --quiet`), so the prop channel above still + * carries the key; the file changed (+42/-20, objectui#12104, objectui + * `206505c34`: an explicit `groupByField` groups by its display value), every + * hunk at `:730` or below, so every anchor here held unmoved — `:308`, + * `:427`, `:532`, `:554`, `:556`, `:678-679` and `:709`. At `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 @@ -9843,7 +10013,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: + // `0df67f237`, re-read there 2026-10-11: + // `public-blocks.ts`, `block-types.ts` and `block-config.ts` are + // byte-identical across the hop from `20c6d351a` (`git diff --quiet`), so + // `:117-118`, `137-138` and `311-351` did not move; `data-list.tsx` changed + // (+17/-26, objectui#12085, objectui `ce991bd70`: the repeater publishes the + // node-level binding as its one query input), the `definition-list` + // registration not moving and the `repeater` one MOVING `311` -> `317`, its + // line byte-identical and still in the `element` namespace. At `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, @@ -9901,7 +10079,7 @@ export const ComponentPropsMap = { // anchor below held unmoved; at `db11afd49`, 2026-09-29, all four files were // byte-identical to `dd3f7e1be`): // - registration: `@object-ui/components` registers both in the `element` - // namespace (`components/src/renderers/basic/data-list.tsx:85`, `:311`); + // namespace (`components/src/renderers/basic/data-list.tsx:85`, `:317`); // - publication: both are `PUBLIC_BLOCKS` members // (`core/src/registry/public-blocks.ts:117-118`), which is how the // tracked `sdui.manifest.json` carries both; @@ -9941,6 +10119,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` = + // `0df67f237`, re-read there 2026-10-11: + // every objectui file this record cites is byte-identical across the hop from + // `20c6d351a` (`git diff --quiet`), so every anchor held unmoved. At // `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 @@ -10021,7 +10202,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` = - // `20c6d351a`, re-read there 2026-10-10: + // `0df67f237`, re-read there 2026-10-11: + // `index.tsx` is byte-identical to `20c6d351a` (`git diff --quiet`); + // `ObjectTimeline.tsx` (+42/-20) and `renderer.tsx` (+28/-8) changed for + // objectui#12104 (objectui `206505c34`: an explicit `groupByField` groups by + // its display value) and were 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 in `ObjectTimeline.tsx`, 5 in `renderer.tsx`), and no + // declared key set moved. At `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, diff --git a/packages/spec/src/ui/dataset.zod.ts b/packages/spec/src/ui/dataset.zod.ts index a8009333f2e..e3fff6a576a 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` = + * `0df67f237`, re-read there 2026-10-11: + * every objectui file this record cites is byte-identical across the hop from + * `20c6d351a` (`git diff --quiet`), so every anchor held unmoved. At * `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 diff --git a/packages/spec/src/ui/view.zod.ts b/packages/spec/src/ui/view.zod.ts index c06c6e9d5de..7bd5c6125a1 100644 --- a/packages/spec/src/ui/view.zod.ts +++ b/packages/spec/src/ui/view.zod.ts @@ -2219,16 +2219,27 @@ export const TreeConfigSchema = lazySchema(() => strictObject({ * 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 two `getMapConfig` lines did not move. RE-READ again at pin + * `0df67f237` on 2026-10-11: that bump redded three anchors, and none of them + * changed what it reads. `ListView.tsx` (+229/-57: objectui#12081 item 2, + * objectui#12086 and objectui#12082) gained nine import lines above both of + * its anchors, so `resolveListMapConfig` `200` -> `209` and + * `FLAT_MAP_CONFIG_SPELLING` `86` -> `95`, each byte-identical; `case 'map':` + * in `ObjectView.tsx` `2461` -> `2479`, the whole arm byte-identical + * (objectui#12082 and objectui#12085 changed the file around it); + * `objectql.zod.ts` and `ObjectMap.tsx` are byte-identical, so + * `ObjectMapConfigSchema` (`2523`, still closed with `.strict()`), + * `LIST_VIEW_LOCAL_OVERRIDES` (`1506`, still without `map`) and 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:200` first line + * (`packages/plugin-list/src/ListView.tsx:209` first line * `function resolveListMapConfig(schema: { map?: unknown; options?: { map?: unknown } }): Record {`) - * and `ObjectView` (`packages/plugin-view/src/ObjectView.tsx:2461` first line + * and `ObjectView` (`packages/plugin-view/src/ObjectView.tsx:2479` first line * `case 'map':`) copy it through a HAND-LISTED whitelist - * (`packages/plugin-list/src/ListView.tsx:86` first line + * (`packages/plugin-list/src/ListView.tsx:95` first line * `export const FLAT_MAP_CONFIG_SPELLING = {`) — ⚠️ re-read at the new pin: * the whitelist was a key LIST named `FLAT_MAP_CONFIG_KEYS` carrying this * block's keys MINUS `style`, and objectui#9950 made it a total map from @@ -3418,7 +3429,16 @@ 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` = `20c6d351a`, re-read there 2026-10-10: + * (`.objectui-sha` = `0df67f237`, re-read there 2026-10-11: + * `autoLayout.ts` and `fields`' `field-type-alias.ts` are byte-identical to + * `20c6d351a` (`git diff --quiet`), so `resolveColSpan` `:154`, + * `WIDE_FIELD_TYPES` `:58-69` and the `repeater` -> `field:grid` mapping held + * unmoved, and `form.tsx` changed on this hop — 63 insertions, 3 deletions: + * objectui#12108 (objectui `b7cd5c891`), a create form says when the server + * will fill a field — none of it inside `spanLadderFor`, which held at + * `:274-301` byte-identical, and its one call site MOVED `:3202` -> `:3246` + * with the call byte-identical, so it still emits the ladder. At + * `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` @@ -3503,7 +3523,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` = `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."), + 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` = `0df67f237c5a`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest."), /** Custom widget override — only needed when auto-inference is insufficient */ widget: z.string().optional().describe('Custom widget/component name (overrides type-based inference)'), diff --git a/scripts/sdui-manifest.record.json b/scripts/sdui-manifest.record.json index ac6d8449833..a1d2707b818 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": "20c6d351ad74d2b14a93becdc134d51b91b2d2e6", + "objectuiSha": "0df67f237c5ab46cbc65252c5f6bd05f2be44c48", "source": "built-tree", - "modulesRoot": ".cache/objectui-20c6d351ad74/apps/console", + "modulesRoot": ".cache/objectui-0df67f237c5a/apps/console", "objectuiWorkspaceVersion": "17.7.0", "generator": "scripts/gen-sdui-manifest-node.mjs", - "generatedAt": "2026-10-10", - "sha256": "097ae3cbcf9533189f0c8d689e385414bf175d19d105480df746f7c3353e0f1f", + "generatedAt": "2026-10-11", + "sha256": "9d87162a3ef60676c6aed69ecf2703693bdbbf66d5ef798c9d770f3112f86217", "components": 107 } diff --git a/sdui.manifest.json b/sdui.manifest.json index 8b037a555b6..a335e13646f 100644 --- a/sdui.manifest.json +++ b/sdui.manifest.json @@ -2097,11 +2097,6 @@ "type": "element:number", "namespace": "element", "inputs": [ - { - "name": "object", - "type": "string", - "description": "NOT READ (objectui#11880): the aggregate runs over the object the node-level `dataSource.object` names, and a node without one shows the \"no object named\" notice. `@objectstack/spec` retires this flat key in v18 (objectstack#11509)." - }, { "name": "aggregate", "type": "enum", @@ -2119,11 +2114,6 @@ "type": "string", "description": "Measure field (required for every aggregate except count)" }, - { - "name": "filter", - "type": "array", - "description": "NOT READ (objectui#11880): the aggregate is scoped by the node-level `dataSource.filter`, AND-combined with the filter of the saved view its `view` names. This flat key is not combined with it and never applies; `@objectstack/spec` retires it in v18 (objectstack#11509)." - }, { "name": "format", "type": "enum", @@ -2242,12 +2232,6 @@ "type": "element:repeater", "namespace": "element", "inputs": [ - { - "name": "object", - "type": "string", - "required": true, - "description": "Object whose records the list repeats over; a node-level `dataSource.object` wins" - }, { "name": "titleField", "type": "string" @@ -2257,22 +2241,6 @@ "type": "array", "description": "Fields shown after the title on each line, in order: a bare field name, or `{ field }`" }, - { - "name": "filter", - "type": "array", - "of": "object", - "description": "Filter rules `[{ field, operator, value }]`. A string `value` may be a context token such as `{current_user_id}`, resolved before the query" - }, - { - "name": "sort", - "type": "array", - "of": "object", - "description": "Sort order `[{ field, order }]`, applied in list order" - }, - { - "name": "limit", - "type": "number" - }, { "name": "emptyText", "type": "string"