diff --git a/.changeset/console-7578323a544e.md b/.changeset/console-7578323a544e.md new file mode 100644 index 00000000000..64848cbcd42 --- /dev/null +++ b/.changeset/console-7578323a544e.md @@ -0,0 +1,87 @@ +--- +"@objectstack/console": minor +--- + +Console (objectui) refreshed to `7578323a544e`. Frontend changes in this range: + +Derived from the changesets objectui declared over the range — 29 releasing of 31 changesets added across 25 non-merge commits; omitted: 2 release-nothing changesets, 2 commits carrying no changeset (they ship no package code). + +- **minor** — **BREAKING** — A page route's breadcrumb no longer carries a 「Pages」 crumb (objectui#12198, executing the maintainer's ruling on objectstack-ai/cloud#2768). **BREAKING** for `@object-ui/i18n`: t… (objectui `7578323a5`) +- **minor** — A flow action whose run pauses for input now closes with the action's own `successMessage` (objectui#12234). (objectui `360cf3215`) +- **minor** — **BREAKING** — A dashboard widget's legacy `component` envelope takes a `metric-card` node only, and refuses every other node by name with the fix, on both zod faces and on the TypeScript type (… (objectui `6fb281d64`) +- **minor** — `BaseFieldMetadata` declares a field's help text as `inlineHelpText`, typed by reference to `@objectstack/spec`'s `FieldSchema.inlineHelpText`, and no longer declares `help` (obje… (objectui `923504f4a`) +- **minor** — A record whose `approval_status` reads `pending` no longer opens locked when the approvals read answered and found no request (objectui#12220). (objectui `5c2982adf`) +- **minor** — **BREAKING** — A free-plan organization's environment list no longer offers a primary button that opens a paywall dialog (objectui#12190). The maintainer's rule is that no primary button opens a… (objectui `fa778e67f`) +- **minor** — A `type: 'url'` action or an `element:button` whose target is `mailto:` now opens the mail client, where it used to fail at click (objectui#12191, the objectui half of ruling A+;… (objectui `334f0cff9`) +- **minor** — Console: the app's identity moves into the top bar (objectui#12201, the maintainer's ruling of 2026-10-12). (objectui `38bb37333`) +- **minor** — The `lookup` widget reads `@objectstack/spec`'s `allowCreate`, `lookupColumns` and `lookupPageSize` alone. Their snake_case twins are retired, with no alias (objectui#12157). (objectui `466a219eb`) +- **minor** — `LookupFieldMetadata` declares the lookup picker's `allowCreate`, `lookupColumns` and `lookupPageSize` in `@objectstack/spec`'s spelling, each typed by reference to the spec's `Fi… (objectui `466a219eb`) +- **minor** — Every built-in locale pack gains one key, `form.maxFileSize` (objectui#12156). It is the size-limit hint the flat `ObjectForm` appends to the description of a `file` or `image` fi… (objectui `b2316074a`) +- **minor** — **BREAKING** — A `file` or `image` field's size limit is now `maxSize`, the one spelling the widgets read and the spec accepts (objectui#12156). (objectui `b2316074a`) +- **minor** — **BREAKING** — The console boot screen says one honest line, and shows no English before the user's locale (objectui#12187, the first of its three fixes). (objectui `54159d329`) +- **patch** — The console builds again on a case-insensitive filesystem, which is macOS's default (objectui#12184). Two modules in the console's settings pages, the workspace-timezone prompt di… (objectui `08b5d97d1`) +- **patch** — A field-backed action param's help line reads the field's `inlineHelpText`, in the order the record form reads it (objectui#12213). (objectui `923504f4a`) +- **patch** — The record form draws a field's `inlineHelpText` under its control (objectui#12213). (objectui `923504f4a`) +- **patch** — Lookup links on a record page and on a custom page now carry the console's base path, so the same link works from a left click, a new tab, a middle-click and a copied link (object… (objectui `97e7d4edd`) +- **patch** — A console page load reads `sys_user_preference` once, not once per preference key (objectui#12187). (objectui `d48071e3d`) +- **patch** — The bell's Activity tab names each row's object by its label in the reader's language (objectui#12212). (objectui `fc1bc6664`) +- **patch** — An empty gallery draws the same empty state as an empty grid, translated, instead of "No items to display" in English (objectui#12217). (objectui `f5b66bf97`) +- **patch** — The lifecycle badge (`ManagedByBadge`) draws only for a caller who can author metadata (objectui#12194). An end user sees it nowhere: not on the record page, the object list heade… (objectui `f38a42827`) +- **patch** — A console page route stops loading the Studio's designers, the interface list and one file per icon before its content (objectui#12187). (objectui `6eca5b5a7`) +- **patch** — The `position-ref` grant picker no longer offers the `everyone` and `guest` audience anchors (objectui#12200). Every authenticated or anonymous principal holds an anchor implicitl… (objectui `a491b64a6`) +- **patch** — A record's Edit form saves the owner the user changes or clears (objectui#12205). The form dropped `owner_id` from every save, so a reassignment or a clear made in the Edit dialog… (objectui `6c437b07e`) +- **patch** — Two producers hand the `lookup` widget `@objectstack/spec`'s spellings, moving with the widget's own retirement of the snake_case reads (objectui#12157): (objectui `466a219eb`) +- **patch** — The detail view's inline-edit field enrichment no longer copies `allow_create`, `lookup_columns` or `lookup_page_size` off the object schema. The lookup picker reads `allowCreate`… (objectui `466a219eb`) +- **patch** — The internal ledger behind `ObjectGrid`'s relational copy set drops its `allow_create`, `lookup_columns` and `lookup_page_size` rows, because `LookupField` no longer reads those s… (objectui `466a219eb`) +- **patch** — An inline edit of a date-only field on a record page saves the day the user picked, in every timezone (objectui#12206). (objectui `803f678b3`) +- **patch** — The flat `ObjectForm`'s file-size hint now reads the spec's `maxSize`, and it is shown in the session language (objectui#12156). (objectui `b2316074a`) + +⚠️ 5 of these carry a breaking change: 5 by the author's own breaking annotation in the changeset body — objectui declares no `major` inside a launch window (`scripts/check-changeset-no-major.mjs`). Each is marked **BREAKING** in the list above — read them before compiling the release record. + +**In this console build, declared nowhere** — objectui merged 2 commits in this range with no `.changeset/*.md`. The code is inside the pin above and ships here, but nothing upstream declared them, so they appear in no objectui CHANGELOG and in no entry above. Listed by subject rather than counted, because a count cannot tell a dependency bump from a form-behaviour change (objectstack#6174); the upstream gate that would prevent this is objectui#3387. + +- _(no changeset)_ ci: Spec Main Shape Gate leaves the required set — advisory on PRs, hourly on main; the required-check pin declares the seven ruled names (objectui#12240) (#12250) (objectui `5039e8117`) +- _(no changeset)_ ci: two-speed CI — affected tests on PR and queue runs, full suite and coverage on main's push and hourly schedule, spec gate reuse by objectstack sha, fifteen gate workflows fold… (objectui `21fdeb34d`) + +Clause-②: no + + + +objectui range: `9646e2ed2bf3...7578323a544e` diff --git a/.changeset/objectui-pin-citations-7578323a544e.md b/.changeset/objectui-pin-citations-7578323a544e.md new file mode 100644 index 00000000000..74709155402 --- /dev/null +++ b/.changeset/objectui-pin-citations-7578323a544e.md @@ -0,0 +1,19 @@ +--- +'@objectstack/spec': patch +--- + +The spec's objectui citations, and the shipped description text that names the `.objectui-sha` pin (the `FormField.span` describe and six migration-entry descriptions), are re-measured against the new console pin, objectui `7578323a544e`. + +Clause-②: no + +Every anchor was mapped through the objectui diff `9646e2ed2bf3..7578323a544e`: 288 paths over 25 commits. Three files that records cite changed on the hop, and every cited line in them held its text; where it moved, it moved byte-identical and is re-pointed: + +- `plugin-list/src/ListView.tsx` (+34/-79, objectui#12217, objectui `f5b66bf97`: an empty gallery draws the grid empty state). One import line was added at `:16` and a four-line docblock near `:1040`; the other hunks change lines in place (`:10`, `:12`, `:1044`) or sit at `:5677` and below. So `resolveListMapConfig` moved `:209` -> `:210`, `FLAT_MAP_CONFIG_SPELLING` `:95` -> `:96` and `resolveTimelineDateBinding` `695` -> `696`. The `kanban` / `calendar` / `timeline` / `gantt` / `map` / `tree` arms moved by five, to `3767` / `3818` / `3907` / `3964` / `4084` / `4125-4149`. The functional-completeness `calendar`, `gantt`, `timeline` and `map` rows, the `object-gantt` and flat-`TreeConfig` records and the map-config record say so, and the tree record's `4120-4144` and the map-config record's two quoted anchors are re-pointed. The `kanban` row-cap record names `ListView.tsx` and `ObjectView.tsx` only as an earlier re-read's record, and its sentence says so. +- `core/src/actions/ActionRunner.ts` (+39/-23, objectui#12191, objectui `334f0cff9`): eleven import lines were added above `composeSuccessMessage`, which moved `1498` -> `1509` with its body byte-identical, and every other hunk lies below it. The `outcomeMessages` record in `action.zod.ts` re-points its anchor, and it and the header of `action-outcome-messages.test.ts` say so. The four action renderers are byte-identical. +- The `en` / `zh` / `de` packs (five commits each): the `calendar.configRequired` strings did not change and moved `en.ts` `:949` -> `:953`, `zh.ts` `:725` -> `:726` and `de.ts` `:705` -> `:706`. + +Every other record cites only files that are byte-identical across the hop (`git diff --quiet`, checked file by file), and each gains a hop sentence that says so. That covers `form.tsx`, so `FormField.span: 'full'` still takes the whole row at every multi-column tier. + +The six migration entries' corpus counts were re-taken with `git grep -o -F`, the method that reproduces every `9646e2ed2bf3` number. The corpus is now 8600 tracked files, and every retired name each entry counts still reads 0. The lit controls moved with the corpus, for example `objectstack` from 18438 to 18552, `timeout` from 1707 to 1686 and `tenant` from 1393 to 1404. + +No key, default, enum member or export moves. diff --git a/.objectui-sha b/.objectui-sha index 3d3b3da63f8..7d1484dbbf3 100644 --- a/.objectui-sha +++ b/.objectui-sha @@ -1 +1 @@ -9646e2ed2bf315a6ae99b2a1633bc7c7d162f7b9 +7578323a544e31d574804ae931b595e8f9f92c21 diff --git a/content/docs/references/ui/view.mdx b/content/docs/references/ui/view.mdx index 2247abeb39a..2fd3724fcc0 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` = `9646e2ed2bf3`), 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` = `7578323a544e`), 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` = `9646e2ed2bf3`), 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` = `7578323a544e`), 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 30151918853..c902b92de71 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": "9646e2ed2bf315a6ae99b2a1633bc7c7d162f7b9", - "revDate": "2026-10-12T08:01:27+00:00", + "rev": "7578323a544e31d574804ae931b595e8f9f92c21", + "revDate": "2026-10-12T13:34:53+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": "9646e2ed2bf315a6ae99b2a1633bc7c7d162f7b9", + "recordedAgainstPin": "7578323a544e31d574804ae931b595e8f9f92c21", "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 97e7059ba42..43d326697af 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` = `9646e2ed2`, re-read there 2026-10-12: + // (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + // every objectui file this record cites is byte-identical across the hop from + // `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At + // `9646e2ed2`, re-read there 2026-10-12: // every objectui file this record cites is byte-identical across the hop from // `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At // `088e0f705`, re-read there 2026-10-12: diff --git a/packages/spec/src/kernel/functional-completeness.ts b/packages/spec/src/kernel/functional-completeness.ts index e5a182e6621..dc6ab1a5c5d 100644 --- a/packages/spec/src/kernel/functional-completeness.ts +++ b/packages/spec/src/kernel/functional-completeness.ts @@ -298,7 +298,20 @@ 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` = `9646e2ed2`, re-read there 2026-10-12: + * (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * on the hop off `9646e2ed2` `ObjectCalendar.tsx` is byte-identical (`git diff + * --quiet`), so `getCalendarConfig` `:311`, the `if (!calendarConfig)` arm + * `:1354` and its `tt(…)` lines `:1361-1362` did not move; the `en` / `zh` / + * `de` packs changed (the same five commits each: objectui#12198, + * objectui#12190, objectui#12156, objectui#12187 and objectui `38bb37333`'s + * top-bar app identity) but not their `calendar.configRequired` strings, which + * moved `en.ts` `:949` -> `:953`, `zh.ts` `:725` -> `:726` and `de.ts` `:705` + * -> `:706`; and `ListView.tsx` changed (+34/-79, objectui#12217, objectui + * `f5b66bf97`: two import lines changed in place at `:10` / `:12` and one added + * at `:16`, a four-line docblock added and `useListViewTranslation` exported + * near `:1040`, and the grid's inline empty state replaced by `ListEmptyState` + * from `:5677` down), so its `case 'calendar'` MOVED `3813` -> `3818`, + * byte-identical. At `9646e2ed2`, re-read there 2026-10-12: * on the hop off `088e0f705` `ObjectCalendar.tsx` and the `en` / `zh` / `de` * packs are byte-identical (`git diff --quiet`), so `getCalendarConfig` `:311`, * the `if (!calendarConfig)` arm `:1354` with its `tt(…)` lines `:1361-1362` @@ -448,7 +461,15 @@ 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` = `9646e2ed2`, re-read there 2026-10-12: + * this repo builds against (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * on the hop off `9646e2ed2` `ObjectGantt.tsx` is byte-identical (`git diff + * --quiet`), so `getGanttConfig` `:612` and the `if (!ganttConfig)` arm `:2330` + * did not move, and `ListView.tsx` changed (+34/-79, objectui#12217, objectui + * `f5b66bf97`: two import lines changed in place at `:10` / `:12` and one added + * at `:16`, a four-line docblock added and `useListViewTranslation` exported + * near `:1040`, and the grid's inline empty state replaced by `ListEmptyState` + * from `:5677` down), so its `case 'gantt'` MOVED `3959` -> `3964`, + * byte-identical. At `9646e2ed2`, re-read there 2026-10-12: * on the hop off `088e0f705` `ObjectGantt.tsx` is byte-identical (`git diff * --quiet`), so `getGanttConfig` `:612` and the `if (!ganttConfig)` arm `:2330` * did not move, and `ListView.tsx` changed (+9/-9, objectui#12189, objectui @@ -559,7 +580,17 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] { * requires. So the view does not draw a blank chart: it refuses, by name. * - `timeline` → date axis: NO fallback [#19630]; title: `titleField || 'name'`, * which still stands. Measured at the same pin (`.objectui-sha` = - * `9646e2ed2`, re-read there 2026-10-12: + * `7578323a5`, re-read there 2026-10-12: + * on the hop off `9646e2ed2` `ObjectTimeline.tsx` is byte-identical (`git diff + * --quiet`), so its start-date chain `:589-591` and its `if (!hasAuthoredItems + * && !startDateField)` refusal arm `:974` did not move, and `ListView.tsx` + * changed (+34/-79, objectui#12217, objectui `f5b66bf97`: two import lines + * changed in place at `:10` / `:12` and one added at `:16`, a four-line + * docblock added and `useListViewTranslation` exported near `:1040`, and the + * grid's inline empty state replaced by `ListEmptyState` from `:5677` down), so + * its `case 'timeline'` MOVED `3902` -> `3907` and `resolveTimelineDateBinding` + * `695` -> `696`, each byte-identical. At `9646e2ed2`, re-read there + * 2026-10-12: * on the hop off `088e0f705` `ObjectTimeline.tsx` is byte-identical (`git diff * --quiet`), so its start-date chain `:589-591` and its `if (!hasAuthoredItems * && !startDateField)` refusal arm `:974` did not move, and `ListView.tsx` @@ -668,7 +699,16 @@ 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` = `9646e2ed2`, re-read there 2026-10-12: + * pin (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * on the hop off `9646e2ed2` `ObjectMap.tsx` is byte-identical (`git diff + * --quiet`), so `getMapConfig` `:421`, `hasCoordinateBinding` `:527` and the + * refusal arm `:1337` did not move; and `ListView.tsx` changed (+34/-79, + * objectui#12217, objectui `f5b66bf97`: two import lines changed in place at + * `:10` / `:12` and one added at `:16`, a four-line docblock added and + * `useListViewTranslation` exported near `:1040`, and the grid's inline empty + * state replaced by `ListEmptyState` from `:5677` down), so its `case 'map'` + * MOVED `4079` -> `4084` and `resolveListMapConfig` `:209` -> `:210`, each + * byte-identical. At `9646e2ed2`, re-read there 2026-10-12: * on the hop off `088e0f705` `ObjectMap.tsx` is byte-identical (`git diff * --quiet`), so `getMapConfig` `:421`, `hasCoordinateBinding` `:527` and the * refusal arm `:1337` did not move; and `ListView.tsx` changed (+9/-9, 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 29f34b44892..744daf2a449 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` = `9646e2ed2bf315a6ae99b2a1633bc7c7d162f7b9` — names ' + + 'against, `.objectui-sha` = `7578323a544e31d574804ae931b595e8f9f92c21` — 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 8540 tracked files (0 across the 8519 at 088e0f705, the 8506 at e5311165a, the 8441 at 499799502, the 8424 at 0df67f237, the 8351 at 20c6d351a, the 8281 at 47b1f0bb7, the 8234 at f0268ad78, the 7754 at a58626c88, the 7650 at 0abd4f9f8, the 7632 at 9dfaca654, the 7579 at 2e818d0b5, the 10267 at ab1879721, the 10071 at 89cad75d5, the 9912 at 31971ff1e, the 9800 at e420df310, the 9546 at db11afd49, the 9283 at dd3f7e1be, the ' + + 'the string debounceDelay each occur 0 times across its 8600 tracked files (0 across the 8540 at 9646e2ed2, the 8519 at 088e0f705, the 8506 at e5311165a, the 8441 at 499799502, the 8424 at 0df67f237, the 8351 at 20c6d351a, the 8281 at 47b1f0bb7, the 8234 at f0268ad78, the 7754 at a58626c88, the 7650 at 0abd4f9f8, the 7632 at 9dfaca654, the 7579 at 2e818d0b5, the 10267 at ab1879721, the 10071 at 89cad75d5, the 9912 at 31971ff1e, the 9800 at e420df310, the 9546 at db11afd49, the 9283 at dd3f7e1be, the ' + '8512 at f8a9d0fb0 and the 8303 at 62597c588 too), against lit ' + 'controls objectstack 12966 and @objectstack/spec 4997 on the same corpus at 87af769e9, ' + 'which re-count to 13125 and 5043 respectively at 62597c588, to 13347 and 5123 at ' - + 'f8a9d0fb0, to 13745 and 5466 at dd3f7e1be, to 14704 and 5545 at db11afd49, to 15352 and 6024 at e420df310, to 15691 and 6206 at 31971ff1e, to 16044 and 6461 at 89cad75d5, to 16377 and 6665 at ab1879721, to 17227 and 7134 at 2e818d0b5, to 17313 and 7186 at 9dfaca654, to 17390 and 7209 at 0abd4f9f8, to 17468 and 7246 at a58626c88, to 17956 and 7522 at f0268ad78, to 17980 and 7523 at 47b1f0bb7, to 18047 and 7545 at 20c6d351a, to 18248 and 7582 at 0df67f237, to 18271 and 7587 at 499799502, to 18355 and 7599 at e5311165a, to 18400 and 7603 at 088e0f705 and to 18438 and 7612 at this pin (git grep -o -F, the method that reproduces ' + + 'f8a9d0fb0, to 13745 and 5466 at dd3f7e1be, to 14704 and 5545 at db11afd49, to 15352 and 6024 at e420df310, to 15691 and 6206 at 31971ff1e, to 16044 and 6461 at 89cad75d5, to 16377 and 6665 at ab1879721, to 17227 and 7134 at 2e818d0b5, to 17313 and 7186 at 9dfaca654, to 17390 and 7209 at 0abd4f9f8, to 17468 and 7246 at a58626c88, to 17956 and 7522 at f0268ad78, to 17980 and 7523 at 47b1f0bb7, to 18047 and 7545 at 20c6d351a, to 18248 and 7582 at 0df67f237, to 18271 and 7587 at 499799502, to 18355 and 7599 at e5311165a, to 18400 and 7603 at 088e0f705, to 18438 and 7612 at 9646e2ed2 and to 18552 and 7649 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 82917639063..48714fe1002 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,8 +46,8 @@ 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` = `9646e2ed2bf315a6ae99b2a1633bc7c7d162f7b9`, re-read from this tree — ' - + 'spells resourceLimits.timeout 0 times across 8540 tracked files, against lit controls timeout 1707, RuntimeConfig 357 and resourceLimits 2 on the same corpus (0 across 8519, and 1706 / 357 / 2, at 088e0f705; 0 across 8506, and 1706 / 357 / 2, at e5311165a; 0 across 8441, and 1704 / 352 / 2, at 499799502; 0 across 8424, and 1705 / 347 / 2, at 0df67f237; 0 across 8351, and 1694 / 337 / 2, at 20c6d351a; 0 across 8281, and 1674 / 337 / 2, at 47b1f0bb7; 0 across 8234, and 1658 / 337 / 2, at f0268ad78; 0 across 7754, and 1431 / 299 / 2, at a58626c88; 0 across 7650, and 1360 / 293 / 2, at 0abd4f9f8; 0 across 7632, and 1360 / 293 / 2, at 9dfaca654; 0 across 7579, and 1351 / 276 / 2, at 2e818d0b5; 0 across 10267, and 1348 / 273 / 2, at ab1879721; 0 across 10071, and 1331 / 273 / 2, at 89cad75d5; 0 across 9912, and 1303 / 273 / 2, at 31971ff1e; 0 across 9800, and 1293 / 273 / 2, at e420df310; 0 across 9546, and 1197 / 273 / 2, at db11afd49; 0 across 9283, and 1172 / 263 / 2, at dd3f7e1be; 0 across 8512, and 1096 / 245 / 2, at f8a9d0fb0; 0 across 8303, and ' + + '`.objectui-sha` = `7578323a544e31d574804ae931b595e8f9f92c21`, re-read from this tree — ' + + 'spells resourceLimits.timeout 0 times across 8600 tracked files, against lit controls timeout 1686, RuntimeConfig 357 and resourceLimits 2 on the same corpus (0 across 8540, and 1707 / 357 / 2, at 9646e2ed2; 0 across 8519, and 1706 / 357 / 2, at 088e0f705; 0 across 8506, and 1706 / 357 / 2, at e5311165a; 0 across 8441, and 1704 / 352 / 2, at 499799502; 0 across 8424, and 1705 / 347 / 2, at 0df67f237; 0 across 8351, and 1694 / 337 / 2, at 20c6d351a; 0 across 8281, and 1674 / 337 / 2, at 47b1f0bb7; 0 across 8234, and 1658 / 337 / 2, at f0268ad78; 0 across 7754, and 1431 / 299 / 2, at a58626c88; 0 across 7650, and 1360 / 293 / 2, at 0abd4f9f8; 0 across 7632, and 1360 / 293 / 2, at 9dfaca654; 0 across 7579, and 1351 / 276 / 2, at 2e818d0b5; 0 across 10267, and 1348 / 273 / 2, at ab1879721; 0 across 10071, and 1331 / 273 / 2, at 89cad75d5; 0 across 9912, and 1303 / 273 / 2, at 31971ff1e; 0 across 9800, and 1293 / 273 / 2, at e420df310; 0 across 9546, and 1197 / 273 / 2, at db11afd49; 0 across 9283, and 1172 / 263 / 2, at dd3f7e1be; 0 across 8512, and 1096 / 245 / 2, at f8a9d0fb0; 0 across 8303, and ' + '1086 / 240 / 2, at 62597c588); both resourceLimits hits are prose in packages/app-shell recording ' + 'that objectui\'s own AppShellRuntimeConfig shares not one key with the spec\'s ' + 'RuntimeConfig, so nothing there authors this key and no pin bump is owed. ADR-0087.', diff --git a/packages/spec/src/migrations/entries/semantic/18.logging-durations-unit-in-key.ts b/packages/spec/src/migrations/entries/semantic/18.logging-durations-unit-in-key.ts index dab6794398e..016ebd5edea 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,9 +47,9 @@ 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` = `9646e2ed2bf315a6ae99b2a1633bc7c7d162f7b9` — spells ' + + 'objectui checkout — `.objectui-sha` = `7578323a544e31d574804ae931b595e8f9f92c21` — spells ' + '`flushInterval` 0 times, `initialDelay` 0, `HttpDestinationConfig` 0 and `LoggingConfig` 0 ' - + 'across its 8540 tracked files, against lit controls `useState` 2662 and `timeout` 1707 on the same corpus (all four 0 across 8519, against 2661 and 1706, at 088e0f705, 0 across 8506, against 2659 and 1706, at e5311165a, 0 across 8441, against 2648 and 1704, at 499799502, 0 across 8424, against 2645 and 1705, at 0df67f237, 0 across 8351, against 2630 and 1694, at 20c6d351a, 0 across 8281, against 2630 and 1674, at 47b1f0bb7, 0 across 8234, against 2622 and 1658, at f0268ad78, 0 across 7754, against 2491 and 1431, at a58626c88, 0 across 7650, against 2478 and 1360, at 0abd4f9f8, 0 across 7632, against 2477 and 1360, at 9dfaca654, 0 across 7579, against 2477 and 1351, at 2e818d0b5, 0 across 10267, against 2476 and 1348, at ab1879721, 0 across 10071, against 2470 and 1331, at 89cad75d5, 0 across 9912, against 2469 and 1303, at 31971ff1e, 0 across 9800, against 2464 and 1293, at e420df310, 0 across 9546, against 2449 and 1197, at db11afd49, 0 across 9283, against 2435 and 1172, at dd3f7e1be, 0 across 8512, ' + + 'across its 8600 tracked files, against lit controls `useState` 2662 and `timeout` 1686 on the same corpus (all four 0 across 8540, against 2662 and 1707, at 9646e2ed2, 0 across 8519, against 2661 and 1706, at 088e0f705, 0 across 8506, against 2659 and 1706, at e5311165a, 0 across 8441, against 2648 and 1704, at 499799502, 0 across 8424, against 2645 and 1705, at 0df67f237, 0 across 8351, against 2630 and 1694, at 20c6d351a, 0 across 8281, against 2630 and 1674, at 47b1f0bb7, 0 across 8234, against 2622 and 1658, at f0268ad78, 0 across 7754, against 2491 and 1431, at a58626c88, 0 across 7650, against 2478 and 1360, at 0abd4f9f8, 0 across 7632, against 2477 and 1360, at 9dfaca654, 0 across 7579, against 2477 and 1351, at 2e818d0b5, 0 across 10267, against 2476 and 1348, at ab1879721, 0 across 10071, against 2470 and 1331, at 89cad75d5, 0 across 9912, against 2469 and 1303, at 31971ff1e, 0 across 9800, against 2464 and 1293, at e420df310, 0 across 9546, against 2449 and 1197, at db11afd49, 0 across 9283, against 2435 and 1172, at dd3f7e1be, 0 across 8512, ' + 'against 2391 and 1096, at f8a9d0fb0, and 0 across ' + '8303, against 2389 and 1086, at 62597c588).', acceptanceCriteria: diff --git a/packages/spec/src/migrations/entries/semantic/18.system-metrics-jsdoc-durations-unit-in-key.ts b/packages/spec/src/migrations/entries/semantic/18.system-metrics-jsdoc-durations-unit-in-key.ts index f2d6062f861..530d8241b97 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,8 +73,8 @@ 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` = `9646e2ed2bf315a6ae99b2a1633bc7c7d162f7b9`, re-read from this tree — ' - + 'spells all six metrics def names and both distinctive keys 0 times across 8540 tracked files at that sha, against lit controls window 4618, timeout 1707, period 251, interval 238 and metrics 456 on that same corpus and sha (0 across 8519, against 4615 / 1706 / 251 / 238 / 456, at 088e0f705, 0 across 8506, against 4614 / 1706 / 251 / 238 / 456, at e5311165a, 0 across 8441, against 4604 / ' + + '`.objectui-sha` = `7578323a544e31d574804ae931b595e8f9f92c21`, re-read from this tree — ' + + 'spells all six metrics def names and both distinctive keys 0 times across 8600 tracked files at that sha, against lit controls window 4647, timeout 1686, period 251, interval 238 and metrics 456 on that same corpus and sha (0 across 8540, against 4618 / 1707 / 251 / 238 / 456, at 9646e2ed2, 0 across 8519, against 4615 / 1706 / 251 / 238 / 456, at 088e0f705, 0 across 8506, against 4614 / 1706 / 251 / 238 / 456, at e5311165a, 0 across 8441, against 4604 / ' + '1704 / 251 / 238 / 456, at 499799502, 0 across 8424, against 4596 / ' + '1705 / 251 / 233 / 456, at 0df67f237, 0 across 8351, against 4470 / ' + '1694 / 249 / 213 / 456, at 20c6d351a, 0 across 8281, against 4449 / ' 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 b484f008079..7ddf64b3da7 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,10 +69,10 @@ 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` = `9646e2ed2bf315a6ae99b2a1633bc7c7d162f7b9` — names none of it: all 37 exports of ' - + 'tracing.zod.ts and each of the four key names occur 0 times across the 8540 files tracked at that sha (the 519 Span and 57 SpanSchema hits are objectui\'s own HTML ' + + 'pinned objectui checkout — `.objectui-sha` = `7578323a544e31d574804ae931b595e8f9f92c21` — names none of it: all 37 exports of ' + + 'tracing.zod.ts and each of the four key names occur 0 times across the 8600 files tracked at that sha (the 519 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: 18438 hits for the bare token objectstack, and 7612 for the package specifier @objectstack/spec (at 088e0f705: 0 across 8519, Span 519, 18400 and 7603; at e5311165a: 0 across 8506, Span 519, 18355 and 7599; at 499799502: 0 across 8441, Span 517, ' + + 'two lit controls on that same corpus and sha: 18552 hits for the bare token objectstack, and 7649 for the package specifier @objectstack/spec (at 9646e2ed2: 0 across 8540, Span 519, 18438 and 7612; at 088e0f705: 0 across 8519, Span 519, 18400 and 7603; at e5311165a: 0 across 8506, Span 519, 18355 and 7599; at 499799502: 0 across 8441, Span 517, ' + '18271 and 7587; at 0df67f237: 0 across 8424, Span 517, ' + '18248 and 7582; at 20c6d351a: 0 across 8351, Span 517, ' + '18047 and 7545; at 47b1f0bb7: 0 across 8281, Span 517, ' 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 94e967ebf05..199243217c4 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,7 +31,7 @@ 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` = `9646e2ed2bf315a6ae99b2a1633bc7c7d162f7b9` — spells it 0 times across 8540 tracked files, against lit controls `TTL` 184 and `tenant` 1393 on the same corpus (0 across 8519, against 184 and 1365, at 088e0f705; 0 across 8506, against 184 and 1365, at e5311165a; 0 across 8441, against 184 and 1362, at 499799502; 0 across 8424, against 184 and 1357, at 0df67f237; 0 across 8351, against 184 and 1340, at 20c6d351a; 0 across 8281, against 184 and 1338, at 47b1f0bb7; 0 across 8234, against 184 and 1338, at f0268ad78; 0 across 7754, against 184 and 1319, at a58626c88; 0 across 7650, against 182 and 1318, at 0abd4f9f8; 0 across 7632, against 182 and 1318, at 9dfaca654; 0 across 7579, against 182 and 1317, at 2e818d0b5; 0 across 10267, against 180 and 1238, at ab1879721; 0 across 10071, against 181 and 1237, at 89cad75d5; 0 across 9912, against 181 and 1237, at 31971ff1e; 0 across 9800, against 181 and 1235, at e420df310; 0 across 9546, against 181 and 1200, at db11afd49; 0 across 9283, against 181 and 1185, at dd3f7e1be; 0 across 8512, against 156 and 1034, at f8a9d0fb0; 0 across 8303, against 156 ' + + 'objectui checkout — `.objectui-sha` = `7578323a544e31d574804ae931b595e8f9f92c21` — spells it 0 times across 8600 tracked files, against lit controls `TTL` 184 and `tenant` 1404 on the same corpus (0 across 8540, against 184 and 1393, at 9646e2ed2; 0 across 8519, against 184 and 1365, at 088e0f705; 0 across 8506, against 184 and 1365, at e5311165a; 0 across 8441, against 184 and 1362, at 499799502; 0 across 8424, against 184 and 1357, at 0df67f237; 0 across 8351, against 184 and 1340, at 20c6d351a; 0 across 8281, against 184 and 1338, at 47b1f0bb7; 0 across 8234, against 184 and 1338, at f0268ad78; 0 across 7754, against 184 and 1319, at a58626c88; 0 across 7650, against 182 and 1318, at 0abd4f9f8; 0 across 7632, against 182 and 1318, at 9dfaca654; 0 across 7579, against 182 and 1317, at 2e818d0b5; 0 across 10267, against 180 and 1238, at ab1879721; 0 across 10071, against 181 and 1237, at 89cad75d5; 0 across 9912, against 181 and 1237, at 31971ff1e; 0 across 9800, against 181 and 1235, at e420df310; 0 across 9546, against 181 and 1200, at db11afd49; 0 across 9283, against 181 and 1185, at dd3f7e1be; 0 across 8512, against 156 and 1034, at f8a9d0fb0; 0 across 8303, against 156 ' + 'and 987, at 62597c588).', acceptanceCriteria: 'Every schema-level tenant isolation source spells `performance.schemaCacheTtlSeconds`; ' diff --git a/packages/spec/src/ui/action-outcome-messages.test.ts b/packages/spec/src/ui/action-outcome-messages.test.ts index 007c7117bb3..316c874214d 100644 --- a/packages/spec/src/ui/action-outcome-messages.test.ts +++ b/packages/spec/src/ui/action-outcome-messages.test.ts @@ -12,7 +12,12 @@ * runner default) and the `${result.*}` INTERPOLATION are the console's — the * reader is objectstack-ai/objectui#11344, a later link of the same ruling, * carried from the pin this repo builds against (`.objectui-sha` = - * `9646e2ed2`, re-read there 2026-10-12: + * `7578323a5`, re-read there 2026-10-12: + * `ActionRunner.composeSuccessMessage`, in `core/src/actions/ActionRunner.ts`, is + * byte-identical in body to `9646e2ed2` and MOVED down by 11, `1498` -> `1509` + * (objectui#12191, objectui `334f0cff9`: the runner admits `mailto:` through one + * navigation-target answer, its eleven import lines added above it; every other + * hunk lies below the reader). At `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At * `088e0f705`, re-read there 2026-10-12: diff --git a/packages/spec/src/ui/action.zod.ts b/packages/spec/src/ui/action.zod.ts index 14067f256b7..141d2e551e1 100644 --- a/packages/spec/src/ui/action.zod.ts +++ b/packages/spec/src/ui/action.zod.ts @@ -1364,7 +1364,13 @@ const actionObject = () => strictObject({ * * Liveness: the ledger row was `planned` until the console reader landed, * and it is `live` from the pin this repo builds against (`.objectui-sha` = - * `9646e2ed2`, re-read there 2026-10-12: + * `7578323a5`, re-read there 2026-10-12: + * `ActionRunner.composeSuccessMessage`, in `core/src/actions/ActionRunner.ts`, is + * byte-identical in body to `9646e2ed2` and MOVED down by 11, `1498` -> `1509` + * (objectui#12191, objectui `334f0cff9`: the runner admits `mailto:` through one + * navigation-target answer, its eleven import lines added above it; every other + * hunk lies below the reader), and the four action renderers + * are byte-identical (`git diff --quiet`). At `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At * `088e0f705`, re-read there 2026-10-12: @@ -1404,7 +1410,7 @@ const actionObject = () => strictObject({ * `ab1879721`, where it was read 2026-10-03, so the anchor below held * unmoved). The reader is objectui#11344 (objectui * `c476be0e0`): `ActionRunner.composeSuccessMessage` - * (`core/src/actions/ActionRunner.ts:1498`) picks `outcomeMessages[outcome]` + * (`core/src/actions/ActionRunner.ts:1509`) picks `outcomeMessages[outcome]` * off the handler's return value, falls back to `successMessage` and then to * the runner's default text, and fills `${result.*}` in whichever it shows. * The four action renderers forward the key to the runner (`action:bar` diff --git a/packages/spec/src/ui/component.test.ts b/packages/spec/src/ui/component.test.ts index 44a86b3b0e9..fd378e2a06e 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` = `9646e2ed2`, re-read there 2026-10-12: +// builds against — `.objectui-sha` = `7578323a5`, re-read there 2026-10-12: +// every objectui file this record cites is byte-identical across the hop from +// `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At +// `9646e2ed2`, re-read there 2026-10-12: // every objectui file this record cites is byte-identical across the hop from // `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At // `088e0f705`, re-read there 2026-10-12: @@ -466,7 +469,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` = `9646e2ed2`, re-read there 2026-10-12: +// the pin this repo builds against — `.objectui-sha` = `7578323a5`, re-read there 2026-10-12: +// every objectui file this record cites is byte-identical across the hop from +// `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At +// `9646e2ed2`, re-read there 2026-10-12: // every objectui file this record cites is byte-identical across the hop from // `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At // `088e0f705`, re-read there 2026-10-12: @@ -3517,7 +3523,10 @@ 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` = `9646e2ed2`, re-read there 2026-10-12: +// against (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: +// every objectui file this record cites is byte-identical across the hop from +// `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At +// `9646e2ed2`, re-read there 2026-10-12: // every objectui file this record cites is byte-identical across the hop from // `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At // `088e0f705`, re-read there 2026-10-12: @@ -3740,7 +3749,10 @@ describe('ObjectKanbanPropsSchema limit — the row cap four objectui faces alre // since retired that block, objectui#8257). Unlike `limit` above — a key four // objectui faces already implemented, so the spec was the half that was wrong // — `quickAdd` was FORWARDED and never read: at the pin this repo builds -// against (`.objectui-sha` = `9646e2ed2`, re-read there 2026-10-12: +// against (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: +// every objectui file this record cites is byte-identical across the hop from +// `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At +// `9646e2ed2`, re-read there 2026-10-12: // every objectui file this record cites is byte-identical across the hop from // `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At // `088e0f705`, re-read there 2026-10-12: @@ -3952,7 +3964,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` = `9646e2ed2`, re-read there 2026-10-12: +// `.objectui-sha` = `7578323a5`, re-read there 2026-10-12: +// every objectui file this record cites is byte-identical across the hop from +// `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At +// `9646e2ed2`, re-read there 2026-10-12: // every objectui file this record cites is byte-identical across the hop from // `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At // `088e0f705`, re-read there 2026-10-12: @@ -4147,7 +4162,10 @@ describe('ObjectMetricPropsSchema icon liveness', () => { // // The acceptance the card names, pinned: each row's KEY SET is the one the // renderer's read points support at the pin this repo builds against -// (`.objectui-sha` = `9646e2ed2`, re-read there 2026-10-12: +// (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: +// every objectui file this record cites is byte-identical across the hop from +// `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At +// `9646e2ed2`, re-read there 2026-10-12: // every objectui file this record cites is byte-identical across the hop from // `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At // `088e0f705`, re-read there 2026-10-12: diff --git a/packages/spec/src/ui/component.zod.ts b/packages/spec/src/ui/component.zod.ts index 7a1a2f80a23..cd80ad69fa9 100644 --- a/packages/spec/src/ui/component.zod.ts +++ b/packages/spec/src/ui/component.zod.ts @@ -840,7 +840,10 @@ export const PageTabsProps = strictObject({ * false candidate a component over). * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `9646e2ed2`, re-read there 2026-10-12: + * (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At + * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At * `088e0f705`, re-read there 2026-10-12: @@ -1092,7 +1095,10 @@ export const PageCardProps = strictObject({ * declarations identical. * * Each clause is read off the objectui pin this repo builds against - * (`.objectui-sha` = `9646e2ed2`, re-read there 2026-10-12: + * (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At + * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At * `088e0f705`, re-read there 2026-10-12: @@ -2502,7 +2508,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` = `9646e2ed2`, re-read there 2026-10-12: + * (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At + * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At * `088e0f705`, re-read there 2026-10-12: @@ -2945,7 +2954,10 @@ export const ElementButtonPropsSchema = lazySchema(() => strictObject({ * the button. * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `9646e2ed2`, re-read there 2026-10-12: + * (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At + * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At * `088e0f705`, re-read there 2026-10-12: @@ -3429,7 +3441,10 @@ 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` = `9646e2ed2`, re-read there 2026-10-12: + * against, `.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At + * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At * `088e0f705`, re-read there 2026-10-12: @@ -4022,7 +4037,10 @@ export type ActionIconPropsParsed = z.infer; * inventory. A member's `params` is its `ActionParam[]` input list: both * containers forward an array as `actionParams` (group `:346-348`, menu * `:270-272`, re-read at the pin this repo builds against, `.objectui-sha` = - * `9646e2ed2`, 2026-10-12: `action-group.tsx`, `action-menu.tsx` and + * `7578323a5`, 2026-10-12: `action-group.tsx`, `action-menu.tsx` and + * `static-params.ts` are byte-identical across the hop from `9646e2ed2` (`git + * diff --quiet`), so both held unmoved; at `9646e2ed2`, 2026-10-12: + * `action-group.tsx`, `action-menu.tsx` and * `static-params.ts` are byte-identical across the hop from `088e0f705` (`git * diff --quiet`), so both held unmoved; at `088e0f705`, 2026-10-12: * `action-group.tsx`, `action-menu.tsx` and @@ -4725,7 +4743,10 @@ 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` = `9646e2ed2`, re-read there 2026-10-12: + * pin this repo builds against (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At + * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At * `088e0f705`, re-read there 2026-10-12: @@ -4863,7 +4884,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` - * = `9646e2ed2`, re-read there 2026-10-12: + * = `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At + * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At * `088e0f705`, re-read there 2026-10-12: @@ -5277,7 +5301,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` = `9646e2ed2`, re-read there 2026-10-12: + * Read at the pin this repo builds against (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At + * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At * `088e0f705`, re-read there 2026-10-12: @@ -5736,7 +5763,10 @@ export const ObjectMetricPropsSchema = lazySchema(() => strictObject({ * same record for the metric tile. * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `9646e2ed2`, re-read there 2026-10-12: + * (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At + * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At * `088e0f705`, re-read there 2026-10-12: @@ -6005,7 +6035,10 @@ const ObjectKanbanLaneSchema = lazySchema(() => strictObject({ * DESIGNER's spelling with * zero read points (#7973 class) — aliased to the `groupBy` the board reads. * `limit` (#16503) was measured later, at the pin this repo builds against - * (`.objectui-sha` = `9646e2ed2`, re-read there 2026-10-12: + * (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At + * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At * `088e0f705`, re-read there 2026-10-12: @@ -6135,7 +6168,13 @@ 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` = `9646e2ed2`, re-read there 2026-10-12: + * repo builds against (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved; + * `ListView.tsx` and `ObjectView.tsx`, named below only as an earlier + * re-read's record and no longer anchors here, are not among them + * (`ListView.tsx` and app-shell's `ObjectView.tsx` changed on this hop). At + * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved; * `ListView.tsx` and `ObjectView.tsx`, named below only as an earlier @@ -6440,7 +6479,10 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ * quick-add control and no block a document can name offers one either). * * Measured at the objectui pin this repo builds against - * (`.objectui-sha` = `9646e2ed2`, re-read there 2026-10-12: + * (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At + * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At * `088e0f705`, re-read there 2026-10-12: @@ -6671,6 +6713,9 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({ * element schemas). * * Measured at the pin this repo builds against (`.objectui-sha` = + * `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At @@ -6909,6 +6954,9 @@ export const ObjectCalendarPropsSchema = lazySchema(() => strictObject({ * `object-kanban`'s above. * * Measured at the pin this repo builds against (`.objectui-sha` = + * `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At @@ -8144,7 +8192,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` = `9646e2ed2`, re-read there 2026-10-12: + * `.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At + * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At * `088e0f705`, re-read there 2026-10-12: @@ -8354,7 +8405,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` = `9646e2ed2`, re-read there 2026-10-12: + * pin this repo builds against (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At + * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At * `088e0f705`, re-read there 2026-10-12: @@ -8443,7 +8497,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` = `9646e2ed2`, re-read there 2026-10-12: + * (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At + * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At * `088e0f705`, re-read there 2026-10-12: @@ -8654,7 +8711,16 @@ 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` = `9646e2ed2`, re-read there 2026-10-12: + * — `.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * `ObjectGantt.tsx`, `record-source.ts` and `plugin-gantt/src/index.tsx` are + * byte-identical across the hop from `9646e2ed2` (`git diff --quiet`), so every + * anchor in them held unmoved; `ListView.tsx` changed (+34/-79, objectui#12217, + * objectui `f5b66bf97`: two import lines changed in place and one added at the + * top, a docblock added and `useListViewTranslation` exported near `:1040`, the + * grid's inline empty state replaced from `:5677` down), and its `case 'gantt'` + * MOVED `3959` -> `3964`, byte-identical, and still writes the toolbar Search + * term onto the node as `search` / `searchableFields`. At `9646e2ed2`, re-read + * there 2026-10-12: * `ObjectGantt.tsx`, `record-source.ts` and `plugin-gantt/src/index.tsx` are * byte-identical across the hop from `088e0f705` (`git diff --quiet`), so every * anchor in them held unmoved; `ListView.tsx` changed (+9/-9, objectui#12189, @@ -8938,10 +9004,19 @@ export type ObjectGanttPropsParsed = z.infer; /** * The flat `TreeConfig` spellings `getTreeConfig` reads ahead of the `tree` * block (`ObjectTree.tsx:289-302`) and that `ObjectView` / `ListView` EMIT when - * they flatten `options.tree` (`ListView.tsx:4120-4144`, `case 'tree'`: the + * they flatten `options.tree` (`ListView.tsx:4125-4149`, `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` = `9646e2ed2`, re-read there 2026-10-12: + * pin this repo builds against (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * `ObjectTree.tsx` and `plugin-tree/src/index.tsx` are byte-identical to + * `9646e2ed2` (`git diff --quiet`), so `289-302` and `240-261` did not move; + * and `ListView.tsx` changed (+34/-79, objectui#12217, objectui `f5b66bf97`: + * two import lines changed in place and one added at the top, a docblock added + * and `useListViewTranslation` exported near `:1040`, the grid's inline empty + * state replaced from `:5677` down), so its `case 'tree'` arm MOVED `4120-4144` + * -> `4125-4149`, byte-identical, with `labelField: treeCfg.labelField || + * 'name'` at `:4145`, and the flat key set it emits did not move. At + * `9646e2ed2`, re-read there 2026-10-12: * `ObjectTree.tsx` and `plugin-tree/src/index.tsx` are byte-identical to * `088e0f705` (`git diff --quiet`), so `289-302` and `240-261` did not move; * and `ListView.tsx` changed (+9/-9, objectui#12189, objectui `26b0bd2d1`: the @@ -9102,7 +9177,10 @@ const OBJECT_TREE_FLAT_CONFIG_GUIDANCE: readonly KeySetGuidance[] = [ /** * `object-tree` (objectui `plugin-tree/src/ObjectTree.tsx` plus the registry * shell `plugin-tree/src/index.tsx`, read at the pin this repo builds against - * — `.objectui-sha` = `9646e2ed2`, re-read there 2026-10-12: + * — `.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At + * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At * `088e0f705`, re-read there 2026-10-12: @@ -9310,7 +9388,10 @@ 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` = `9646e2ed2`, re-read there 2026-10-12: + * builds against (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At + * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At * `088e0f705`, re-read there 2026-10-12: @@ -9731,7 +9812,10 @@ function objectTimelineItemsFitVariant() { * `object-timeline` (objectui `plugin-timeline/src/ObjectTimeline.tsx`, the * presentational `plugin-timeline/src/renderer.tsx` it composes into, and the * registry shell `plugin-timeline/src/index.tsx` — all read at the pin this - * repo builds against (`.objectui-sha` = `9646e2ed2`, re-read there 2026-10-12: + * repo builds against (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At + * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At * `088e0f705`, re-read there 2026-10-12: @@ -10000,6 +10084,9 @@ 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` = + * `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At @@ -10375,6 +10462,9 @@ export const ComponentPropsMap = { // set from this map's keys), on the three-part evidence that vocabulary's // string-arm ledger asks of a type admitted without an enum member — all // measured at the pin this repo builds against (`.objectui-sha` = + // `7578323a5`, re-read there 2026-10-12: + // every objectui file this record cites is byte-identical across the hop from + // `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At // `9646e2ed2`, re-read there 2026-10-12: // every objectui file this record cites is byte-identical across the hop from // `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At @@ -10493,6 +10583,9 @@ export const ComponentPropsMap = { // authority for map and gantt while tree's rung-1 `data` read stayed // undeclared on every face. Key sets measured from the renderers' read // points at the pin this repo builds against (`.objectui-sha` = + // `7578323a5`, re-read there 2026-10-12: + // every objectui file this record cites is byte-identical across the hop from + // `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At // `9646e2ed2`, re-read there 2026-10-12: // every objectui file this record cites is byte-identical across the hop from // `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At @@ -10592,6 +10685,9 @@ 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` = + // `7578323a5`, re-read there 2026-10-12: + // every objectui file this record cites is byte-identical across the hop from + // `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At // `9646e2ed2`, re-read there 2026-10-12: // every objectui file this record cites is byte-identical across the hop from // `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At diff --git a/packages/spec/src/ui/dataset.zod.ts b/packages/spec/src/ui/dataset.zod.ts index 8d4e1be7c97..59fdd9aaeda 100644 --- a/packages/spec/src/ui/dataset.zod.ts +++ b/packages/spec/src/ui/dataset.zod.ts @@ -283,6 +283,9 @@ export const DatasetMeasureSchema = lazySchema(() => strictObject({ * and this docblock and the `describe` beneath it both said so. * * Measured at the pin this repo builds against (`.objectui-sha` = + * `7578323a5`, re-read there 2026-10-12: + * every objectui file this record cites is byte-identical across the hop from + * `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At * `9646e2ed2`, re-read there 2026-10-12: * every objectui file this record cites is byte-identical across the hop from * `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At diff --git a/packages/spec/src/ui/view.zod.ts b/packages/spec/src/ui/view.zod.ts index 3a8c7895b79..f4ab57651b1 100644 --- a/packages/spec/src/ui/view.zod.ts +++ b/packages/spec/src/ui/view.zod.ts @@ -2230,16 +2230,23 @@ export const TreeConfigSchema = lazySchema(() => strictObject({ * `objectql.zod.ts` and `ObjectMap.tsx` are byte-identical, so * `ObjectMapConfigSchema` (`2523`, still closed with `.strict()`), * `LIST_VIEW_LOCAL_OVERRIDES` (`1506`, still without `map`) and the two - * `getMapConfig` lines did not move. Each anchor quotes the line it was read at, + * `getMapConfig` lines did not move. RE-READ again at pin `7578323a5` on + * 2026-10-12: `ListView.tsx` (+34/-79: objectui#12217, objectui `f5b66bf97`) + * gained one import line above both of its anchors, so `resolveListMapConfig` + * `209` -> `210` and `FLAT_MAP_CONFIG_SPELLING` `95` -> `96`, each + * byte-identical; `ObjectView.tsx`, `objectql.zod.ts` and `ObjectMap.tsx` are + * byte-identical (`git diff --quiet`), so `case 'map':` (`2479`), + * `ObjectMapConfigSchema` (`2523`) and the two `getMapConfig` lines did not + * move. Each anchor quotes the line it was read at, * so the next pin bump reds instead of rotting * (`check:objectui-pin-citations`): * * - **The block this face feeds is FLATTENED, not forwarded.** `ListView` - * (`packages/plugin-list/src/ListView.tsx:209` first line + * (`packages/plugin-list/src/ListView.tsx:210` first line * `function resolveListMapConfig(schema: { map?: unknown; options?: { map?: unknown } }): Record {`) * and `ObjectView` (`packages/plugin-view/src/ObjectView.tsx:2479` first line * `case 'map':`) copy it through a HAND-LISTED whitelist - * (`packages/plugin-list/src/ListView.tsx:95` first line + * (`packages/plugin-list/src/ListView.tsx:96` first line * `export const FLAT_MAP_CONFIG_SPELLING = {`) — ⚠️ re-read at the new pin: * the whitelist was a key LIST named `FLAT_MAP_CONFIG_KEYS` carrying this * block's keys MINUS `style`, and objectui#9950 made it a total map from @@ -3429,7 +3436,12 @@ 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` = `9646e2ed2`, re-read there 2026-10-12: + * (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12: + * `autoLayout.ts`, `fields`' `field-type-alias.ts` and `form.tsx` are + * byte-identical to `9646e2ed2` (`git diff --quiet`), so `resolveColSpan` + * `:154`, `WIDE_FIELD_TYPES` `:58-69`, the `repeater` -> `field:grid` mapping, + * `spanLadderFor` `:275-302` and its one call site `:3329` held unmoved, and it + * still emits the ladder. At `9646e2ed2`, re-read there 2026-10-12: * `autoLayout.ts`, `fields`' `field-type-alias.ts` and `form.tsx` are * byte-identical to `088e0f705` (`git diff --quiet`), so `resolveColSpan` * `:154`, `WIDE_FIELD_TYPES` `:58-69`, the `repeater` -> `field:grid` mapping, @@ -3557,7 +3569,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` = `9646e2ed2bf3`), 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` = `7578323a544e`), 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 5f22712de87..c326718ab40 100644 --- a/scripts/sdui-manifest.record.json +++ b/scripts/sdui-manifest.record.json @@ -11,9 +11,9 @@ "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": "9646e2ed2bf315a6ae99b2a1633bc7c7d162f7b9", + "objectuiSha": "7578323a544e31d574804ae931b595e8f9f92c21", "source": "built-tree", - "modulesRoot": ".cache/objectui-9646e2ed2bf3/apps/console", + "modulesRoot": ".cache/objectui-7578323a544e/apps/console", "objectuiWorkspaceVersion": "17.7.0", "generator": "scripts/gen-sdui-manifest-node.mjs", "generatedAt": "2026-10-12",