diff --git a/.changeset/console-a58626c88dc8.md b/.changeset/console-a58626c88dc8.md new file mode 100644 index 00000000000..50a07af0a60 --- /dev/null +++ b/.changeset/console-a58626c88dc8.md @@ -0,0 +1,82 @@ +--- +"@objectstack/console": minor +--- + +Console (objectui) refreshed to `a58626c88dc8`. Frontend changes in this range: + +Derived from the changesets objectui declared over the range — 36 releasing of 36 changesets added across 36 non-merge commits. + +- **minor** — The timeline's unused "Overdue" bucket label is removed: `timeline.bucket.overdue` is gone from all ten language packs and from the timeline's built-in English defaults (objectui#… (objectui `c910630cf`) +- **minor** — **BREAKING** — Inside a dashboard widget's legacy `component` envelope, a `metric-card` is now judged by the slot's component arm alone, so every key that arm refuses is refused there too, with… (objectui `89cc738da`) +- **minor** — **BREAKING** — "Recently Accessed" shows each item's own label, in the current language, and a visit that does not change the list no longer writes the `ui.recent` preference (objectui#11678). (objectui `48c82c9d5`) +- **minor** — The calendar and the timeline start the week on the first day of the week of the user's locale (objectui#11675), instead of a fixed Sunday (calendar) and a fixed Monday (timeline)… (objectui `9ca3cacbe`) +- **minor** — The console's settings pages resolve icons through the shared `getLazyIcon` helper and no longer log `[lucide-react]: Name in Lucide DynamicIcon not found` (objectui#11679). (objectui `abd374bb2`) +- **minor** — `DefaultLoginPage` and `DefaultRegisterPage` offer a generic sign-up only where the server would accept one (objectui#11705). Under the default `invite_only` audience posture the… (objectui `7e2d5b0ee`) +- **minor** — Objects with a picklist-bound field save again from the OWD overview, the Setup fields and objects pages, the metadata-admin embedded-item editor, and `MetadataService.saveFields`… (objectui `da3545375`) +- **minor** — The keyboard-shortcuts dialog (`?`) lists only shortcuts that do something (objectui#11674). (objectui `de96f3d0c`) +- **minor** — **BREAKING** — A `metric-card` placed in a dashboard's widget slot refuses `label` by name and points at `title`, the key its heading is drawn from (objectui#4425). (objectui `eb4552e71`) +- **minor** — The console's login and register pages offer a generic sign-up only where the server would accept one (objectui#11691). `/api/v1/auth/config` states the sign-up rule as two keys,… (objectui `daa7caff4`) +- **minor** — An object-bound timeline no longer heads every past date "Overdue": a day before today goes under a neutral "Earlier" bucket, translated in every language (objectui#11676). (objectui `ce464d958`) +- **minor** — Studio reads shared picklists: a select field can use one, an object with a picklist-bound field saves again, and the picklist page is read-only (objectui#10202, the objectui half… (objectui `c3623eb11`) +- **minor** — The AI chat's tool-approval card and its "Open in Builder" handoff card are translated in every language (objectui#11667). (objectui `57d82cb34`) +- **minor** — The chat launchers show a marker while a proposed plan awaits the user's approval (objectui#11666, item 6 of objectui#2458). A user who closed the chat with a blueprint still wait… (objectui `848ba0e12`) +- **minor** — Five fixes on the AI build surface, from the 2026-10-05 cloud acceptance run (objectui#11658). (objectui `fc3c2cc1c`) +- **minor** — `action:group` and `action:menu` no longer read a member's `properties.params` (objectui#11638). A container member's `properties.params` no longer reaches the action runner. (objectui `73b5d7764`) +- **minor** — `LoginForm` shows its "Don't have an account? Sign up" row only when the caller passes `registerUrl` (objectui#11634). The prop used to default to `'/register'`, so a caller that… (objectui `f1a177c41`) +- **minor** — A field group's `visibleWhen` now gates its section on the record detail page, the same way it gates the section on the entry form (objectui#11630). Take an object whose `fieldGro… (objectui `76993f8ef`) +- **patch** — fix(plugin-tree): tree cells draw the same field faces as list cells, so a boolean no longer shows as `true` (objectui#11686) (objectui `a58626c88`) +- **patch** — **The record header's highlight chips share the row's free width and truncate only when it runs out (objectui#11684).** A Product with SKU "QA Widget 1" read "QA Wid…" in the reco… (objectui `7300fcafe`) +- **patch** — An authored `view:calendar` or `view:timeline` node loads its plugin and renders the calendar or the timeline, and a console boot no longer logs the registry's race warning for th… (objectui `e6dcd85cc`) +- **patch** — The approvals inbox's request drawer shows its record summary the way the record page shows the record (objectui#11677). (objectui `3409fe89e`) +- **patch** — The flow designer saves a screen field's `Min` and `Max` as numbers (objectui#11664). (objectui `5ba255538`) +- **patch** — The metric cards no longer write authored keys they do not read onto the page (objectui#4425). Rendered through `SchemaRenderer`, which is how every dashboard draws its KPI tiles… (objectui `a600924f2`) +- **patch** — Console, record page and Studio copy from the 2026-10-05 cloud acceptance run (objectui#11659). (objectui `f9f4a62d5`) +- **patch** — The flow designer's SLA escalation switch on an approval node no longer writes a refused `escalation: { enabled: false }` block, and switching it off keeps the values the author e… (objectui `9f3ed7bca`) +- **patch** — Cancelling a background import shows the rows the server already committed, with Undo (objectui#11650). `ImportWizard`'s Cancel used to show "Import cancelled · 0 imported" withou… (objectui `846f98251`) +- **patch** — Drag-to-reorder works on a grouped sidebar menu, within each level (objectui#11626). `NavigationRenderer` had a sortable path only in its group-free arm. Every stock app's menu is… (objectui `b88937b65`) +- **patch** — The `object-kanban` board totals the view's `summarizeField` in each column header (objectui#11629). (objectui `f4370f426`) +- **patch** — On an object that declares no list view, a grid toolbar change no longer sends a save the door refuses (objectui#11643). Such an object opens on the "All Records" tab the console… (objectui `43671468d`) +- **patch** — The console's `/verify-email?token=…` page verifies the address again (objectui#11633). It used to send the token as `POST /api/v1/auth/verify-email` with a JSON body. better-auth… (objectui `8057a8b14`) +- **patch** — On a runtime with no marketplace that still mounts install-local (an offline boot, `OS_CLOUD_URL=off`), a local install's Details page now offers its local menu: re-seed sample da… (objectui `0baf86f1b`) +- **patch** — A dataset-bound dashboard widget names its comparison window from `compareTo.kind` (objectui#11632). `previousPeriod` reads "vs previous period" and `previousYear` reads "vs last… (objectui `e398a54f0`) +- **patch** — Two grid toolbar changes to one view in one session now both survive a reload (objectui#11642). Before, the second change overwrote the first: changing density and then sorting by… (objectui `531b26c8f`) +- **patch** — A lookup whose `dependsOn` names a parent field drops its selection when that parent changes or is cleared (objectui#11631). (objectui `c00039842`) +- **patch** — A grid toolbar change on a served view is stored where the save door keeps it, so it survives a reload (objectui#11625). This covers density, a column-header sort and the hide-fie… (objectui `59917c4b2`) + +⚠️ 3 of these carry a breaking change: 3 by the author's own breaking annotation in the changeset body — objectui declares no `major` inside a launch window (`scripts/check-changeset-no-major.mjs`). Each is marked **BREAKING** in the list above — read them before compiling the release record. + + + +objectui range: `0abd4f9f8769...a58626c88dc8` diff --git a/.changeset/objectui-pin-citations-a58626c88dc8.md b/.changeset/objectui-pin-citations-a58626c88dc8.md new file mode 100644 index 00000000000..2d206d29259 --- /dev/null +++ b/.changeset/objectui-pin-citations-a58626c88dc8.md @@ -0,0 +1,13 @@ +--- +'@objectstack/spec': patch +--- + +The spec's objectui citations, and the shipped description text that names the `.objectui-sha` pin (the `FormField.span` describe and six migration-entry descriptions), are re-measured against the new console pin, objectui `a58626c88dc8`. + +Clause-②: no + +Every anchor was mapped through the objectui diff `0abd4f9f8769..a58626c88dc8`, 252 paths over 36 commits. Fifteen of those paths are files an asserting record cites: `ObjectKanban.tsx`, `KanbanImpl.tsx`, `ObjectTree.tsx`, `ObjectTimeline.tsx`, `record-details.tsx`, `action-group.tsx`, `action-menu.tsx`, `static-params.ts`, `MetricWidget.tsx`, `MetricCard.tsx`, `form.tsx`, `plugin-kanban.mdx` and the `en` / `zh` / `de` packs. In each, every cited line is byte-identical at the new pin, so each anchor that moved was re-pointed to its new line and the record says by how much; no read point an asserting record cites changed content or died. Every other cited file is byte-identical across the hop (`git diff --quiet`). The seven quoted anchor lines verify against objectui at the new pin. Three records carry a count, and each count was re-taken by its record's own method with the same reading: the `keyboardNavigation` hit lines (15, against 3 for the `schema.editable` control), `ObjectKanban.tsx`'s `quickAdd` / `onQuickAdd` (2 each, against 11 for `onCardClick`), and the `ElementDataSourceGate` occurrences in five `src/index.tsx` shells (0, 3, 3, 3 and 4). + +The six migration entries' corpus counts were re-taken with `git grep -o -F`, the method that first reproduced every `0abd4f9f8769` number. The corpus is now 7754 tracked files. All 99 checked tokens (the export lists of `plugin-lifecycle-advanced.zod.ts`, `tracing.zod.ts` and `metrics.zod.ts`, plus every named key) still read zero, except `Span` / `SpanSchema`, which read 509 / 57: the one new `Span` hit is a `colSpan`. + +No key, default, enum member or export moves. diff --git a/.objectui-sha b/.objectui-sha index 9d6c58a667f..ef0e8f17940 100644 --- a/.objectui-sha +++ b/.objectui-sha @@ -1 +1 @@ -0abd4f9f8769fc4c19ad2f96707684876f74c09f +a58626c88dc85954bd0af24f16ebb69454c03eee diff --git a/content/docs/references/ui/view.mdx b/content/docs/references/ui/view.mdx index 6493459a118..45aaee373d1 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` = `0abd4f9f8769`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. | +| **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` = `a58626c88dc8`), 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` = `0abd4f9f8769`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. | +| **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` = `a58626c88dc8`), 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 173abff67de..365c666c8ee 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": "0abd4f9f8769fc4c19ad2f96707684876f74c09f", - "revDate": "2026-10-05T04:03:25+00:00", + "rev": "a58626c88dc85954bd0af24f16ebb69454c03eee", + "revDate": "2026-10-06T15:08:56+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": "0abd4f9f8769fc4c19ad2f96707684876f74c09f", + "recordedAgainstPin": "a58626c88dc85954bd0af24f16ebb69454c03eee", "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 71152983395..99a0cd875e4 100644 --- a/packages/spec/src/data/api-methods-batch-conformance.test.ts +++ b/packages/spec/src/data/api-methods-batch-conformance.test.ts @@ -61,7 +61,10 @@ const SINGLE_RECORD_WRITE_ONLY: Record = { // `revoked` on ONE key. The multi-select surface this rule protects does not // exist for API keys, and the shape a future one would take does not need // `bulk` either — both read off the console build this release pins - // (`.objectui-sha` = `0abd4f9f8`, re-read there 2026-10-05: + // (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + // every objectui file this record cites is byte-identical across the hop from + // `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved. + // At `0abd4f9f8`, re-read there 2026-10-05: // every objectui file this record cites is byte-identical across the hop from // `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. // At `9dfaca654`, `packages/plugin-grid`; re-measured at diff --git a/packages/spec/src/kernel/functional-completeness.ts b/packages/spec/src/kernel/functional-completeness.ts index a3b53852188..40595e83ada 100644 --- a/packages/spec/src/kernel/functional-completeness.ts +++ b/packages/spec/src/kernel/functional-completeness.ts @@ -287,7 +287,13 @@ 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` = `0abd4f9f8`, re-read there 2026-10-05: + * (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * on the hop off `0abd4f9f8` `ObjectCalendar.tsx` and `ListView.tsx` are + * byte-identical (`git diff --quiet`), so every anchor held unmoved, and the + * `en` / `zh` / `de` packs changed (objectui#11658, objectui#11659, + * objectui#11666, objectui#11667, objectui#11674 and objectui#11676) but not + * their `calendar.configRequired` strings. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`, re-read 2026-10-05: on the hop off @@ -358,7 +364,10 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] { * This repo already records the same deletion one door over: the #13817 * check in `../ui/view.zod.ts` names objectui#7029 as its runtime half. * - `gantt` → NO fallback, and no silence [#19630]. Measured at the pin - * this repo builds against (`.objectui-sha` = `0abd4f9f8`, re-read there 2026-10-05: + * this repo builds against (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * every objectui file this record cites is byte-identical across the hop from + * `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`, re-read @@ -423,7 +432,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` = - * `0abd4f9f8`, re-read there 2026-10-05: + * `a58626c88`, re-read there 2026-10-06: + * on the hop off `0abd4f9f8` `ObjectTimeline.tsx` changed (+39/-9: + * objectui#11675 starts the date buckets' week on the display locale's first + * day, and objectui#11676 heads a past date "Earlier" and retires the + * `timeline.bucket.overdue` read), but its start-date chain and its + * `if (!hasAuthoredItems && !startDateField)` refusal arm are byte-identical, + * MOVED `:574-576` → `:578-580` and `:911` → `:941`, and `ListView.tsx` is + * byte-identical (`git diff --quiet`). + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`; `ObjectTimeline.tsx` and `ListView.tsx` are byte-identical @@ -476,7 +493,10 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] { * block does render; the warning still fires there, because the block the * view TYPE names is the one that is missing. Unchanged by this row. * - `map` → NO fallback, and no silence [#19630]. Measured at the same - * pin (`.objectui-sha` = `0abd4f9f8`, re-read there 2026-10-05: + * pin (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * every objectui file this record cites is byte-identical across the hop from + * `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`; `ObjectMap.tsx` and `ListView.tsx` 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 398da0b31c2..957f6774e5e 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` = `0abd4f9f8769fc4c19ad2f96707684876f74c09f` — names ' + + 'against, `.objectui-sha` = `a58626c88dc85954bd0af24f16ebb69454c03eee` — 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 7650 tracked files (0 across the 7632 at 9dfaca654, the 7579 at 2e818d0b5, the 10267 at ab1879721, the 10071 at 89cad75d5, the 9912 at 31971ff1e, the 9800 at e420df310, the 9546 at db11afd49, the 9283 at dd3f7e1be, the ' + + 'the string debounceDelay each occur 0 times across its 7754 tracked files (0 across 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 and to 17390 and 7209 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 and to 17468 and 7246 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 2149a17b99c..8a0ce1427cc 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` = `0abd4f9f8769fc4c19ad2f96707684876f74c09f`, re-read from this tree — ' + + '`.objectui-sha` = `a58626c88dc85954bd0af24f16ebb69454c03eee`, re-read from this tree — ' + 'spells resourceLimits.timeout 0 times across ' - + '7650 tracked files, against lit controls timeout 1360, RuntimeConfig 293 and resourceLimits ' - + '2 on the same corpus (0 across 7632, and 1360 / 293 / 2, at 9dfaca654; 0 across 7579, and 1351 / 276 / 2, at 2e818d0b5; 0 across 10267, and 1348 / 273 / 2, at ab1879721; 0 across 10071, and 1331 / 273 / 2, at 89cad75d5; 0 across 9912, and 1303 / 273 / 2, at 31971ff1e; 0 across 9800, and 1293 / 273 / 2, at e420df310; 0 across 9546, and 1197 / 273 / 2, at db11afd49; 0 across 9283, and 1172 / 263 / 2, at dd3f7e1be; 0 across 8512, and 1096 / 245 / 2, at f8a9d0fb0; 0 across 8303, and ' + + '7754 tracked files, against lit controls timeout 1431, RuntimeConfig 299 and resourceLimits ' + + '2 on the same corpus (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 83ff461cfe7..bbfb441cc39 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` = `0abd4f9f8769fc4c19ad2f96707684876f74c09f` — spells ' + + 'objectui checkout — `.objectui-sha` = `a58626c88dc85954bd0af24f16ebb69454c03eee` — spells ' + '`flushInterval` 0 times, `initialDelay` 0, `HttpDestinationConfig` 0 and `LoggingConfig` 0 ' - + 'across its 7650 tracked files, against lit controls `useState` 2478 and `timeout` 1360 on ' - + 'the same corpus (all four 0 across 7632, against 2477 and 1360, at 9dfaca654, 0 across 7579, against 2477 and 1351, at 2e818d0b5, 0 across 10267, against 2476 and 1348, at ab1879721, 0 across 10071, against 2470 and 1331, at 89cad75d5, 0 across 9912, against 2469 and 1303, at 31971ff1e, 0 across 9800, against 2464 and 1293, at e420df310, 0 across 9546, against 2449 and 1197, at db11afd49, 0 across 9283, against 2435 and 1172, at dd3f7e1be, 0 across 8512, ' + + 'across its 7754 tracked files, against lit controls `useState` 2491 and `timeout` 1431 on ' + + 'the same corpus (all four 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 f2f315c3015..77eafa0ec57 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` = `0abd4f9f8769fc4c19ad2f96707684876f74c09f`, re-read from this tree — ' - + 'spells all six metrics def names and both distinctive keys 0 times across 7650 tracked ' - + 'files at that sha, against lit controls window 4194, timeout 1360, period 238, ' - + 'interval 195 and metrics 401 on that same corpus and sha (0 across 7632, against 4193 / ' + + '`.objectui-sha` = `a58626c88dc85954bd0af24f16ebb69454c03eee`, re-read from this tree — ' + + 'spells all six metrics def names and both distinctive keys 0 times across 7754 tracked ' + + 'files at that sha, against lit controls window 4255, timeout 1431, period 247, ' + + 'interval 200 and metrics 401 on that same corpus and sha (0 across 7650, against 4194 / ' + + '1360 / 238 / 195 / 401, at 0abd4f9f8, 0 across 7632, against 4193 / ' + '1360 / 238 / 195 / 401, at 9dfaca654, 0 across 7579, against 4175 / ' + '1351 / 238 / 195 / 374, at 2e818d0b5, 0 across 10267, against 4044 / ' + '1348 / 231 / 196 / 354, at ab1879721, 0 across 10071, against 4002 / ' 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 a249b70cb38..4d37031781a 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` = `0abd4f9f8769fc4c19ad2f96707684876f74c09f` — names none of it: all 37 exports of ' - + 'tracing.zod.ts and each of the four key names occur 0 times across the 7650 files ' - + 'tracked at that sha (the 508 Span and 57 SpanSchema hits are objectui\'s own HTML ' + + 'pinned objectui checkout — `.objectui-sha` = `a58626c88dc85954bd0af24f16ebb69454c03eee` — names none of it: all 37 exports of ' + + 'tracing.zod.ts and each of the four key names occur 0 times across the 7754 files ' + + 'tracked at that sha (the 509 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: 17390 hits for the bare token objectstack, ' - + 'and 7209 for the package specifier @objectstack/spec (at 9dfaca654: 0 across 7632, Span 508, ' + + 'two lit controls on that same corpus and sha: 17468 hits for the bare token objectstack, ' + + 'and 7246 for the package specifier @objectstack/spec (at 0abd4f9f8: 0 across 7650, Span 508, ' + + '17390 and 7209; at 9dfaca654: 0 across 7632, Span 508, ' + '17313 and 7186; at 2e818d0b5: 0 across 7579, Span 505, ' + '17227 and 7134; at ab1879721: 0 across 10267, Span 491, ' + '16377 and 6665; at 89cad75d5: 0 across 10071, Span 489, ' 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 d8221dd533d..bee8e434d30 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` = `0abd4f9f8769fc4c19ad2f96707684876f74c09f` — spells it 0 ' - + 'times across 7650 tracked files, against lit controls `TTL` 182 and `tenant` 1318 on the ' - + 'same corpus (0 across 7632, against 182 and 1318, at 9dfaca654; 0 across 7579, against 182 and 1317, at 2e818d0b5; 0 across 10267, against 180 and 1238, at ab1879721; 0 across 10071, against 181 and 1237, at 89cad75d5; 0 across 9912, against 181 and 1237, at 31971ff1e; 0 across 9800, against 181 and 1235, at e420df310; 0 across 9546, against 181 and 1200, at db11afd49; 0 across 9283, against 181 and 1185, at dd3f7e1be; 0 across 8512, against 156 and 1034, at f8a9d0fb0; 0 across 8303, against 156 ' + + 'objectui checkout — `.objectui-sha` = `a58626c88dc85954bd0af24f16ebb69454c03eee` — spells it 0 ' + + 'times across 7754 tracked files, against lit controls `TTL` 184 and `tenant` 1319 on the ' + + 'same corpus (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/migrations/registry.ts b/packages/spec/src/migrations/registry.ts index a42138475e1..7fbbfba7c48 100644 --- a/packages/spec/src/migrations/registry.ts +++ b/packages/spec/src/migrations/registry.ts @@ -14448,13 +14448,13 @@ const step18: MigrationStep = { + 'the audience that does not parse. Measured on 884e8347d: the only in-repo readers are ' + 'packages/core/src/health-monitor.ts and packages/core/src/hot-reload.ts, both moved in ' + 'this same change; and the pinned objectui checkout — the pin this repo builds ' - + 'against, `.objectui-sha` = `0abd4f9f8769fc4c19ad2f96707684876f74c09f` — names ' + + 'against, `.objectui-sha` = `a58626c88dc85954bd0af24f16ebb69454c03eee` — 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 7650 tracked files (0 across the 7632 at 9dfaca654, the 7579 at 2e818d0b5, the 10267 at ab1879721, the 10071 at 89cad75d5, the 9912 at 31971ff1e, the 9800 at e420df310, the 9546 at db11afd49, the 9283 at dd3f7e1be, the ' + + 'the string debounceDelay each occur 0 times across its 7754 tracked files (0 across 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 and to 17390 and 7209 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 and to 17468 and 7246 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 ' @@ -14659,10 +14659,10 @@ const step18: MigrationStep = { + 'spells timeout 0 times; outside the zod file and its test the only live occurrences are the ' + 'generated rows in content/docs/references/kernel/plugin-security-advanced.mdx, which this ' + 'rename regenerates. The pinned objectui checkout — this is the pin we build against, ' - + '`.objectui-sha` = `0abd4f9f8769fc4c19ad2f96707684876f74c09f`, re-read from this tree — ' + + '`.objectui-sha` = `a58626c88dc85954bd0af24f16ebb69454c03eee`, re-read from this tree — ' + 'spells resourceLimits.timeout 0 times across ' - + '7650 tracked files, against lit controls timeout 1360, RuntimeConfig 293 and resourceLimits ' - + '2 on the same corpus (0 across 7632, and 1360 / 293 / 2, at 9dfaca654; 0 across 7579, and 1351 / 276 / 2, at 2e818d0b5; 0 across 10267, and 1348 / 273 / 2, at ab1879721; 0 across 10071, and 1331 / 273 / 2, at 89cad75d5; 0 across 9912, and 1303 / 273 / 2, at 31971ff1e; 0 across 9800, and 1293 / 273 / 2, at e420df310; 0 across 9546, and 1197 / 273 / 2, at db11afd49; 0 across 9283, and 1172 / 263 / 2, at dd3f7e1be; 0 across 8512, and 1096 / 245 / 2, at f8a9d0fb0; 0 across 8303, and ' + + '7754 tracked files, against lit controls timeout 1431, RuntimeConfig 299 and resourceLimits ' + + '2 on the same corpus (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.', @@ -14898,10 +14898,10 @@ const step18: MigrationStep = { + 'no in-repo runtime reads any of the four — outside `packages/spec/src/system/logging.zod.ts` ' + 'and its test the only occurrences are the generated rows in ' + '`content/docs/references/system/logging.mdx`, which this rename regenerates; and the pinned ' - + 'objectui checkout — `.objectui-sha` = `0abd4f9f8769fc4c19ad2f96707684876f74c09f` — spells ' + + 'objectui checkout — `.objectui-sha` = `a58626c88dc85954bd0af24f16ebb69454c03eee` — spells ' + '`flushInterval` 0 times, `initialDelay` 0, `HttpDestinationConfig` 0 and `LoggingConfig` 0 ' - + 'across its 7650 tracked files, against lit controls `useState` 2478 and `timeout` 1360 on ' - + 'the same corpus (all four 0 across 7632, against 2477 and 1360, at 9dfaca654, 0 across 7579, against 2477 and 1351, at 2e818d0b5, 0 across 10267, against 2476 and 1348, at ab1879721, 0 across 10071, against 2470 and 1331, at 89cad75d5, 0 across 9912, against 2469 and 1303, at 31971ff1e, 0 across 9800, against 2464 and 1293, at e420df310, 0 across 9546, against 2449 and 1197, at db11afd49, 0 across 9283, against 2435 and 1172, at dd3f7e1be, 0 across 8512, ' + + 'across its 7754 tracked files, against lit controls `useState` 2491 and `timeout` 1431 on ' + + 'the same corpus (all four 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: @@ -18701,10 +18701,11 @@ const step18: MigrationStep = { + 'against a lit control of 1195 defineStack occurrences on that same corpus at fc28c1d38 ' + '(1195 again at 9b62f54671); and the objectui ' + 'checkout this repo builds against — this is the pin, ' - + '`.objectui-sha` = `0abd4f9f8769fc4c19ad2f96707684876f74c09f`, re-read from this tree — ' - + 'spells all six metrics def names and both distinctive keys 0 times across 7650 tracked ' - + 'files at that sha, against lit controls window 4194, timeout 1360, period 238, ' - + 'interval 195 and metrics 401 on that same corpus and sha (0 across 7632, against 4193 / ' + + '`.objectui-sha` = `a58626c88dc85954bd0af24f16ebb69454c03eee`, re-read from this tree — ' + + 'spells all six metrics def names and both distinctive keys 0 times across 7754 tracked ' + + 'files at that sha, against lit controls window 4255, timeout 1431, period 247, ' + + 'interval 200 and metrics 401 on that same corpus and sha (0 across 7650, against 4194 / ' + + '1360 / 238 / 195 / 401, at 0abd4f9f8, 0 across 7632, against 4193 / ' + '1360 / 238 / 195 / 401, at 9dfaca654, 0 across 7579, against 4175 / ' + '1351 / 238 / 195 / 374, at 2e818d0b5, 0 across 10267, against 4044 / ' + '1348 / 231 / 196 / 354, at ab1879721, 0 across 10071, against 4002 / ' @@ -18924,12 +18925,13 @@ const step18: MigrationStep = { + 'dark control of 0; inside packages/spec the ' + 'only occurrences are tracing.zod.ts, its test, and the generated rows in ' + 'content/docs/references/system/tracing.mdx, which this rename regenerates. And the ' - + 'pinned objectui checkout — `.objectui-sha` = `0abd4f9f8769fc4c19ad2f96707684876f74c09f` — names none of it: all 37 exports of ' - + 'tracing.zod.ts and each of the four key names occur 0 times across the 7650 files ' - + 'tracked at that sha (the 508 Span and 57 SpanSchema hits are objectui\'s own HTML ' + + 'pinned objectui checkout — `.objectui-sha` = `a58626c88dc85954bd0af24f16ebb69454c03eee` — names none of it: all 37 exports of ' + + 'tracing.zod.ts and each of the four key names occur 0 times across the 7754 files ' + + 'tracked at that sha (the 509 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: 17390 hits for the bare token objectstack, ' - + 'and 7209 for the package specifier @objectstack/spec (at 9dfaca654: 0 across 7632, Span 508, ' + + 'two lit controls on that same corpus and sha: 17468 hits for the bare token objectstack, ' + + 'and 7246 for the package specifier @objectstack/spec (at 0abd4f9f8: 0 across 7650, Span 508, ' + + '17390 and 7209; at 9dfaca654: 0 across 7632, Span 508, ' + '17313 and 7186; at 2e818d0b5: 0 across 7579, Span 505, ' + '17227 and 7134; at ab1879721: 0 across 10267, Span 491, ' + '16377 and 6665; at 89cad75d5: 0 across 10071, Span 489, ' @@ -19043,9 +19045,9 @@ const step18: MigrationStep = { + 'bd25e897dc: no in-repo runtime reads the key — outside `packages/spec/src/system/tenant.zod.ts` ' + 'and its test the only occurrences are the four generated rows in ' + '`content/docs/references/system/tenant.mdx`, which this rename regenerates; and the pinned ' - + 'objectui checkout — `.objectui-sha` = `0abd4f9f8769fc4c19ad2f96707684876f74c09f` — spells it 0 ' - + 'times across 7650 tracked files, against lit controls `TTL` 182 and `tenant` 1318 on the ' - + 'same corpus (0 across 7632, against 182 and 1318, at 9dfaca654; 0 across 7579, against 182 and 1317, at 2e818d0b5; 0 across 10267, against 180 and 1238, at ab1879721; 0 across 10071, against 181 and 1237, at 89cad75d5; 0 across 9912, against 181 and 1237, at 31971ff1e; 0 across 9800, against 181 and 1235, at e420df310; 0 across 9546, against 181 and 1200, at db11afd49; 0 across 9283, against 181 and 1185, at dd3f7e1be; 0 across 8512, against 156 and 1034, at f8a9d0fb0; 0 across 8303, against 156 ' + + 'objectui checkout — `.objectui-sha` = `a58626c88dc85954bd0af24f16ebb69454c03eee` — spells it 0 ' + + 'times across 7754 tracked files, against lit controls `TTL` 184 and `tenant` 1319 on the ' + + 'same corpus (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 c725bf95ddb..2ee42b7a36c 100644 --- a/packages/spec/src/ui/action-outcome-messages.test.ts +++ b/packages/spec/src/ui/action-outcome-messages.test.ts @@ -12,7 +12,10 @@ * runner default) and the `${result.*}` INTERPOLATION are the console's — the * reader is objectstack-ai/objectui#11344, a later link of the same ruling, * carried from the pin this repo builds against (`.objectui-sha` = - * `0abd4f9f8`, re-read there 2026-10-05: + * `a58626c88`, re-read there 2026-10-06: + * every objectui file this record cites is byte-identical across the hop from + * `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`; `ActionRunner.composeSuccessMessage`, in diff --git a/packages/spec/src/ui/action.zod.ts b/packages/spec/src/ui/action.zod.ts index 8ce4736de43..870e61e1121 100644 --- a/packages/spec/src/ui/action.zod.ts +++ b/packages/spec/src/ui/action.zod.ts @@ -1363,7 +1363,10 @@ const actionObject = () => strictObject({ * * Liveness: the ledger row was `planned` until the console reader landed, * and it is `live` from the pin this repo builds against (`.objectui-sha` = - * `0abd4f9f8`, re-read there 2026-10-05: + * `a58626c88`, re-read there 2026-10-06: + * every objectui file this record cites is byte-identical across the hop from + * `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`, re-read 2026-10-05: `core/src/actions/ActionRunner.ts` is diff --git a/packages/spec/src/ui/component.test.ts b/packages/spec/src/ui/component.test.ts index 723955aa1b1..bd6762ed1bb 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` = `0abd4f9f8`, re-read there 2026-10-05: +// builds against — `.objectui-sha` = `a58626c88`, re-read there 2026-10-06: +// every objectui file this record cites is byte-identical across the hop from +// `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved. +// At `0abd4f9f8`, re-read there 2026-10-05: // every objectui file this record cites is byte-identical across the hop from // `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. // At `9dfaca654`. Re-derived at that pin @@ -437,7 +440,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` = `0abd4f9f8`, re-read there 2026-10-05: +// the pin this repo builds against — `.objectui-sha` = `a58626c88`, re-read there 2026-10-06: +// every objectui file this record cites is byte-identical across the hop from +// `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved. +// At `0abd4f9f8`, re-read there 2026-10-05: // every objectui file this record cites is byte-identical across the hop from // `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. // At `9dfaca654`. Re-derived at @@ -3693,7 +3699,15 @@ 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` = `0abd4f9f8`, re-read there 2026-10-05: +// against (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: +// `ObjectKanban.tsx` changed (+65/-2, objectui#11629: each column header totals +// the view's `summarizeField`), which MOVED the `$top` read `752` -> `762` and +// the default `:97` -> `:98`, both byte-identical; `plugin-kanban.mdx` gained +// one feature bullet above the `limit` row and the `limit: 250` snippet, +// neither of which changed; and `plugin-kanban/src/index.tsx`, +// `plugin-kanban/src/types.ts` and `objectql.ts` are byte-identical (`git diff +// --quiet`), so `488-492` and `4754` did not move. +// At `0abd4f9f8`, re-read there 2026-10-05: // every objectui file this record cites is byte-identical across the hop from // `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. // At `9dfaca654`; re-measured there 2026-10-05 — @@ -3794,9 +3808,9 @@ describe('object-* block props schemas — declared, so the props gate has a sch // `limit?: number` member moved `3735` -> `3832`. All five files were // byte-identical across the hop onto `62597c588`, and were last re-READ at // `87af769e9` 2026-09-20, the hop that moved every anchor and renamed one -// face outright): `plugin-kanban/src/ObjectKanban.tsx:752` +// face outright): `plugin-kanban/src/ObjectKanban.tsx:762` // queries `$top: resolveRowLimit(schema.limit, DEFAULT_KANBAN_FETCH_BATCH_SIZE)` -// (100, `:97`; the bare `??` became `resolveRowLimit` in objectui#9925, which drops +// (100, `:98`; the bare `??` became `resolveRowLimit` in objectui#9925, which drops // and reports a cap the contract refuses), // `plugin-kanban/src/index.tsx:488-492` maps `limit: 'limit'` in // `OBJECT_KANBAN_DATA_SOURCE`, ⚠️ `KanbanSchema` is RETIRED at this pin and @@ -3864,7 +3878,15 @@ describe('ObjectKanbanPropsSchema limit — the row cap four objectui faces alre // since retired that block, objectui#8257). Unlike `limit` above — a key four // objectui faces already implemented, so the spec was the half that was wrong // — `quickAdd` was FORWARDED and never read: at the pin this repo builds -// against (`.objectui-sha` = `0abd4f9f8`, re-read there 2026-10-05: +// against (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: +// `KanbanBoardCore.tsx` is byte-identical (`git diff --quiet`), so `:78` and +// `:111-112` did not move; `ObjectKanban.tsx` (+65/-2) and `KanbanImpl.tsx` +// (+48/-1) changed for objectui#11629 (each column header totals the view's +// `summarizeField`), and every anchor in them MOVED with its line +// byte-identical: the spread `1669` -> `1731`, still the `schema` bag handed to +// `KanbanBoardCore`, and the gate `624` -> `668` and `637` -> `681`; and the +// counts re-read the same, 2 / 2 / 11. +// At `0abd4f9f8`, re-read there 2026-10-05: // every objectui file this record cites is byte-identical across the hop from // `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. // At `9dfaca654`; re-measured there 2026-10-05 — @@ -3924,11 +3946,11 @@ describe('ObjectKanbanPropsSchema limit — the row cap four objectui faces alre // below it, not the spread; at `f8a9d0fb0` (2026-09-24) it // had MOVED `1563` -> `1578` the same way (objectui#10068's `$orderby`); both // files were byte-identical across the hop onto `62597c588`, and every anchor -// was re-READ at `87af769e9` 2026-09-20) `ObjectKanban.tsx:1669` +// was re-READ at `87af769e9` 2026-09-20) `ObjectKanban.tsx:1731` // spreads the // authored bag into `KanbanBoardCore` (into `KanbanRenderer` until // objectui#11234, which reads the pair off it no more) and `KanbanImpl` gates the affordance on -// `quickAdd && onQuickAdd` (`KanbanImpl.tsx:624`, `:637` — the file is spelled +// `quickAdd && onQuickAdd` (`KanbanImpl.tsx:668`, `:681` — the file is spelled // here because those two ranges are NOT in `ObjectKanban.tsx`), while // `onQuickAdd` is a // host-supplied FUNCTION no producer puts on an `object-kanban` node @@ -4029,7 +4051,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` = `0abd4f9f8`, re-read there 2026-10-05: +// `.objectui-sha` = `a58626c88`, re-read there 2026-10-06: +// every objectui file this record cites is byte-identical across the hop from +// `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved. +// At `0abd4f9f8`, re-read there 2026-10-05: // every objectui file this record cites is byte-identical across the hop from // `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. // At `9dfaca654`, re-derived there 2026-10-05: every objectui @@ -4197,7 +4222,16 @@ 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` = `0abd4f9f8`, re-read there 2026-10-05: +// (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: +// `ObjectMap.tsx`, `ObjectGantt.tsx` and `record-source.ts` are byte-identical +// across the hop off `0abd4f9f8` (`git diff --quiet`), so every anchor in them +// held unmoved; `ObjectTree.tsx` +81/-3 changed for objectui#11686 (a tree cell +// draws the same field face a list cell does), none of it on a cited line, so +// the tree's rung-1 call `resolveRecordSourceConfig(schema, 'view-data')` MOVED +// `:637` -> `:714`, its shorthand read `(rest as any).data` `:868` -> `:945` +// and its `schema.navigation` read `:1057` -> `:1135`, each byte-identical, and +// the set of `schema.*` keys each renderer reads is the same at both pins. +// At `0abd4f9f8`, re-read there 2026-10-05: // every objectui file this record cites is byte-identical across the hop from // `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. // At `9dfaca654`; re-measured there 2026-10-05 — diff --git a/packages/spec/src/ui/component.zod.ts b/packages/spec/src/ui/component.zod.ts index d8565fd7a81..83f4be81eb9 100644 --- a/packages/spec/src/ui/component.zod.ts +++ b/packages/spec/src/ui/component.zod.ts @@ -830,7 +830,10 @@ export const PageTabsProps = strictObject({ * false candidate a component over). * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `0abd4f9f8`, re-read there 2026-10-05: + * (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * every objectui file this record cites is byte-identical across the hop + * from `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop * from `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`; re-derived at that pin 2026-10-05 — @@ -1052,7 +1055,16 @@ export const PageCardProps = strictObject({ * declarations identical. * * Each clause is read off the objectui pin this repo builds against - * (`.objectui-sha` = `0abd4f9f8769`, re-read there 2026-10-05: + * (`.objectui-sha` = `a58626c88dc8`, re-read there 2026-10-06: + * across the hop from `0abd4f9f8769` `record-highlights.tsx`, + * `record-related-list.tsx`, `record-quick-actions.tsx` and the three + * `permissions` files are byte-identical (`git diff --quiet`), so NO anchor in + * those six moved; `record-details.tsx` changed (+145/-16, objectui#11630: a + * field group's `visibleWhen` gates its section on the record detail page) + * above every cited line, so each of its anchors MOVED by 103 with its cited + * text byte-identical — `244` -> `347`, `233` -> `336`, `244-252` -> `347-355`, + * `188` -> `291` — and each is cited below at this pin. + * At `0abd4f9f8769`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654311` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654311`, re-read there 2026-10-05: across the hop @@ -1109,21 +1121,21 @@ export const PageCardProps = strictObject({ * with its cited text byte-identical, by 1 and by 4 respectively: * * 1. CAPABILITIES, NOT OBJECT ACTIONS. Every block gates through - * `perms.hasCapabilities(required)` — `record-details.tsx:244`, + * `perms.hasCapabilities(required)` — `record-details.tsx:347`, * `record-highlights.tsx:102`, `record-related-list.tsx:393`, * `record-quick-actions.tsx:273` — and never `perms.can(objectName, …)`; * each renderer's docblock states the capability "is not object-scoped" - * (`record-details.tsx:233`, `record-highlights.tsx:81`, + * (`record-details.tsx:336`, `record-highlights.tsx:81`, * `record-related-list.tsx:380`, `record-quick-actions.tsx:262`). `read` * is looked up in the capability set like any other name. * 2. ALL OF THEM. `MePermissionsProvider.tsx:416` 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 — - * `record-details.tsx:244-252`, `record-highlights.tsx:160-173`, + * `record-details.tsx:347-355`, `record-highlights.tsx:160-173`, * `record-related-list.tsx:393-401`, `record-quick-actions.tsx:273-281`. * Checks that already withhold the content run first on two of them (no - * record bound, `record-details.tsx:188`; no object, + * record bound, `record-details.tsx:291`; no object, * `record-related-list.tsx:326`; the related object's read gate, * `record-related-list.tsx:344`), which is why the text says "wherever it * would otherwise render" rather than promising the notice unconditionally. @@ -2356,7 +2368,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` = `0abd4f9f8`, re-read there 2026-10-05: + * (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * every objectui file this record cites is byte-identical across the hop + * from `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop * from `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`; re-derived at that pin 2026-10-05 — @@ -2700,7 +2715,10 @@ export const ElementButtonPropsSchema = lazySchema(() => strictObject({ * the button. * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `0abd4f9f8`, re-read there 2026-10-05: + * (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * every objectui file this record cites is byte-identical across the hop from + * `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`; re-derived at that pin 2026-10-05 — @@ -3186,7 +3204,18 @@ 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` = `0abd4f9f8`, re-read there 2026-10-05: + * against, `.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * `public-blocks.ts`, `auto-trigger.ts`, `action-button.tsx`, + * `action-icon.tsx`, `basic/data-list.tsx` and `ui/button.tsx` are + * byte-identical across the hop from `0abd4f9f8` (`git diff --quiet`), so their + * anchors held unmoved; `action-group.tsx` (+10/-18) and `action-menu.tsx` + * (+11/-18) changed for objectui#11638, which retires the two containers' read + * of a member's `properties.params` (`readMemberStaticParamValues`, deleted + * from `static-params.ts` with both calls) and the `useConfigBagEvaluator()` + * call that served it, so the `objectName` forward each makes MOVED with its + * line byte-identical, `381` -> `373` and `327` -> `320`, and is cited below at + * this pin. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`; first measured at `.objectui-sha` @@ -3289,7 +3318,7 @@ export const ElementTextInputPropsSchema = lazySchema(() => strictObject({ * (`action-button.tsx:318`, `action-icon.tsx:211`), and the console resolves * its dispatch target as `action.objectName || `. On * `action:group` / `action:menu` the forward is the MEMBER's - * (`action-group.tsx:381`, `action-menu.tsx:327`), so it rides each member + * (`action-group.tsx:373`, `action-menu.tsx:320`), so it rides each member * object and the container rows gain no key. */ @@ -4280,7 +4309,11 @@ const GridOperationsSchema = lazySchema(() => strictObject({ * control `schema.editable` in `ObjectGrid.tsx`. It was declared ahead of its * reader on purpose (the BUILD objectui#11068 chose), and its describe carried * the `[EXPERIMENTAL — not enforced]` marker that said so. Re-measured at the - * pin this repo builds against (`.objectui-sha` = `0abd4f9f8`, re-read there 2026-10-05: + * pin this repo builds against (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * `ObjectGrid.tsx` and `data-table.tsx` are byte-identical across the hop from + * `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved, and the same + * method still finds 15 hit lines against 3 for the control. + * At `0abd4f9f8`, re-read there 2026-10-05: * `ObjectGrid.tsx` and `data-table.tsx` are byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved, and the same * method still finds 15 hit lines against 3 for the control. @@ -4373,7 +4406,10 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({ * same members, and objectui's grid follows this declaration. * * ⚠️ That gap is closed at the pin this repo builds against (`.objectui-sha` - * = `0abd4f9f8`, re-read there 2026-10-05: + * = `a58626c88`, re-read there 2026-10-06: + * every objectui file this record cites is byte-identical across the hop from + * `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`, re-measured 2026-10-05: `ObjectGrid.tsx` changed across the @@ -4761,7 +4797,10 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({ * `ComponentPropsMap` key. This record said to drop the marker in the change * that lands the BUILD at the pin, and it is dropped here. * - * Read at the pin this repo builds against (`.objectui-sha` = `0abd4f9f8`, re-read there 2026-10-05: + * Read at the pin this repo builds against (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * every objectui file this record cites is byte-identical across the hop from + * `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`, @@ -5159,7 +5198,16 @@ export const ObjectMetricPropsSchema = lazySchema(() => strictObject({ * same record for the metric tile. * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `0abd4f9f8`, re-read there 2026-10-05: + * (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * `plugin-dashboard/src/index.tsx`, `ObjectMetricWidget.tsx` and + * `lazy-icon.tsx` are byte-identical to `0abd4f9f8` (`git diff --quiet`), so + * their anchors hold unmoved; `MetricWidget.tsx` (+19/-7) and + * `MetricCard.tsx` (+13/-4) changed for objectui#4425 (the metric cards stop + * writing authored keys they do not read onto the page), no hunk naming + * `icon`, so the resolve MOVED `371-380` -> `383-392` and the draw `432-441` + * -> `444-453`, both byte-identical, and `MetricCard.tsx`'s `getLazyIcon` + * call MOVED `83` -> `92`. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`; re-derived at that pin 2026-10-05 — @@ -5244,13 +5292,13 @@ export const ObjectMetricPropsSchema = lazySchema(() => strictObject({ * `plugin-dashboard/src/index.tsx:299` publishes it as a designer input * on the registered `object-metric` block; * `ObjectMetricWidget.tsx:304` destructures it and forwards it at `:753` to - * `MetricWidget`; `MetricWidget.tsx:371-380` resolves it via + * `MetricWidget`; `MetricWidget.tsx:383-392` resolves it via * `getLazyIcon(icon)` — guarded on `typeof icon === 'string'`, because the - * React prop also accepts a ready-made node — and `:432-441` draws it in the + * React prop also accepts a ready-made node — and `:444-453` draws it in the * tinted square whose colour comes from `colorVariant`. * * ⚠️ Do not re-anchor this to `MetricCard.tsx`. That sibling calls - * `getLazyIcon` on line 83 and reads like the same read point, but nothing + * `getLazyIcon` on line 92 and reads like the same read point, but nothing * on this key's path renders it (its heading key is `title`, this path's is * `label`), so a line cited from it describes a component this key never * reaches. @@ -5395,7 +5443,11 @@ 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` = `0abd4f9f8`, re-read there 2026-10-05: + * (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * `ObjectKanban.tsx` changed across the hop from `0abd4f9f8`, +65/-2 + * (objectui#11629: each column header totals the view's `summarizeField`), so + * the anchor was re-READ and MOVED `752` -> `762` with its text byte-identical. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`; re-measured there 2026-10-05 — @@ -5442,7 +5494,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:752`, the `$top` of the + * `ObjectKanban.tsx:762`, the `$top` of the * board's one query — its docblock below carries the four-face record. */ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ @@ -5495,7 +5547,18 @@ 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` = `0abd4f9f8`, re-read there 2026-10-05: + * repo builds against (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * `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 to + * `0abd4f9f8` (`git diff --quiet`), so `:268-272`, `488-492`, `:218-220`, + * `:437-456` and `4754` did not move; `plugin-kanban.mdx` gained one feature + * bullet (objectui#11629's column totals) above the `limit` row and the + * `limit: 250` snippet, neither of which changed; `ObjectKanban.tsx` changed + * (+65/-2, objectui#11629), so the type import `:10` did not move and the + * default `:97` -> `:98`, the query `745-755` -> `755-765` and the + * `queryFilter` resolution `:614-615` -> `:624-625` MOVED byte-identical. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`; re-measured there @@ -5628,10 +5691,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:745-755`, where `queryFilter` is - * `schema.filter` with its context tokens resolved at `:614-615` — + * (`plugin-kanban/src/ObjectKanban.tsx:755-765`, where `queryFilter` is + * `schema.filter` with its context tokens resolved at `:624-625` — * objectui#10666; at `f8a9d0fb0` the member read `schema.filter` verbatim — - * the default `100` at `:97`, named `DEFAULT_KANBAN_LIMIT` until + * the default `100` at `:98`, 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 @@ -5736,7 +5799,16 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ * quick-add control and no block a document can name offers one either). * * Measured at the objectui pin this repo builds against - * (`.objectui-sha` = `0abd4f9f8`, re-read there 2026-10-05: + * (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * `KanbanBoardCore.tsx` and `plugin-kanban/src/index.tsx` are byte-identical + * across the hop from `0abd4f9f8` (`git diff --quiet`), so `:345-346` did not + * move; `ObjectKanban.tsx` (+65/-2) and `KanbanImpl.tsx` (+48/-1) changed for + * objectui#11629 (each column header totals the view's `summarizeField`), and + * the gate MOVED with its lines byte-identical, `624` -> `668` and `637` -> + * `681`; `ObjectKanban.tsx` still names `quickAdd` and `onQuickAdd` 2 times + * each against 11 for `onCardClick`, and objectui still registers no + * `kanban-ui` block. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved, and * `ObjectKanban.tsx` still names `quickAdd` and `onQuickAdd` 2 times each @@ -5818,7 +5890,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:624` and `:637`), and `onQuickAdd` is a + * BOTH (`KanbanImpl.tsx:668` and `:681`), 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 @@ -5911,7 +5983,16 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ * element schemas). * * Measured at the pin this repo builds against (`.objectui-sha` = - * `0abd4f9f8`, re-read there 2026-10-05: + * `a58626c88`, re-read there 2026-10-06: + * `useNavigationOverlay.ts` is byte-identical to `0abd4f9f8` (`git diff + * --quiet`), and `ObjectKanban.tsx` changed above and between the anchors + * here (+65/-2, objectui#11629: each column header totals the view's + * `summarizeField`) without touching one, so each MOVED with its cited text + * byte-identical: the read `1310` -> `1368`, the hand-off `1318-1319` -> + * `1376-1377`, the overlay render `1568` -> `1626` and its + * `NavigationOverlay` `1584-1597` -> `1642-1655`, and the card click `1693` + * -> `1755`. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`; re-measured there 2026-10-05 — `useNavigationOverlay.ts` is @@ -5974,11 +6055,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:1310` + * `ObjectKanban.tsx:1368` * reads `schema.navigation ?? { mode: 'drawer' }` and hands it to - * `useNavigationOverlay` (`:1318-1319`), whose result drives the card click - * (`:1693`) and the detail overlay (`:1568`, whose `NavigationOverlay` is - * `:1584-1597`) — on a STANDALONE board, with no enclosing view to resolve + * `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 * 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 @@ -6111,7 +6192,10 @@ export const ObjectCalendarPropsSchema = lazySchema(() => strictObject({ * `object-kanban`'s above. * * Measured at the pin this repo builds against (`.objectui-sha` = - * `0abd4f9f8`, re-read there 2026-10-05: + * `a58626c88`, re-read there 2026-10-06: + * every objectui file this record cites is byte-identical across the hop from + * `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`; re-measured there 2026-10-05 — `ObjectCalendar.tsx` changed @@ -7310,7 +7394,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` = `0abd4f9f8`, re-read there 2026-10-05: + * `.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * every objectui file this record cites is byte-identical across the hop from + * `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`, re-measured there 2026-10-05: `ObjectMap.tsx` @@ -7487,7 +7574,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` = `0abd4f9f8`, re-read there 2026-10-05: + * pin this repo builds against (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * every objectui file this record cites is byte-identical across the hop from + * `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`, re-measured @@ -7546,7 +7636,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` = `0abd4f9f8`, re-read there 2026-10-05: + * (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * every objectui file this record cites is byte-identical across the hop from + * `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`, re-measured there 2026-10-05 — @@ -7727,7 +7820,10 @@ function objectGanttMarker() { /** * `object-gantt` (objectui `plugin-gantt/src/ObjectGantt.tsx` plus the registry * shell `plugin-gantt/src/index.tsx`, read at the pin this repo builds against - * — `.objectui-sha` = `0abd4f9f8`, re-read there 2026-10-05: + * — `.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * every objectui file this record cites is byte-identical across the hop from + * `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`, re-measured there 2026-10-05: @@ -7959,11 +8055,18 @@ export type ObjectGanttPropsParsed = z.infer; /** * The flat `TreeConfig` spellings `getTreeConfig` reads ahead of the `tree` - * block (`ObjectTree.tsx:284-297`) and that `ObjectView` / `ListView` EMIT when + * block (`ObjectTree.tsx:289-302`) and that `ObjectView` / `ListView` EMIT when * they flatten `options.tree` (`ListView.tsx:3770-3789`, `case 'tree'`: the * product carries these keys, the EFFECTIVE `filter` objectui#10250 added, and * NO `tree` key). Both halves re-READ at the - * pin this repo builds against (`.objectui-sha` = `0abd4f9f8`, re-read there 2026-10-05: + * pin this repo builds against (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * `plugin-tree/src/index.tsx` and `ListView.tsx` are byte-identical to + * `0abd4f9f8` (`git diff --quiet`), so `3770-3789` and `:3784` did not move; + * `ObjectTree.tsx` changed (+81/-3, objectui#11686: five import lines at the + * top, and the cell-format helpers further down), so `235-256` MOVED to + * `240-261` and `284-297` to `289-302`, each byte-identical, and the flat key + * set each reads or emits did not move. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved). * At `9dfaca654`, on 2026-10-05 — @@ -8033,7 +8136,7 @@ export type ObjectGanttPropsParsed = z.infer; * read rather than a moved one: `getTreeConfig`'s `?? schema.titleField` rung * — the `:117` this record used to cite — was removed on objectui#8841 * because it read the FLATTENED NODE and never the block, and the docblock at - * `ObjectTree.tsx:235-256` records the three measurements that retired it. + * `ObjectTree.tsx:240-261` records the three measurements that retired it. * The flatten half above is what keeps the key in this set; ⛔ do not restore * the renderer half from this record's history. */ @@ -8054,7 +8157,19 @@ 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` = `0abd4f9f8`, re-read there 2026-10-05: + * — `.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * `plugin-tree/src/index.tsx` and `core/src/utils/record-source.ts` are + * byte-identical to `0abd4f9f8` (`git diff --quiet`), so their anchors held + * unmoved; `ObjectTree.tsx` changed (+81/-3, objectui#11686: a tree cell draws + * the same field face a list cell does), none of it on a cited line, so every + * anchor in it MOVED with its cited text byte-identical — by 5 above the cell + * helpers (`:284-297` -> `:289-302`, `:285` -> `:290`), by 77 past them (`:637` + * -> `:714`, `:742` -> `:819`, `:833-845` -> `:910-922`, `:842` / `:843` -> + * `:919` / `:920`, `:868` -> `:945`, `:918-927` -> `:995-1004`, `:926` -> + * `:1003`, `:961-962` -> `:1038-1039`, `:1029` -> `:1106`) and by 78 past one + * more line (`:1049` -> `:1127`, `:1057` -> `:1135`, `:1071` -> `:1149`, + * `:1143` -> `:1221`) — and each is cited below at this pin. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`, re-measured there 2026-10-05: @@ -8128,7 +8243,7 @@ const OBJECT_TREE_FLAT_CONFIG_GUIDANCE: readonly KeySetGuidance[] = [ * one was re-derived from that tree, and the ladder call changed in CONTENT * as well as position.) * Read points per key: `data` (`resolveRecordSourceConfig` at - * `:637` — rung 1, `core/src/utils/record-source.ts:307`, which returns the + * `:714` — rung 1, `core/src/utils/record-source.ts:307`, which returns the * authored value VERBATIM once it is on the arm; that ONE site is the whole * support for the arm this row declares. ⚠️ At this pin the ARM this renderer * passes is `'view-data'`, the one its siblings pass (objectui#8348), so a @@ -8137,18 +8252,18 @@ const OBJECT_TREE_FLAT_CONFIG_GUIDANCE: readonly KeySetGuidance[] = [ * same line. Through `db11afd49` it passed `'undeclared'`, which honoured any * truthy value — WIDER than this row, the harmless direction), * `staticData` (rung 2, - * `record-source.ts:311`), `objectName` (rung 3; also `:1029`, `:1071` and - * `:1143` here, each behind `resolveRecordSourceObjectName`, plus the - * parent-field detection at `:961-962`), - * `filter` (`:742`, read once through `useResolvedFilter`, which resolves its - * context tokens — objectui#10666 — and holds the result: `:834` sends it to - * `$filter` on the object fetch and `:919` on the inline `value` provider's + * `record-source.ts:311`), `objectName` (rung 3; also `:1106`, `:1149` and + * `:1221` here, each behind `resolveRecordSourceObjectName`, plus the + * parent-field detection at `:1038-1039`), + * `filter` (`:819`, read once through `useResolvedFilter`, which resolves its + * context tokens — objectui#10666 — and holds the result: `:911` sends it to + * `$filter` on the object fetch and `:996` on the inline `value` provider's * `ValueDataSource` query, objectui#9136's; at `f8a9d0fb0` both sent - * `schema.filter` verbatim, at `:753` and `:837`), `tree` (`:285`, the - * nested config block `getTreeConfig` (`:284-297`) reads, and the + * `schema.filter` verbatim, at `:753` and `:837`), `tree` (`:290`, the + * nested config block `getTreeConfig` (`:289-302`) reads, and the * registration's declared `{ name: 'tree', type: 'object' }` input - * (`plugin-tree/src/index.tsx:47-52`)) and `navigation` (`:1057`, handed to - * `useNavigationOverlay` at `:1049` — typed since objectui#11168 slice 3; + * (`plugin-tree/src/index.tsx:47-52`)) and `navigation` (`:1135`, handed to + * `useNavigationOverlay` at `:1127` — typed since objectui#11168 slice 3; * through `31971ff1e` it was `(schema as any).navigation`, at `:1063`). * * ⚠️ `data` IS declared here, and that is the measurement, not a family @@ -8165,31 +8280,31 @@ const OBJECT_TREE_FLAT_CONFIG_GUIDANCE: readonly KeySetGuidance[] = [ * `NavigationConfig`) beside `filter`, and makes `objectName` optional, on * `ObjectTreeSchema` and on the registration's inputs alike. * - * ⛔ `:868` is NOT a second site for the object arm, and at this pin it is not + * ⛔ `:945` is NOT a second site for the object arm, and at this pin it is not * a read of the authored key at all: it is `(rest as any).data`, gated by * `Array.isArray(passed)` on the next line — the rows a HOST hands down as the * `data` React prop. objectui#8348 dropped the `?? schema.data` fallback that * line carried through `db11afd49` (`:862` there), the one reader that let an * authored bare array draw rows whatever the ladder said, and objectui#9571 * had already stopped `SchemaRenderer` delivering the authored key as that - * prop. One ladder site is sufficient, and `:637` is it. + * prop. One ladder site is sufficient, and `:714` is it. * * Measured and deliberately NOT declared: the flat `TreeConfig` spellings * ({@link OBJECT_TREE_FLAT_CONFIG_GUIDANCE}); the bare-array `data` shorthand, * which `ViewData` cannot publish (a discriminated union over OBJECT variants), * for which `staticData` is this block's declared door, and which the renderer - * itself no longer accepts from an authored node at this pin (see `:868` + * itself no longer accepts from an authored node at this pin (see `:945` * above; `:862-863` accepted it through `db11afd49`); `sort` — this renderer's fetch - * (`:833-845`) carries `$filter`, `$top` and `$expand` and NO `$orderby`, the - * inline query (`:918-927`) carries `$filter` and `$top` only, and + * (`:910-922`) carries `$filter`, `$top` and `$expand` and NO `$orderby`, the + * inline query (`:995-1004`) carries `$filter` and `$top` only, and * nothing else reads an order, so declaring one would publish a key with no read * site; a row cap, for the same reason `object-gantt` declares none (the `$top` * is the platform ceiling, spread in as core's `nonGridRowCeilingQuery()` at - * `:843` and again at `:926` — a bare `$top: NON_GRID_ROW_CEILING_TOP` at + * `:920` and again at `:1003` — a bare `$top: NON_GRID_ROW_CEILING_TOP` at * `f8a9d0fb0`, until objectui#7508 — marked "⛔ Not - * authorable" at `:842`); and `filter.tree`, the legacy stash — ⚠️ no longer + * authorable" at `:919`); and `filter.tree`, the legacy stash — ⚠️ no longer * read since `f8a9d0fb0`: objectui#9549 deleted that arm, so `getTreeConfig` - * (`:285`) takes the block from `tree` alone — which was a shape to stop + * (`:290`) takes the block from `tree` alone — which was a shape to stop * writing and is not a key to declare. * * This was also the one block of the three whose type was absent from the @@ -8226,7 +8341,12 @@ export const ObjectTreePropsSchema = lazySchema(() => strictObject({ * holds for them because each registers through `ElementDataSourceGate`, * which lowers the spec binding onto `objectName` before the renderer sees * the node. `plugin-tree/src/index.tsx` does NOT: at the pin this repo - * builds against (`.objectui-sha` = `0abd4f9f8`, re-read there 2026-10-05: + * builds against (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * re-COUNTED by the same method, all five `src/index.tsx` shells are + * byte-identical across the hop from `0abd4f9f8` (`git diff --quiet`) and + * read 0 for the tree, 3 each for `plugin-calendar`, `plugin-gantt` and + * `plugin-grid`, and 4 for `plugin-map`. + * At `0abd4f9f8`, re-read there 2026-10-05: * re-COUNTED by the same method, all five `src/index.tsx` shells are * byte-identical across the hop from `9dfaca654` (`git diff --quiet`) and * read 0 for the tree, 3 each for `plugin-calendar`, `plugin-gantt` and @@ -8603,7 +8723,19 @@ 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` = `0abd4f9f8`, re-read there 2026-10-05: + * repo builds against (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * `renderer.tsx` and `index.tsx` are byte-identical to `0abd4f9f8` (`git diff + * --quiet`), so their anchors held unmoved; `ObjectTimeline.tsx` changed + * (+39/-9: objectui#11675 starts the date buckets' week on the display locale's + * first day, and objectui#11676 heads a past date "Earlier" and retires the + * `timeline.bucket.overdue` read) without touching a cited line, so every + * anchor in it MOVED with its cited text byte-identical — by 1 below the import + * it gained (`:29` -> `:30` through `:544` -> `:545`), by 4 past the + * display-locale read (`:551` -> `:555` through `:602` -> `:606`) and by 30 + * past the bucket rewrite (`:791` -> `:821` through `:992-993` -> `:1022-1023`) + * — and each is cited below at this pin. The `schema.*` read set of all three + * is unchanged. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved). * At `9dfaca654`, re-measured there @@ -8697,32 +8829,32 @@ function objectTimelineItemsFitVariant() { * directions: nothing accepted a real key and nothing refused a typo. * * Read points per key, in `ObjectTimeline.tsx` unless named otherwise: - * `objectName` (`:297` the fetch gate, `:377-380` the object-def load through - * `useSettledSchema`, `:415` the `fetchesForItself` gate — the check that + * `objectName` (`:298` the fetch gate, `:378-381` the object-def load through + * `useSettledSchema`, `:416` the `fetchesForItself` gate — the check that * sat inside the fetch effect at `:420` is hoisted to render scope at this - * pin, where `:416` also subscribes the invalidation bus on it - * (objectui#10623) and the effect reads it at `:520` — `:422` / `:480` + * pin, where `:417` also subscribes the invalidation bus on it + * (objectui#10623) and the effect reads it at `:521` — `:423` / `:481` * inside the fetch effect, - * `:791` the pull-to-refresh gate, `:602` the entry composition and `:804` - * the navigation binding), `timeline` (`:314`, + * `:821` the pull-to-refresh gate, `:606` the entry composition and `:834` + * the navigation binding), `timeline` (`:315`, * the canonical nested config every field resolution prefers), `filter` - * (`:403`, read once through `useResolvedFilter`, which resolves its context - * tokens — objectui#10666 — and holds the result; `:404` keys the fetch on - * it and `:481` sends it to `$filter`, where `f8a9d0fb0` sent `schema.filter` - * verbatim at `:341` / `:405`), `sort` (`:405`, `:482` — through + * (`:404`, read once through `useResolvedFilter`, which resolves its context + * tokens — objectui#10666 — and holds the result; `:405` keys the fetch on + * it and `:482` sends it to `$filter`, where `f8a9d0fb0` sent `schema.filter` + * verbatim at `:341` / `:405`), `sort` (`:406`, `:483` — through * the shared `convertSortToQueryParams` sink, as `object-calendar`'s does), - * `limit` (`:483`, the fetch's one top-level `$top`, through + * `limit` (`:484`, the fetch's one top-level `$top`, through * `resolveRowLimit(schema.limit, DEFAULT_TIMELINE_LIMIT)` with the default - * `100` at `:29` and the refused-cap diagnostic at `:331`), `items` (`:295`, `:415`, `:587`, - * `:820` — the authored pass-through that short-circuits the object query), - * `data` (`:296`, `:415`, `:542`, `:544` — the pre-fetched record source, + * `100` at `:30` and the refused-cap diagnostic at `:332`), `items` (`:296`, `:416`, `:591`, + * `:850` — the authored pass-through that short-circuits the object query), + * `data` (`:297`, `:416`, `:543`, `:545` — 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` (`:578`), `mapping` (`:551`, `:576`, `:578`, `:579`), - * `variant` (`:858`) and `navigation` (`:802-805` → `:937` → `:992-993`). + * `descriptionField` (`:582`), `mapping` (`:555`, `:580`, `:582`, `:583`), + * `variant` (`:888`) and `navigation` (`:832-835` → `:967` → `:1022-1023`). * Four more are read by the presentational renderer off the schema this - * component spreads into it (`effectiveSchema`, `:921-940`): `dateFormat` + * component spreads into it (`effectiveSchema`, `:951-970`): `dateFormat` * (`plugin-timeline/src/renderer.tsx:1569`, 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 @@ -8737,8 +8869,8 @@ function objectTimelineItemsFitVariant() { * ({@link OBJECT_TIMELINE_FLAT_CONFIG_GUIDANCE}) — the runtime handoff * `ListView` emits, not a second authoring spelling; * - `bind` — the objectui data-scope key the section header above rules out - * for every block in this family (`:335` here); - * - `className` (`:924`) — a node-level key on `PageComponentSchema`, not a + * for every block in this family (`:336` here); + * - `className` (`:954`) — a node-level key on `PageComponentSchema`, not a * per-block prop; * - `onItemClick` / `onRowClick` — host callbacks JSON cannot carry. * @@ -8760,8 +8892,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:858-860`: - * `:858` gates on `!hasAuthoredItems && schema.variant === 'gantt'` and `:860` + * `ObjectTimeline.tsx:888-890`: + * `:888` gates on `!hasAuthoredItems && schema.variant === 'gantt'` and `:890` * 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 @@ -8813,7 +8945,16 @@ 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` = - * `0abd4f9f8`, re-read there 2026-10-05: + * `a58626c88`, re-read there 2026-10-06: + * `record-source.ts` and `SchemaRenderer.tsx` are byte-identical across the + * hop from `0abd4f9f8` (`git diff --quiet`), so the prop channel above still + * carries the key; the file changed (+39/-9: objectui#11675's locale week + * start and objectui#11676's "Earlier" bucket) away from these reads, so + * every anchor MOVED with its cited read byte-identical, by 1 above the + * display-locale read and by 4 below it: `:296` -> `:297`, `:415` -> `:416`, + * `:520` -> `:521`, `:542` -> `:543`, `:544` -> `:545`, `:663-664` -> + * `:667-668`, `:694` -> `:698`. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`, re-measured there 2026-10-05 — the file and @@ -8876,13 +9017,13 @@ export const ObjectTimelinePropsSchema = lazySchema(() => strictObject({ * `recordDisplayValueAt` (`:653`, objectui#10530), not `item[titleField]`. * At `f8a9d0fb0` the file was byte-identical to `62597c588` and * `87af769e9`, where they were re-READ 2026-09-22), all in - * `ObjectTimeline.tsx`: `:296` seeds the loading state off it, `:415` + * `ObjectTimeline.tsx`: `:297` seeds the loading state off it, `:416` * SKIPS the object query when it is present (the gate the effect reads at - * `:520`), `:542` tracks it, and `:544` + * `:521`), `:543` tracks it, and `:545` * is the row source itself — `(props as any).data || boundData || * fetchedData`, so it wins over both the data-scope binding and the fetch. * Unlike `items` one line down, these rows are RECORDS: they go through the - * same `timeline` field bindings a fetched row takes (`:663-664`, `:694`). + * same `timeline` field bindings a fetched row takes (`:667-668`, `:698`). */ data: z.array(z.unknown()).optional() .describe("Pre-fetched records — read FIRST as the rail's row source, ahead of the data-scope binding and the fetch, and composed into entries through the same `timeline` field bindings a fetched row takes; authoring it suppresses the object query entirely. Distinct from `items`, which is the already-composed entry shape and wins over this key when both are written"), @@ -9104,7 +9245,10 @@ export const ComponentPropsMap = { // set from this map's keys), on the three-part evidence that vocabulary's // string-arm ledger asks of a type admitted without an enum member — all // measured at the pin this repo builds against (`.objectui-sha` = - // `0abd4f9f8`, re-read there 2026-10-05: + // `a58626c88`, re-read there 2026-10-06: + // every objectui file this record cites is byte-identical across the hop from + // `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved. + // At `0abd4f9f8`, re-read there 2026-10-05: // every objectui file this record cites is byte-identical across the hop from // `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. // At `9dfaca654`; re-measured there 2026-10-05: all four files below are @@ -9173,7 +9317,13 @@ 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` = - // `0abd4f9f8`, re-read there 2026-10-05: + // `a58626c88`, re-read there 2026-10-06: + // `ObjectMap.tsx` and `ObjectGantt.tsx` are byte-identical to `0abd4f9f8` + // (`git diff --quiet`); `ObjectTree.tsx` (+81/-3) changed for objectui#11686 + // (a tree cell draws the same field face a list cell does) and was re-READ: + // its anchors MOVED byte-identical and its `schema.*` read set is unchanged, + // so no declared key set moved and no read point died. + // At `0abd4f9f8`, re-read there 2026-10-05: // every objectui file this record cites is byte-identical across the hop from // `9dfaca654` (`git diff --quiet`), so every anchor held unmoved). // At `9dfaca654`, all three re-measured there 2026-10-05 (`ObjectMap.tsx` is @@ -9235,7 +9385,13 @@ 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` = - // `0abd4f9f8`, re-read there 2026-10-05: + // `a58626c88`, re-read there 2026-10-06: + // `renderer.tsx` and `index.tsx` are byte-identical to `0abd4f9f8` (`git diff + // --quiet`); `ObjectTimeline.tsx` changed for objectui#11675 and + // objectui#11676 (the date buckets' locale week start and the "Earlier" + // bucket) and was re-READ: every anchor moved with its text byte-identical, + // the `schema.*` read set is unchanged, and no declared key set moved. + // At `0abd4f9f8`, re-read there 2026-10-05: // every objectui file this record cites is byte-identical across the hop from // `9dfaca654` (`git diff --quiet`), so every anchor held unmoved). // At `9dfaca654`, re-measured there 2026-10-05 (`renderer.tsx`, diff --git a/packages/spec/src/ui/dataset.zod.ts b/packages/spec/src/ui/dataset.zod.ts index 0e918f381e3..97e73ddfb36 100644 --- a/packages/spec/src/ui/dataset.zod.ts +++ b/packages/spec/src/ui/dataset.zod.ts @@ -283,7 +283,10 @@ export const DatasetMeasureSchema = lazySchema(() => strictObject({ * and this docblock and the `describe` beneath it both said so. * * Measured at the pin this repo builds against (`.objectui-sha` = - * `0abd4f9f8`, re-read there 2026-10-05: + * `a58626c88`, re-read there 2026-10-06: + * every objectui file this record cites is byte-identical across the hop from + * `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`; re-derived at that pin 2026-10-05 — `date-display.ts` and diff --git a/packages/spec/src/ui/view.zod.ts b/packages/spec/src/ui/view.zod.ts index ea90284bb05..822880f5e3e 100644 --- a/packages/spec/src/ui/view.zod.ts +++ b/packages/spec/src/ui/view.zod.ts @@ -3279,7 +3279,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` = `0abd4f9f8`, re-read there 2026-10-05: + * (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06: + * `autoLayout.ts` and `fields`' `field-type-alias.ts` are byte-identical to + * `0abd4f9f8` (`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 — 147 insertions, 1 deletion: + * objectui#11631, a dependent lookup clearing when its `dependsOn` parent + * changes or clears — none of it inside `spanLadderFor`, still `:204-231` + * byte-identical, and its one call site moved `:2986` -> `:3132` with the + * call byte-identical, so it still emits the ladder. + * At `0abd4f9f8`, re-read there 2026-10-05: * every objectui file this record cites is byte-identical across the hop from * `9dfaca654` (`git diff --quiet`), so every anchor held unmoved. * At `9dfaca654`, re-read 2026-10-05: `autoLayout.ts`, @@ -3334,7 +3343,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` = `0abd4f9f8769`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest."), + 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` = `a58626c88dc8`), 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 61ffca722b2..dc0b782c67c 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": "0abd4f9f8769fc4c19ad2f96707684876f74c09f", + "objectuiSha": "a58626c88dc85954bd0af24f16ebb69454c03eee", "source": "built-tree", - "modulesRoot": ".cache/objectui-0abd4f9f8769/apps/console", + "modulesRoot": ".cache/objectui-a58626c88dc8/apps/console", "objectuiWorkspaceVersion": "17.7.0", "generator": "scripts/gen-sdui-manifest-node.mjs", - "generatedAt": "2026-10-05", - "sha256": "f95d406a584eb89c3a31e502556d2dcf7bd3c9f12be6d5455b40112e072bebc7", + "generatedAt": "2026-10-06", + "sha256": "e0654735a318ef5ad51332b32984a0e200c37fa753097dfd8f1d6d338fca11f1", "components": 107 } diff --git a/sdui.manifest.json b/sdui.manifest.json index 4b3d7837d26..e93b552a590 100644 --- a/sdui.manifest.json +++ b/sdui.manifest.json @@ -1402,7 +1402,7 @@ "name": "sections", "type": "array", "of": "object", - "description": "Field groups rendered as the detail body, in order. Every entry is an OBJECT — `{ name?, label?, columns?, fields }` — a bare section-id string is NOT accepted (the spec retired that spelling in objectstack#5611, and the renderer reads name/label/fields off each entry, so a string entry renders no fields at all). `fields` are the field names shown in this section, in order — required unless `group` supplies the members instead (the spec refuses a section carrying neither, and refuses one carrying both). `label` is the section heading; omit it for an untitled, borderless section. `name` is a stable snake_case identifier and the i18n anchor — the heading resolves through objects.._sections..label, so a section without a name shows its authored label in every locale. `columns` (1-4) is THIS section's field-grid width; omit it and the renderer derives the width. Authoring `sections` at all makes it the only source of the detail body; omit it and the body falls back to the object's highlightFields. @objectstack/spec 17.3.0 declares eight more member keys on an entry, and this renderer honours all eight: `icon` (a Lucide name on the section header), `description` (sub-heading copy under the heading), `collapsible` and `defaultCollapsed` (a foldable section and its initial state), `showBorder` (force the Card wrapper on or off, overriding the heading-derived default) and `headerColor` (a header tint from the shared palette) through DetailSection, plus `group` — the ADR-0085 §5 REFERENCE form, the alternative to enumerating `fields`. `{ group: 'contact_info' }` inherits the object's `fieldGroups` entry with that key: its members (every visible field pointing at it, in declaration order) and its presentation (label, icon, description, collapse) all come from the group, so the section restates none of it and the spec refuses those keys beside `group`; `columns`, `showBorder` and `headerColor` stay yours because they are how THIS page lays the section out. A `group` naming no declared group renders nothing and is reported to the console (`@objectstack/lint` flags it as `page-section-group-unknown`). `hideEmpty` is the eighth, and it decides whether an ALL-empty section exists: it defaults to on, so a section whose fields are every one of them empty renders nothing at all — no heading, no skeleton — and `hideEmpty: false` is the spelling that keeps that heading and its label skeleton on a brand-new record. It decides ONLY the all-empty case; the empty rows of a section that still has a filled one belong to DetailSection's auto-hide heuristic plus the reader's show-empty toggle, which no authored value overrides in either polarity (objectui#7129 Q2-C), and inline-edit mode renders the section either way so its fields stay reachable. Restored under objectui#8603 (maintainer 2026-09-15) after objectui#7129 retired it on the premise, since falsified upstream, that the spec refused the key. None of the eight has a designer control yet; they are authorable in source mode only, tracked as a deferred feature." + "description": "Field groups rendered as the detail body, in order. Every entry is an OBJECT — `{ name?, label?, columns?, fields }` — a bare section-id string is NOT accepted (the spec retired that spelling in objectstack#5611, and the renderer reads name/label/fields off each entry, so a string entry renders no fields at all). `fields` are the field names shown in this section, in order — required unless `group` supplies the members instead (the spec refuses a section carrying neither, and refuses one carrying both). `label` is the section heading; omit it for an untitled, borderless section. `name` is a stable snake_case identifier and the i18n anchor — the heading resolves through objects.._sections..label, so a section without a name shows its authored label in every locale. `columns` (1-4) is THIS section's field-grid width; omit it and the renderer derives the width. Authoring `sections` at all makes it the only source of the detail body; omit it and the body falls back to the object's highlightFields. @objectstack/spec 17.3.0 declares eight more member keys on an entry, and this renderer honours all eight: `icon` (a Lucide name on the section header), `description` (sub-heading copy under the heading), `collapsible` and `defaultCollapsed` (a foldable section and its initial state), `showBorder` (force the Card wrapper on or off, overriding the heading-derived default) and `headerColor` (a header tint from the shared palette) through DetailSection, plus `group` — the ADR-0085 §5 REFERENCE form, the alternative to enumerating `fields`. `{ group: 'contact_info' }` inherits the object's `fieldGroups` entry with that key: its members (every visible field pointing at it, in declaration order), its presentation (label, icon, description, collapse) and its `visibleWhen` all come from the group, so the section restates none of it — the predicate is evaluated against the bound record exactly as the entry form evaluates it, and a group it hides renders nothing (a `visibleWhen` written on a section itself is refused by the spec and not read: gate the group and reference it) and the spec refuses those keys beside `group`; `columns`, `showBorder` and `headerColor` stay yours because they are how THIS page lays the section out. A `group` naming no declared group renders nothing and is reported to the console (`@objectstack/lint` flags it as `page-section-group-unknown`). `hideEmpty` is the eighth, and it decides whether an ALL-empty section exists: it defaults to on, so a section whose fields are every one of them empty renders nothing at all — no heading, no skeleton — and `hideEmpty: false` is the spelling that keeps that heading and its label skeleton on a brand-new record. It decides ONLY the all-empty case; the empty rows of a section that still has a filled one belong to DetailSection's auto-hide heuristic plus the reader's show-empty toggle, which no authored value overrides in either polarity (objectui#7129 Q2-C), and inline-edit mode renders the section either way so its fields stay reachable. Restored under objectui#8603 (maintainer 2026-09-15) after objectui#7129 retired it on the premise, since falsified upstream, that the spec refused the key. None of the eight has a designer control yet; they are authorable in source mode only, tracked as a deferred feature." }, { "name": "fields",