` as a DOM
- * attribute. The registration published it through `db11afd49` (`:415`
- * there); objectui#11168 stopped publishing it because nothing reads it and
- * this row refuses it (`action-group.tsx:46-48`). Refused with a
- * prescription, the `page:accordion` item `value` precedent: an author
+ * attribute. The registration once published it; objectui#11168 stopped
+ * publishing it because nothing reads it and this row refuses it. Refused with
+ * a prescription, the `page:accordion` item `value` precedent: an author
* copying an older designer's output is told what happened rather than
* merely refused.
*/
@@ -5019,32 +4328,28 @@ export type ActionGroupPropsParsed = z.infer
;
/**
* `action:menu` — a dropdown ("more") menu of actions
- * (`components/src/renderers/action/action-menu.tsx` at the pin). Read
+ * (read points recorded in `liveness/page.json`, row `regions`). Read
* points, per key:
*
- * - `actions` — `:344`; members are read at `:81`, `:109-156` and `:410`, run
- * through `ActionAutoTrigger` (`:365-372`), and forwarded at
- * `action-menu.tsx:270-330` first line
- * `const paramsPayload: ActionDef = Array.isArray(action.params)` (`params`
- * `:270-272`, no longer joined by the member's own `properties.params`
- * since objectui#11638; `objectName` `:329`; the member's
- * `outcomeMessages` too since objectui#11344).
- * - `label` — `:391` (`aria-label`, default: the translated "More actions")
- * and `:400-401` (trigger text; icon-only when omitted).
- * - `icon` — `:246`, default the `MoreHorizontal` glyph.
- * - `variant` / `size` — `:247` / `:248`, handed to the Button primitive
- * unmapped (defaults `ghost` / `icon`): no `primary`, no `md` here.
- * - `visible` — `:241` + `:338`, fail-closed; the same truthiness note as
- * `action:group`'s applies to a literal `false`.
- *
- * The registration's `inputs` (`:437-465`) publish `label`, `icon`,
- * `actions`, `variant`, `size`, `visible` and `className` since objectui#11168
- * slice 1, every key this row declares; through `db11afd49` (`:410-419`
- * there) `size` and `visible` were read and unpublished. ⚠️ As on
- * `action:group`, objectui#11182 has the trigger consume the host's evaluated
- * `disabled` verdict (`:228`, `:390`) — at `db11afd49` it already reached the
- * trigger through the `...rest` spread — so a `properties.disabled` here greys
- * the trigger out while this row refuses it; recorded, not declared.
+ * - `actions` — members are read by the menu, run through
+ * `ActionAutoTrigger`, and forwarded (`params` no longer joined by the
+ * member's own `properties.params` since objectui#11638; `objectName`; the
+ * member's `outcomeMessages` too since objectui#11344).
+ * - `label` — the `aria-label` (default: the translated "More actions") and
+ * the trigger text (icon-only when omitted).
+ * - `icon` — default the `MoreHorizontal` glyph.
+ * - `variant` / `size` — handed to the Button primitive unmapped (defaults
+ * `ghost` / `icon`): no `primary`, no `md` here.
+ * - `visible` — fail-closed; the same truthiness note as `action:group`'s
+ * applies to a literal `false`.
+ *
+ * The registration's `inputs` publish `label`, `icon`, `actions`, `variant`,
+ * `size`, `visible` and `className` since objectui#11168 slice 1, every key
+ * this row declares; before it `size` and `visible` were read and
+ * unpublished. ⚠️ As on `action:group`, objectui#11182 has the trigger
+ * consume the host's evaluated `disabled` verdict (it once reached the trigger
+ * through the `...rest` spread), so a `properties.disabled` here greys the
+ * trigger out while this row refuses it; recorded, not declared.
*/
export const ActionMenuPropsSchema = lazySchema(() => strictObject({
surface: 'this `action:menu`',
@@ -5077,23 +4382,19 @@ export type ActionMenuProps = z.input;
export type ActionMenuPropsParsed = z.infer;
/**
- * `element:definition-list` — a compact key/value ``
- * (`components/src/renderers/basic/data-list.tsx` at the pin). Props are read
- * through `readProps` (`data-list.tsx:52-57` first line
- * `const props = readProps<{`, `properties` first). Read points: `items`
- * (`:58`), `columns` (`:59`), `inline` (`:73`), and per item `term` (`:76`) and
- * `description` (`:78`).
+ * `element:definition-list` — a compact key/value `` (read points recorded in `liveness/page.json`, row `regions`).
+ * Props are read through `readProps` (`properties` first). Read points:
+ * `items`, `columns`, `inline`, and per item `term` and `description`.
*
* - `columns` is compared as the NUMBER `2` (`props.columns === 2`); any other
* value renders one column. Declared as the literal pair `1 | 2`, which is
- * what the Studio designer writes (a `number` control,
- * `previews/block-config.ts:335`). The registration's enum published the
- * STRINGS `'1'` / `'2'` until objectui#11168 slice 2, and the string `'2'`
- * renders one column; it now publishes the numbers `1` and `2`
- * (`data-list.tsx:109-115`), as this row declares.
+ * what the Studio designer writes (a `number` control). The registration's
+ * enum published the STRINGS `'1'` / `'2'` until objectui#11168 slice 2,
+ * and the string `'2'` renders one column; it now publishes the numbers `1`
+ * and `2`, as this row declares.
* - `items` is optional, as it is read: absent and empty both render the
- * renderer's own "No details" state (`:61-63`). The registration marked it
- * required until objectui#11168 slice 2, and no longer does (`:101-107`).
+ * renderer's own "No details" state. The registration marked it required
+ * until objectui#11168 slice 2, and no longer does.
* - An item is strict. `term` is required — it is the row's only label, placed
* as a React child, so a literal string — and `description` takes any value
* (`toText` prints objects as JSON and an absent one as an em dash). The
@@ -5141,21 +4442,17 @@ export type ElementDefinitionListProps = z.input strictObject({
@@ -5383,7 +4678,7 @@ const GridAggregationSchema = lazySchema(() => strictObject({
/**
* [#21445] `object-grid`'s built-in affordance toggles — the four members a
- * read point names at the `.objectui-sha` pin `89cad75d55` (see the member).
+ * read point names (see the member).
* Module-private for the same reason as {@link GridAggregationSchema}.
*
* `read` and `import` are `guidance`, not members: objectui's TypeScript
@@ -5412,143 +4707,65 @@ const GridOperationsSchema = lazySchema(() => strictObject({
}));
/**
- * `object-grid` (objectui `plugin-grid/src/ObjectGrid.tsx` @ `eb7f586b`).
- * Read points per key: `objectName` (throughout), `columns`/`fields` (:714-715),
- * `filter` (:739, lowered via `toFilterNode` to `$filter`), `defaultFilters`
- * (:922 — the LEGACY fallback read only when `filter` is absent; RETIRED in
- * v18, #11509, tombstoned below — the plural `filters` never had a read point),
- * `sort` (:741) / `defaultSort` (:943 — RETIRED #11805, tombstoned below;
- * objectui#5861 retires the read), `pagination`/`pageSize`/`showPagination`
- * (:567, :752, :2475-2480), `searchableFields`/`showSearch` (:959, :2484-2486),
- * `rowHeight` (:549), `grouping`/`aggregations` (:1076, :1136), `rowColor`
- * (:1052), `conditionalFormatting` (:884, :1061), `selection`/`selectable`
- * (:2186-2190), `rowActions` (:1927), `batchActions`/`bulkActions` (:2150),
- * `bulkActionDefs` (:2165), `navigation` (:1032), `editable`/`singleClickEdit`
- * (:2597, :2632), `resizable`/`resizableColumns` (:2598), `reorderableColumns`
- * (:2599), `frozenColumns` (:2135), `showColumnTypeIcons` (:1296 …),
- * `exportOptions`/`operations` (:1697-1721), `label`/`title` (:1732, :2557),
- * `data`/`staticData` (:372, :386).
- *
- * [#20694] Three keys measured later, at the `.objectui-sha` pin
- * `db11afd4967c` (objectui#11130's merge commit), in the same file:
- * `description` (:5677, `resolveInlineI18nLabel(schema.description,
- * displayLocale)`, drawn above the rows at :5784 / :6303 / :6342) and
- * `emptyState` (:6225, drawn through `DataEmptyState` at :6233). The third,
- * `keyboardNavigation`, had NO read point at that pin — zero hits under
- * objectui `packages/` and `apps/` outside tests, CHANGELOGs, READMEs and
+ * `object-grid` (objectui's `ObjectGrid`; read points recorded in
+ * `liveness/page.json`, row `regions`). Read points per key: `objectName`
+ * (throughout), `columns`/`fields`, `filter` (lowered via `toFilterNode` to
+ * `$filter`), `defaultFilters` (the LEGACY fallback read only when `filter` is
+ * absent; RETIRED in v18, #11509, tombstoned below — the plural `filters` never
+ * had a read point), `sort` / `defaultSort` (RETIRED #11805, tombstoned below;
+ * objectui#5861 retires the read), `pagination`/`pageSize`/`showPagination`,
+ * `searchableFields`/`showSearch`, `rowHeight`, `grouping`/`aggregations`,
+ * `rowColor`, `conditionalFormatting`, `selection`/`selectable`,
+ * `rowActions`, `batchActions`/`bulkActions`, `bulkActionDefs`, `navigation`,
+ * `editable`/`singleClickEdit`, `resizable`/`resizableColumns`,
+ * `reorderableColumns`, `frozenColumns`, `showColumnTypeIcons`,
+ * `exportOptions`/`operations`, `label`/`title`, `data`/`staticData`.
+ *
+ * [#20694] Three keys measured later, in the same file: `description`
+ * (`resolveInlineI18nLabel(schema.description, displayLocale)`, drawn above
+ * the rows) and `emptyState` (drawn through `DataEmptyState`). The third,
+ * `keyboardNavigation`, had NO read point then — zero hits under objectui
+ * `packages/` and `apps/` outside tests, CHANGELOGs, READMEs and
* `packages/types` (its type declaration and zod twin), against 3 hits for the
- * 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 objectui `b9814b334` (re-read there 2026-10-14:
- * `ObjectGrid.tsx` changed across the hop from `1fb1ced36` (+327/-80:
- * objectui#12292, objectui#12303, objectui#12030 and objectui#12270) and
- * `data-table.tsx` changed too (+320/-90: objectui#12322, objectui#12310 and
- * objectui#12292, the inline-edit save path), neither on the read; the read
- * MOVED `5631` -> `5856` with its line byte-identical, and the same method
- * still finds 15 hit lines, now against 4 for the control: objectui#12292 added
- * a fourth `schema.editable` read (`carriesConcurrencyToken`,
- * `ObjectGrid.tsx:2067`). At `1fb1ced36`, re-read there 2026-10-12:
- * every objectui file this record cites is byte-identical across the hop from
- * `7578323a5` (`git diff --quiet`), so every anchor held unmoved. At
- * `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:
- * every objectui file this record cites is byte-identical across the hop from
- * `e5311165a` (`git diff --quiet`), so every anchor held unmoved. At
- * `e5311165a`, re-read there 2026-10-12:
- * `ObjectGrid.tsx` changed across the hop from `499799502` (+27/-11:
- * objectui#12110, objectui `5330038f4`, and objectui#12143, objectui
- * `2381c07f3`) and `data-table.tsx` changed too (+12/-1: objectui#12124 and
- * objectui#12145, the pager's and the row menu's accessible names), neither
- * on the read; the read MOVED `5615` -> `5631` with its line byte-identical,
- * and the same method still finds 15 hit lines against 3 for the control. At
- * `499799502`, re-read there 2026-10-11:
- * `ObjectGrid.tsx` changed across the hop from `0df67f237` (+89/-44:
- * objectui#12081 item 3, objectui `69bca0af6`, and objectui#12082, objectui
- * `752504520`) and `data-table.tsx` is byte-identical (`git diff --quiet`); the
- * read MOVED `5570` -> `5615` with its line byte-identical, and the same method
- * still finds 15 hit lines against 3 for the control. At `0df67f237`, re-read
- * there 2026-10-11:
- * `ObjectGrid.tsx` changed across the hop from `20c6d351a` (+82/-32:
- * objectui#12082, objectui#12103 and objectui#12105) and `data-table.tsx` is
- * byte-identical (`git diff --quiet`); the read MOVED `5520` -> `5570` with its
- * line byte-identical, and the same method still finds 15 hit lines against 3
- * for the control. At `20c6d351a`, re-read there 2026-10-10:
- * every objectui file this record cites is byte-identical across the hop from
- * `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved, and the same
- * method still finds 15 hit lines against 3 for the control. At `47b1f0bb7`,
- * re-read there 2026-10-09:
- * `ObjectGrid.tsx` changed across the hop from `f0268ad78` (+19/-11:
- * objectui#11865 slice m, objectui `2063f7a96`: one import line, and the
- * grouped pager's rows-per-page picker drawn with the shared `Select`) and
- * `data-table.tsx` is byte-identical (`git diff --quiet`); the read MOVED
- * `5519` -> `5520` with its line byte-identical, and the same method still
- * finds 15 hit lines against 3 for the control. At `f0268ad78`, re-read there
- * 2026-10-09:
- * `ObjectGrid.tsx` (+85/-27: objectui#11880 item 5, objectui#6152 rounds 7 and
- * 10, objectui#11817, objectui#11809, objectui#11689) and `data-table.tsx`
- * (+434/-30: objectui#11816, objectui#11690, objectui#11682) changed across the
- * hop from `a58626c88`; the read MOVED `5461` -> `5519` with its line
- * byte-identical, and the same method still finds 15 hit lines against 3 for the
- * control. At `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.
- * At `9dfaca654`, 2026-10-05;
- * `data-table.tsx` is byte-identical across the hop from `2e818d0b5` and
- * `ObjectGrid.tsx` changed there in three type docblocks only (+9/-6,
- * objectui#8347), above the read, which MOVED `5458` -> `5461` byte-identical;
- * at `2e818d0b5`, 2026-10-04, `ObjectGrid.tsx` and `data-table.tsx` were
- * byte-identical across the hop
- * from `ab1879721`, so every anchor below held unmoved, 2026-10-03 at
- * `ab1879721`): the BUILD landed — objectui `154075ab1` (objectui#11068), inside
- * `89cad75d5570..ab1879721595` — and the grid reads the key. The same method
- * finds 0 hit lines at `89cad75d5570` and 15 at `ab1879721595`, at `2e818d0b51ec` and at this pin, against 3 for the
- * control `schema.editable` in `ObjectGrid.tsx` at each but this pin, which reads 4: `ObjectGrid.tsx:5856`
- * hands `schema.keyboardNavigation ?? inlineEditable` to the `data-table` it
- * renders, and `components/src/renderers/complex/data-table.tsx` acts on it.
- * So the marker is gone, as the member's record prescribed; see the member.
- *
- * [#21445] Seven members re-measured at the `.objectui-sha` pin `89cad75d55`,
- * same file, and typed with the shape each read point takes — they were
- * `z.unknown()` (`bulkActionDefs` an array of it), so `rowHeight: 42` passed
- * every door and the grid substituted or dropped the value in silence:
- * `rowHeight` (`resolveRowHeightMode`, :1311, five values, else `compact`),
- * `rowColor` (`useRowColor`, :2955, `field` + `colors`), `conditionalFormatting`
- * (`resolveConditionalFormatting`, :2964), `navigation`
- * (`useNavigationOverlay`, :2894), `aggregations` (`useGroupedData` and
- * `useServerGroupHeaders`, :3095 / :3113, `{ field, type }` with the six query
- * aggregation functions), `bulkActionDefs` (`resolveBulkActions`, :4778) and
- * `operations` (`create` :5468, `update` / `delete` :1898-1899, `export`
- * :4088 / :5340 / :6141 — the four members any read point names). The first
- * four and `bulkActionDefs` take the list view's own schemas by reference;
- * `aggregations` and `operations` have no list-view counterpart and declare
- * the measured shape here. In the same change `resizableColumns` — read only
- * as `schema.resizable ?? schema.resizableColumns` (:5361) — retires to a
+ * control `schema.editable` in the grid. 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. The BUILD landed —
+ * objectui `154075ab1` (objectui#11068) — and the grid reads the key: the same
+ * method finds 15 hit lines, against 4 for the control (objectui#12292 added a
+ * fourth `schema.editable` read, `carriesConcurrencyToken`); the grid hands
+ * `schema.keyboardNavigation ?? inlineEditable` to the `data-table` it renders,
+ * which acts on it. So the marker is gone, as the member's record prescribed;
+ * see the member.
+ *
+ * [#21445] Seven members re-measured and typed with the shape each read point
+ * takes — they were `z.unknown()` (`bulkActionDefs` an array of it), so
+ * `rowHeight: 42` passed every door and the grid substituted or dropped the
+ * value in silence: `rowHeight` (`resolveRowHeightMode`, five values, else
+ * `compact`), `rowColor` (`useRowColor`, `field` + `colors`),
+ * `conditionalFormatting` (`resolveConditionalFormatting`), `navigation`
+ * (`useNavigationOverlay`), `aggregations` (`useGroupedData` and
+ * `useServerGroupHeaders`, `{ field, type }` with the six query aggregation
+ * functions), `bulkActionDefs` (`resolveBulkActions`) and `operations`
+ * (`create`, `update` / `delete`, `export` — the four members any read point
+ * names). The first four and `bulkActionDefs` take the list view's own schemas
+ * by reference; `aggregations` and `operations` have no list-view counterpart
+ * and declare the measured shape here. In the same change `resizableColumns` —
+ * read only as `schema.resizable ?? schema.resizableColumns` — retires to a
* tombstone naming `resizable`.
*
- * [#21464] Six list members, re-measured at the same pin `89cad75d55` and
- * typed the same way — each was `z.unknown()` (an array of it for the three
- * lists), so a value of the wrong shape passed the component-props gate and
- * the grid dropped or substituted it in silence: `fields` (:1946 — field
- * NAMES on the draw path, `objectSchema.fields[fieldName]` at :3969 / :4012),
- * `selection` (`.type`, :4799-4812), `selectable` (:4813-4815, handed to the
- * table's `selectable` at :5333), `rowActions` (`string[]`, :1834-1835) and
- * `bulkActions` / `batchActions` (`batchActions ?? bulkActions`, :4763, each
- * entry a NAME `resolveBulkActions` folds; a non-string entry is skipped). The
- * three a list view also declares take the list view's own members by
- * reference; `fields` and `selectable` have no list-view counterpart and
- * declare the measured shape here; `batchActions` takes `bulkActions`'s def.
- * `columns` was held at `z.unknown()` for a ruling, and takes the list view's
- * own member by reference since stage 5 — see the member.
+ * [#21464] Six list members, re-measured and typed the same way — each was
+ * `z.unknown()` (an array of it for the three lists), so a value of the wrong
+ * shape passed the component-props gate and the grid dropped or substituted it
+ * in silence: `fields` (field NAMES on the draw path,
+ * `objectSchema.fields[fieldName]`), `selection` (`.type`), `selectable`
+ * (handed to the table's `selectable`), `rowActions` (`string[]`) and
+ * `bulkActions` / `batchActions` (`batchActions ?? bulkActions`, each entry a
+ * NAME `resolveBulkActions` folds; a non-string entry is skipped). The three a
+ * list view also declares take the list view's own members by reference;
+ * `fields` and `selectable` have no list-view counterpart and declare the
+ * measured shape here; `batchActions` takes `bulkActions`'s def. `columns` was
+ * held at `z.unknown()` for a ruling, and takes the list view's own member by
+ * reference since stage 5 — see the member.
*/
export const ObjectGridPropsSchema = lazySchema(() => strictObject({
surface: 'this `object-grid`',
@@ -5562,9 +4779,9 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
title: I18nLabelSchema.optional().describe('Fallback for `label` (the renderer reads `label || title`)'),
/**
* [#20694] One line of help text above the grid's rows, in the treatment
- * `ListView` gives a view's description. Read at the pin `db11afd4967c`
- * (`ObjectGrid.tsx:5677`) through `resolveInlineI18nLabel` against the
- * display locale, exactly as `label` is, so both `I18nLabel` forms draw; a
+ * `ListView` gives a view's description. Read (read points recorded in
+ * `liveness/page.json`, row `regions`) through `resolveInlineI18nLabel`
+ * against the display locale, exactly as `label` is, so both `I18nLabel` forms draw; a
* locale map with no usable entry draws no strip. Drawn by every branch that
* draws rows — the card view, the split pane and the table.
*/
@@ -5573,16 +4790,16 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
/**
* [#20694] What the grid draws INSTEAD of an empty table — the list view's
* own {@link EmptyStateSchema}, by reference (triage's direction: ⛔ not a
- * second shape). Read at the pin `db11afd4967c` (`ObjectGrid.tsx:6225`),
- * drawn through the shared `DataEmptyState` and `resolveIcon` that `ListView`
+ * second shape). Read (read points recorded in `liveness/page.json`, row
+ * `regions`) and drawn through the shared `DataEmptyState` and `resolveIcon` that `ListView`
* draws a list's empty state with, and only when the grid holds no row to
* draw (no group, when grouped), nothing is loading, and the grid's own
* search box is not what emptied it. A member left out keeps the grid's
* default: the shared glyph, the table's "No results found" heading, no
* message line.
*
- * ⚠️ Measured at that pin: `title` and `message` reach `DataEmptyState` as
- * they are (`:6241-6242`), with no locale-map resolution, unlike
+ * ⚠️ Measured when the member was declared: `title` and `message` reached
+ * `DataEmptyState` as they were, with no locale-map resolution, unlike
* `description` above. So of the two `I18nLabel` forms this shared shape
* declares, the grid draws the plain string only — an inline locale map is
* handed to React as a child, which throws (measured on react 19.2.8:
@@ -5590,79 +4807,16 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
* objectui side, not a second shape here: the list view door declares the
* same members, and objectui's grid follows this declaration.
*
- * ⚠️ That gap is closed at objectui `b9814b334` (re-read there 2026-10-14:
- * `ObjectGrid.tsx` changed across the hop from `1fb1ced36` (+327/-80:
- * objectui#12292, objectui#12303, objectui#12030 and objectui#12270);
- * objectui#12270 re-worded the comment above the two reads and added the
- * `link` hand-off (`action`) right below the second, neither inside a read,
- * so both MOVED by 230 with their lines byte-identical: `6648-6649` ->
- * `6878-6879`, `6665-6666` -> `6895-6896`. At `1fb1ced36`, re-read there
- * 2026-10-12:
- * every objectui file this record cites is byte-identical across the hop from
- * `7578323a5` (`git diff --quiet`), so every anchor held unmoved. At
- * `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:
- * every objectui file this record cites is byte-identical across the hop from
- * `e5311165a` (`git diff --quiet`), so every anchor held unmoved. At
- * `e5311165a`, re-read there 2026-10-12:
- * `ObjectGrid.tsx` changed across the hop from `499799502` (+27/-11:
- * objectui#12110 and objectui#12143), every hunk above both reads (the last
- * at `:6592`, a pager button's name written in place), so both MOVED by 16
- * with their lines byte-identical: `6632-6633` -> `6648-6649`, `6649-6650` ->
- * `6665-6666`. At `499799502`, re-read there 2026-10-11:
- * `ObjectGrid.tsx` changed across the hop from `0df67f237` (+89/-44:
- * objectui#12081 item 3 and objectui#12082), every hunk above both reads
- * (the last at `:5321-5343`), so both MOVED by 45 with their lines
- * byte-identical: `6587-6588` -> `6632-6633`, `6604-6605` -> `6649-6650`. At
- * `0df67f237`, re-read there 2026-10-11:
- * `ObjectGrid.tsx` changed across the hop from `20c6d351a` (+82/-32:
- * objectui#12082, objectui#12103 and objectui#12105), every hunk above both
- * reads (the last at `:5609`), so both MOVED by 50 with their lines
- * byte-identical: `6537-6538` -> `6587-6588`, `6554-6555` -> `6604-6605`. At
- * `20c6d351a`, re-read there 2026-10-10:
- * every objectui file this record cites is byte-identical across the hop from
- * `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At
- * `47b1f0bb7`, re-read there 2026-10-09:
- * `ObjectGrid.tsx` changed across the hop from `f0268ad78` (+19/-11:
- * objectui#11865 slice m, objectui `2063f7a96`: one import line, and the
- * grouped pager's rows-per-page picker drawn with the shared `Select`), every
- * hunk above both reads (the last at `:6454-6465`), so both MOVED by 8 with
- * their lines byte-identical: `6529-6530` -> `6537-6538`, `6546-6547` ->
- * `6554-6555`. At `f0268ad78`, re-read there 2026-10-09:
- * `ObjectGrid.tsx` changed across the hop from `a58626c88` (+85/-27:
- * objectui#11880 item 5, objectui#6152 rounds 7 and 10, objectui#11817,
- * objectui#11809, objectui#11689), every hunk above both reads (the last at
- * `:5383`), so both MOVED by 58 with their lines byte-identical: `6471-6472`
- * -> `6529-6530`, `6488-6489` -> `6546-6547`. At `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
- * hop from `2e818d0b5` in three type docblocks only (+9/-6, objectui#8347),
- * all above both reads, which MOVED by +3 byte-identical; at `2e818d0b5`,
- * re-measured 2026-10-04, it was byte-identical
- * across the hop from `ab1879721`, where it was measured 2026-10-03): objectui#11227 (carried by objectui
- * `6158e4c93`) resolves both members against the display locale before they
- * reach `DataEmptyState` —
+ * ⚠️ That gap is closed (read points recorded in `liveness/page.json`, row
+ * `regions`): objectui#11227 (carried by objectui `6158e4c93`) resolves both
+ * members against the display locale before they reach `DataEmptyState` —
* `resolveInlineI18nLabel(authoredEmptyState?.title, displayLocale)` and the
- * same for `message` (`ObjectGrid.tsx:6878-6879`, drawn at `:6895-6896`) — so
- * both `I18nLabel` forms draw, and a locale map with no usable entry keeps
- * that member's default. At `89cad75d5570` the two still reached
- * `DataEmptyState` raw.
+ * same for `message` — so both `I18nLabel` forms draw, and a locale map with
+ * no usable entry keeps that member's default.
*
* [#23004] The fourth member, `link`, is drawn too since objectui#12270
- * (objectui `b434f5f47`, inside the console pin from objectui `b9814b334`):
- * `DataEmptyState`'s action slot holds the shared `EmptyStateLink`
- * (`ObjectGrid.tsx:6897-6899`), the one `ListView`'s empty state draws it
- * with.
+ * (objectui `b434f5f47`): `DataEmptyState`'s action slot holds the shared
+ * `EmptyStateLink`, the one `ListView`'s empty state draws it with.
*/
emptyState: EmptyStateSchema.optional()
.describe('What the grid draws instead of an empty table: `{ title, message, icon, link }` — the list view\'s own empty-state shape'),
@@ -5673,29 +4827,27 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
* entries. Optional here, where the list view requires it: a grid with no
* `columns` derives them from `fields` or the object.
*
- * Read at the `.objectui-sha` pin `ab1879721595`
- * (`plugin-grid/src/ObjectGrid.tsx`): `normalizeColumns` (`:819`) decides
- * between the two arms by the FIRST entry, and the draw path (`:3367`) keeps
- * only an entry `resolvesToDataColumn` admits (`:3451` — a non-empty string
- * `field`, not `hidden`), reading `ListColumn`'s own members off it. So a
+ * Read points recorded in `liveness/page.json`, row `regions`:
+ * `normalizeColumns` decides between the two arms by the FIRST entry, and the
+ * draw path keeps only an entry `resolvesToDataColumn` admits (a non-empty
+ * string `field`, not `hidden`), reading `ListColumn`'s own members off it. So a
* mixed array, a column keyed `accessorKey` / `header` / `name`, or a key the
* grid never reads off a column (`editable`, `reference`, `options`) drew no
* column or was ignored, and passed the component-props gate.
*
- * Stage 2 HELD this member at `z.unknown()` on one read: at the pin
- * `89cad75d55` the group-header formatter drew the header labels from
+ * Stage 2 HELD this member at `z.unknown()` on one read: the group-header
+ * formatter drew the header labels from
* `colOverride?.options || objectDefField?.options`, the authored column's
* list winning, and `ListColumn` declares no `options`. objectui `b0bf413`
- * (objectstack-ai/objectui#11544) retired that read: at `ab1879721595`
- * `groupValueFormatter` (`:2979`) looks the column up typed as `ListColumn`
- * (`:3004-3007`) for its declared `type` alone, and takes the labels from
- * `objectDefField?.options` only (`:3010`). The hold's exit condition is
+ * (objectstack-ai/objectui#11544) retired that read: `groupValueFormatter`
+ * now looks the column up typed as `ListColumn` for its declared `type`
+ * alone, and takes the labels from `objectDefField?.options` only. The hold's exit condition is
* met, so the member takes the reference it was held from.
*
- * ⚠️ One read at that pin still takes keys `ListColumn` does not declare off
- * an authored column: the footer summary formats a column's total with the
- * column's `currency`, `defaultCurrency`, `precision` and `scale` ahead of
- * the field's (`plugin-grid/src/useColumnSummary.ts:558-568`). No measured
+ * ⚠️ One read still took keys `ListColumn` does not declare off an authored
+ * column when this was measured: the footer summary formats a column's total
+ * with the column's `currency`, `defaultCurrency`, `precision` and `scale`
+ * ahead of the field's. No measured
* writer authors one on an `object-grid` column, and a list view's columns —
* the same entry — refuse all four, so this row refuses them too; the read
* is reported to the objectui side, as the `options` read was.
@@ -5704,11 +4856,11 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
.describe('Columns — all field-name strings, or all column entries `{ field, label?, width?, align?, hidden?, sortable?, … }`, the same union a list view\'s `columns` declares. One spelling per list: an array mixing strings and column objects is refused'),
/**
* [#21464] Field NAMES. No list-view schema declares this member, so the
- * shape is the one the grid reads (`ObjectGrid.tsx:1946` at the pin
- * `89cad75d55`): when `columns` is absent the draw path looks each entry up
- * as `objectSchema.fields[fieldName]` (`:3969`, `:4012`), so an object
+ * shape is the one the grid reads (read points recorded in
+ * `liveness/page.json`, row `regions`): when `columns` is absent the draw
+ * path looks each entry up as `objectSchema.fields[fieldName]`, so an object
* entry named no field and drew no column. The projection reads object
- * entries too (`:2587`), but only for the host hand-off `ListView` makes,
+ * entries too, but only for the host hand-off `ListView` makes,
* which is not authored here. Column decoration belongs on `columns`.
*/
fields: z.array(z.string()).optional()
@@ -5723,9 +4875,9 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
* days before that ruling (#7751), not an exception to it: it accepted the
* MongoDB-style record, the AST tuple array and the rule array alike, so
* an author following the showcase and an author following the manifest
- * each got a silent success receipt for a different shape. Measured at the
- * objectui pin `53ded82b` before the declaration moved: `ObjectGrid.tsx`
- * lowers `schema.filter` through `toFilterNode`, whose rule-array arm maps
+ * each got a silent success receipt for a different shape. Measured before
+ * the declaration moved (read points recorded in `liveness/page.json`, row
+ * `regions`): the grid lowers `schema.filter` through `toFilterNode`, whose rule-array arm maps
* each rule to an AST node before `$filter` — the door every saved view's
* stored rules already take. The record and tuple forms are refused at
* `filter`; the migration prescription is the
@@ -5784,22 +4936,22 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
* The `z.unknown()` this door carried was a read-point record (#7751), the
* same vintage as its `filter` neighbour above and not an exception to the
* ruling: it receipted an array, a string and a bare NUMBER alike with
- * `success: true`, while `plugin-grid/src/index.tsx:222` has published
+ * `success: true`, while the grid's registration has published
* `type: 'array'` all along — so the html tier answered `type-mismatch` on a
* value this schema had just accepted.
*
- * Sequenced measurement-first, as this family has to be. Measured at the
- * objectui pin `53ded82b`: `ObjectGrid.tsx:1457` reads `schema.sort` and the
- * fetch path at `:1844-1851` carries an explicit `typeof === 'string'` arm
- * putting the clause on `$orderby` verbatim, beside the array arm that folds
- * `[{ field, order }]` onto the same parameter. ⚠️ At THIS pin the string is
- * therefore still lowered, and this door refuses a spelling the pinned
- * renderer honours — the ruled sequence, not an oversight: objectui#8221's
- * PR objectui#8758 (merged 2026-09-09, after this pin) drops the string arm from
- * `convertSortToQueryParams`, and the next pin bump carries it in. The array
- * is the spelling both ends already agree on today; the header-arrow read at
- * `:3998` hands `schemaSort` to `parseSchemaSort` as `TableSortItem[]`, the
- * array shape and not the string.
+ * Sequenced measurement-first, as this family has to be (read points
+ * recorded in `liveness/page.json`, row `regions`): the grid reads
+ * `schema.sort` and its fetch path carried an explicit `typeof === 'string'`
+ * arm putting the clause on `$orderby` verbatim, beside the array arm that
+ * folds `[{ field, order }]` onto the same parameter. ⚠️ When this was
+ * declared the string was therefore still lowered, and this door refused a
+ * spelling the renderer then honoured — the ruled sequence, not an
+ * oversight: objectui#8221's PR objectui#8758 (merged 2026-09-09) drops the
+ * string arm from `convertSortToQueryParams`. The array is the spelling both
+ * ends agree on; the header-arrow read hands `schemaSort` to
+ * `parseSchemaSort` as `TableSortItem[]`, the array shape and not the
+ * string.
*/
sort: z.array(SortItemSchema).optional()
.describe('Initial row order — the SortItem array form `[{ field, order }, ...]`, the one sort orthography every declared `sort` door on this platform shares; lowered to the wire `$orderby`. The legacy string clause (`name desc`) is refused — see migration `object-block-sort-item-array`'),
@@ -5810,10 +4962,10 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
* consumer half).
*
* The legacy second spelling of `sort`: a SINGLE `{ field, order }` pair the
- * renderer read only when `sort` was absent — measured at the `.objectui-sha`
- * pin (`190fbd01d`), `plugin-grid/src/ObjectGrid.tsx:1244-1246` (fetch path,
- * `$orderby` fallback) and `:2847` (header arrows, where it is wrapped
- * `[schema.defaultSort]` — the exact array shape `sort` carries). One intent,
+ * renderer read only when `sort` was absent (read points recorded in
+ * `liveness/page.json`, row `regions`) — the fetch path's `$orderby`
+ * fallback and the header arrows, where it is wrapped `[schema.defaultSort]`
+ * — the exact array shape `sort` carries. One intent,
* two spellings; only this repo's strictObject can refuse it (objectui's
* mirror schema is parity-test-only and parses nothing at runtime), so the
* retirement lands here and objectui#5861 retires the reads on its own
@@ -5862,14 +5014,13 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
* shape, and `DashboardWidgetConfigSchema` for an open bag with declared
* members.
*
- * Read points measured at objectui `d18322415`: `ObjectGrid.tsx:1209` and
- * `:1628` read `(schema.pagination as any)?.pageSize ?? schema.pageSize`,
- * `:4179` reads `schema.pagination?.pageSize` and `:4359`
- * `schema.pagination?.pageSizeOptions` — those two are the only members any
- * read point on this door names, and the objectui registry has published
- * this input as `type: 'object'` all along (`plugin-grid/src/index.tsx:223`),
+ * Read points recorded in `liveness/page.json`, row `regions`: the grid
+ * reads `(schema.pagination as any)?.pageSize ?? schema.pageSize`,
+ * `schema.pagination?.pageSize` and `schema.pagination?.pageSizeOptions` —
+ * those two are the only members any read point on this door names, and the
+ * objectui registry has published this input as `type: 'object'` all along,
* so a non-object value here was already answered `type-mismatch` one tier
- * down while this schema accepted it. `:4175` reads presence only
+ * down while this schema accepted it. Paging itself reads presence only
* (`schema.pagination !== undefined ? true : …`), which is why an authored
* `pagination: false` used to mean paging ON.
*/
@@ -5886,8 +5037,7 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
showSearch: z.boolean().optional().describe('Show the search box (read only when `searchableFields` is absent)'),
/**
* [#21445] The list view's own {@link RowHeightSchema}, by reference.
- * `resolveRowHeightMode` (`ObjectGrid.tsx:1311` at the pin `89cad75d55`)
- * admits exactly these five values — it tests membership against a table
+ * `resolveRowHeightMode` (read points recorded in `liveness/page.json`, row `regions`) admits exactly these five values — it tests membership against a table
* typed `Record`, so the renderer's set and this one are the
* same set — and answers `compact` for anything else, so `42` or `'huge'`
* rendered as a compact grid with no report.
@@ -5908,8 +5058,7 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
/**
* [#21445] Per-group numbers in a grouped grid's group headers. No list-view
* schema declares this member, so the shape is the one the grid reads:
- * `useGroupedData` and `useServerGroupHeaders` (`ObjectGrid.tsx:3095` /
- * `:3113` at the pin `89cad75d55`) take an array of `{ field, type }` and
+ * `useGroupedData` and `useServerGroupHeaders` (read points recorded in `liveness/page.json`, row `regions`) take an array of `{ field, type }` and
* compute each `type` — `sum`, `count`, `avg`, `min`, `max`,
* `count_distinct`, the query AST's own {@link AggregationFunction}
* vocabulary, by reference. `count` is the group's row count whatever
@@ -5925,8 +5074,9 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
* nowhere else): an ordered array of `{ condition, style }`, the first rule
* whose CEL predicate holds styling the row. The grid evaluates its rules
* through the same shared evaluator the list view uses
- * (`resolveConditionalFormatting`, `ObjectGrid.tsx:2964` at the pin
- * `89cad75d55`), so one declaration judges both doors. ⚠️ That evaluator
+ * (`resolveConditionalFormatting`; read points recorded in
+ * `liveness/page.json`, row `regions`), so one declaration judges both
+ * doors. ⚠️ That evaluator
* also tolerates two objectui-native rule spellings (`{ field, operator,
* value, backgroundColor, … }` and `{ expression, … }`); neither is declared
* on the list view, and the grid does not open a second dialect the list
@@ -5936,15 +5086,15 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
.describe('Conditional formatting rules — `[{ condition, style }]`, the same rules a list view declares: the first rule whose CEL `condition` holds applies its CSS `style` map to the row'),
/**
* [#21445] The list view's own {@link RowColorConfigSchema}, by reference:
- * `useRowColor` (`ObjectGrid.tsx:2955` at the pin `89cad75d55`) reads
- * exactly `field` and `colors`.
+ * `useRowColor` (read points recorded in `liveness/page.json`, row `regions`) reads exactly `field` and
+ * `colors`.
*/
rowColor: RowColorConfigSchema.optional()
.describe('Row colour by field value — `{ field, colors }`, the same block a list view\'s `rowColor` declares'),
/**
* [#21464] The list view's own `selection` member, by reference
- * (`SelectionConfigSchema`): the grid reads `selection.type`
- * (`ObjectGrid.tsx:4799-4812` at the pin `89cad75d55`) — `none` is off,
+ * (`SelectionConfigSchema`): the grid reads `selection.type` (read points
+ * recorded in `liveness/page.json`, row `regions`) — `none` is off,
* `single` and `multiple` are the two modes. ⚠️ An object with no `type`
* turns selection ON at that read (objectui#9837, ruling A-prime: presence
* enables), while the shared schema's own `type` default is `none`; that
@@ -5955,10 +5105,9 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
selection: ListViewSchema.shape.selection
.describe('Selection config `{ type }` — `none`, `single` or `multiple`, the same block a list view\'s `selection` declares'),
/**
- * [#21464] The legacy shorthand, read only when `selection` is absent
- * (`ObjectGrid.tsx:4813-4815` at the pin `89cad75d55`) and handed on as the
- * table's `selectable` (`:5333`), which `resolveSelectionMode`
- * (`components/src/renderers/complex/data-table.tsx:644`) reads as
+ * [#21464] The legacy shorthand, read only when `selection` is absent and
+ * handed on as the table's `selectable`, which `resolveSelectionMode` reads
+ * as
* `single`, off for a falsy value, and multiple for anything else — so the
* shape is the read's own declaration, `boolean | 'single' | 'multiple'`.
* Typed, not retired: retiring the second spelling is its own decision.
@@ -5967,8 +5116,7 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
.describe('Legacy selection shorthand, read only when `selection` is absent — `true` (multiple), `false` (off), `\'single\'` or `\'multiple\'`. Prefer `selection`'),
/**
* [#21464] The list view's own `rowActions` member, by reference: action
- * NAMES (`ObjectGrid.tsx:1834-1835` at the pin `89cad75d55` reads a
- * `string[]`; `edit` and `delete` select the row menu's generic entries,
+ * NAMES (the grid reads a `string[]`; `edit` and `delete` select the row menu's generic entries,
* any other name resolves against the object's actions).
*/
rowActions: ListViewSchema.shape.rowActions
@@ -5976,7 +5124,7 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
/**
* [#21464] The list view's own `bulkActions` member, by reference: action
* NAMES, which `resolveBulkActions` folds against the object's actions
- * (`ObjectGrid.tsx:4763` at the pin `89cad75d55`). An object entry such as
+ * (read points recorded in `liveness/page.json`, row `regions`). An object entry such as
* `{ name }` is the def vocabulary, which belongs on `bulkActionDefs`; the
* fold skipped it in silence.
*/
@@ -5984,8 +5132,7 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
.describe('Bulk action names shown on selection — the same list a list view\'s `bulkActions` declares; a full def goes on `bulkActionDefs`'),
/**
* [#21464] The alternate spelling of `bulkActions`, read FIRST
- * (`batchActions ?? bulkActions`, `ObjectGrid.tsx:4763` at the pin
- * `89cad75d55`), so it takes `bulkActions`'s def: one capability, one
+ * (`batchActions ?? bulkActions`), so it takes `bulkActions`'s def: one capability, one
* accept set. The list view declares only `bulkActions`; this second
* spelling is typed here, not retired — retiring it is its own decision.
*/
@@ -5994,8 +5141,7 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
/**
* [#21445] The list view's own bulk-action def, {@link BulkActionDefSchema},
* by identity — the element `ListViewSchema.bulkActionDefs` declares. The
- * grid folds these defs through `resolveBulkActions` (`ObjectGrid.tsx:4778`
- * at the pin `89cad75d55`) exactly as a list view's are folded, so the
+ * grid folds these defs through `resolveBulkActions` exactly as a list view's are folded, so the
* schema that refuses a no-op `custom` def there refuses it here.
*/
bulkActionDefs: z.array(BulkActionDefSchema).optional()
@@ -6003,8 +5149,9 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
/**
* [#21445] The list view's own {@link NavigationConfigSchema}, by reference
* — the same carrier `object-kanban`, `object-calendar` and
- * `object-timeline` take. `useNavigationOverlay` (`ObjectGrid.tsx:2894` at
- * the pin `89cad75d55`) types its own mode union as that schema's.
+ * `object-timeline` take. `useNavigationOverlay` types its own mode union as
+ * that schema's (read points recorded in `liveness/page.json`, row
+ * `regions`).
*/
navigation: NavigationConfigSchema.optional()
.describe('Row-click navigation config — the same block `ListViewSchema.navigation` declares ({ mode, size, openNewTab, preventNavigation })'),
@@ -6013,121 +5160,28 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
/**
* [#20694] Declared AHEAD of its reader, deliberately: objectui#11068 chose
* to BUILD arrow-key cell navigation for the grid, and this row is the spec
- * half triage folded in. At the pin `db11afd4967c` nothing read it (see the
- * block docblock above for the measurement), so an authored value changed
- * nothing then, and the describe carried the `[EXPERIMENTAL — not enforced]`
+ * half triage folded in. When it was declared nothing read it (see the block
+ * docblock above for the measurement), so an authored value changed nothing
+ * then, and the describe carried the `[EXPERIMENTAL — not enforced]`
* marker — the liveness ledger's own spelling for a declared-but-not-enforced
* key, and the record here because the `page/regions` container that holds
* page components is undrilled in the ledger
* (`undrilled-containers.baseline.json`), so no ledger row exists for any
* `ComponentPropsMap` key. This record said to drop the marker in the change
- * that lands the BUILD at the pin, and it is dropped here.
+ * that lands the BUILD, and it is dropped here.
*
- * Read at objectui `b9814b334` (re-read there 2026-10-14:
- * `ObjectGrid.tsx` changed across the hop from `1fb1ced36` (+327/-80:
- * objectui#12292, objectui#12303, objectui#12030 and objectui#12270) and
- * `data-table.tsx` changed (+320/-90: objectui#12322, objectui#12310 and
- * objectui#12292), no hunk on a cited line, so the five `data-table.tsx`
- * anchors MOVED with their lines byte-identical — `1025` -> `1128`, `2614` ->
- * `2839`, `3108` -> `3338`, `2264` -> `2489`, `2290` -> `2515` — and the two
- * grid anchors MOVED with their lines byte-identical — `5631` -> `5856`,
- * `1857` -> `1937`; no hunk lands between the viewer's write verdict
- * `objectInlineEditable` and `:1937`, so `inlineEditable` is still the
- * authored `editable` AND that verdict. The one hunk inside
- * `handleCellKeyDown` is its Enter branch, which now starts the edit on the
- * row's record rather than its index (objectui#12310); the arrow-key moves
- * between `navigationTarget` and it are untouched. At `1fb1ced36`, re-read
- * there 2026-10-12:
- * every objectui file this record cites is byte-identical across the hop from
- * `7578323a5` (`git diff --quiet`), so every anchor held unmoved. At
- * `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:
- * every objectui file this record cites is byte-identical across the hop from
- * `e5311165a` (`git diff --quiet`), so every anchor held unmoved. At
- * `e5311165a`, re-read there 2026-10-12:
- * `ObjectGrid.tsx` changed across the hop from `499799502` (+27/-11:
- * objectui#12110 and objectui#12143) and `data-table.tsx` changed (+12/-1:
- * objectui#12124 and objectui#12145: seven lines of default translations
- * above every cited read, one `aria-label` rewritten in place and four added
- * below them), so the five `data-table.tsx` anchors MOVED by 7 with their
- * lines byte-identical — `1018` -> `1025`, `2607` -> `2614`, `3101` -> `3108`,
- * `2257` -> `2264`, `2283` -> `2290` — and the two grid anchors MOVED with
- * their lines byte-identical — `5615` -> `5631`, `1851` -> `1857`; no hunk
- * lands between the viewer's write verdict `objectInlineEditable` and `:1857`,
- * nor in the arrow-key handling between `navigationTarget` and the end of
- * `handleCellKeyDown`, so `inlineEditable` is still the authored `editable`
- * AND that verdict. At `499799502`, re-read there 2026-10-11:
- * `ObjectGrid.tsx` changed across the hop from `0df67f237` (+89/-44:
- * objectui#12081 item 3 and objectui#12082) and `data-table.tsx` is
- * byte-identical (`git diff --quiet`), so the five `data-table.tsx` anchors
- * held unmoved and the two grid anchors MOVED with their lines
- * byte-identical — `5570` -> `5615`, `1850` -> `1851`; no hunk lands between
- * the viewer's write verdict `objectInlineEditable` and `:1851`, so
- * `inlineEditable` is still the authored `editable` AND that verdict. At
- * `0df67f237`, re-read there 2026-10-11:
- * `ObjectGrid.tsx` changed across the hop from `20c6d351a` (+82/-32:
- * objectui#12082, objectui#12103 and objectui#12105) and `data-table.tsx` is
- * byte-identical (`git diff --quiet`), so the five `data-table.tsx` anchors
- * held unmoved and the two grid anchors MOVED with their lines
- * byte-identical — `5520` -> `5570`, `1825` -> `1850`; the one hunk near them
- * re-wrote the viewer's write verdict `objectInlineEditable` above `:1850` to
- * read the affordance-to-grant map's `listInlineEdit` row (objectui#12082),
- * which asks the object's edit policy (the managed-object policy against the
- * effective API operations) and the update grant, so `inlineEditable` is
- * still the authored `editable` AND the viewer's write verdict. At
- * `20c6d351a`, re-read there 2026-10-10:
- * every objectui file this record cites is byte-identical across the hop from
- * `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At
- * `47b1f0bb7`, re-read there 2026-10-09:
- * `ObjectGrid.tsx` changed across the hop from `f0268ad78` (+19/-11:
- * objectui#11865 slice m, objectui `2063f7a96`: one import line, and the
- * grouped pager's rows-per-page picker drawn with the shared `Select`) and
- * `data-table.tsx` is byte-identical (`git diff --quiet`), so the two grid
- * anchors MOVED with their lines byte-identical — `5519` -> `5520`, `1824` ->
- * `1825` — the five `data-table.tsx` anchors `1018`, `2607`, `3101`, `2257`
- * and `2283` held unmoved, and no hunk lands in the arrow-key handling
- * between `navigationTarget` and the end of `handleCellKeyDown`. At
- * `f0268ad78`, re-read there 2026-10-09:
- * `ObjectGrid.tsx` (+85/-27: objectui#11880 item 5, objectui#6152 rounds 7 and
- * 10, objectui#11817, objectui#11809, objectui#11689) and `data-table.tsx`
- * (+434/-30: objectui#11816, objectui#11690, objectui#11682) changed across
- * the hop from `a58626c88` around the reads without touching one, so every
- * anchor MOVED with its line byte-identical — `5461` -> `5519`, `1815` ->
- * `1824`; `787` -> `1018`, `2235` -> `2607`, `2700` -> `3101`, `1964` ->
- * `2257`, `1990` -> `2283` — and no hunk lands in the arrow-key handling
- * between `navigationTarget` and the end of `handleCellKeyDown`. At
- * `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: `data-table.tsx` is byte-identical across the hop
- * from `2e818d0b5`, so its anchors held unmoved, and `ObjectGrid.tsx`
- * changed there in three type docblocks only (+9/-6, objectui#8347), above
- * both of its reads, which MOVED by +3 byte-identical — `5458` -> `5461` and
- * `1812` -> `1815`; at `2e818d0b5`, re-measured 2026-10-04, `ObjectGrid.tsx`
- * and `data-table.tsx` were
- * byte-identical across the hop from `ab1879721`, where they were measured
- * 2026-10-03; the BUILD is objectui `154075ab1`, objectui#11068):
- * `plugin-grid/src/ObjectGrid.tsx:5856` hands the data table
+ * Read points recorded in `liveness/page.json`, row `regions` (the BUILD is
+ * objectui `154075ab1`, objectui#11068): the grid hands the data table
* `keyboardNavigation: schema.keyboardNavigation ?? inlineEditable`, where
- * `inlineEditable` (`:1937`) is the authored `editable` AND the viewer's
- * write verdict — so an absent key follows whether the grid RENDERS
- * editable, `true` turns the navigation on for a read-only grid, and `false`
- * turns it off on an editable one. `components/src/renderers/complex/data-table.tsx`
- * (`keyboardNavigation = false` by default, `:1128`) then gives the table
- * `role="grid"` (`:2839`) and makes the data cells one roving Tab stop
- * (`tabIndex` 0 on one cell and -1 on the rest, `:3338`) that the arrow
- * keys, Home / End and Ctrl+Home / Ctrl+End move (`navigationTarget`,
- * `:2489`; `handleCellKeyDown`, `:2515`). A widget a cell renders keeps its
- * own Tab stop. Off, every data cell is its own Tab stop, as before.
+ * `inlineEditable` is the authored `editable` AND the viewer's write verdict
+ * — so an absent key follows whether the grid RENDERS editable, `true` turns
+ * the navigation on for a read-only grid, and `false` turns it off on an
+ * editable one. The data table (`keyboardNavigation = false` by default)
+ * then gives the table `role="grid"` and makes the data cells one roving
+ * Tab stop (`tabIndex` 0 on one cell and -1 on the rest) that the arrow
+ * keys, Home / End and Ctrl+Home / Ctrl+End move (`navigationTarget`;
+ * `handleCellKeyDown`). A widget a cell renders keeps its own Tab stop. Off,
+ * every data cell is its own Tab stop, as before.
*/
keyboardNavigation: z.boolean().optional()
.describe('Arrow-key cell navigation on the WAI-ARIA grid pattern: the grid\'s data cells become one Tab stop that the arrow keys, Home / End and Ctrl+Home / Ctrl+End move between. Defaults to on when the grid renders editable — `editable` set and the viewer allowed to edit; a grid that renders read-only keeps every cell its own Tab stop unless this is `true`, and `false` turns it off on an editable grid'),
@@ -6135,8 +5189,8 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
/**
* REMOVED (#21445, ADR-0049 enforce-or-remove; objectui#6152 ruling A,
* `resizable` is canonical). The legacy second spelling of `resizable`,
- * read only as `schema.resizable ?? schema.resizableColumns` — measured at
- * the `.objectui-sha` pin `89cad75d55`, `plugin-grid/src/ObjectGrid.tsx:5361`.
+ * read only as `schema.resizable ?? schema.resizableColumns` (read points
+ * recorded in `liveness/page.json`, row `regions`).
* One switch, two spellings, and a grid authoring both silently ignored this
* one. Zero writers in either repository, so there is no window. objectui#6152
* retires the read on its own schedule, once a released spec carries this.
@@ -6181,11 +5235,11 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
/**
* [#21445] The grid's built-in affordance toggles. No list-view schema
* declares this member, so the shape is the one the grid reads: four
- * booleans, each named by a read point at the pin `89cad75d55` — `create`
- * (the add-row affordance, `ObjectGrid.tsx:5468`), `update` / `delete` (the
- * row menu's generic Edit / Delete entries, `:1898-1899`) and `export`
- * (`:4088`, `:5340`, `:6141`). A declared block REPLACES the grid's default
- * rather than merging under it (`:1818-1822`), so a row affordance the block
+ * booleans, each named by a read point (recorded in `liveness/page.json`, row
+ * `regions`) — `create` (the add-row affordance), `update` / `delete` (the
+ * row menu's generic Edit / Delete entries) and `export` (the export menu
+ * and the table's `exportable`). A declared block REPLACES the grid's
+ * default rather than merging under it, so a row affordance the block
* does not name is withheld. Nothing reads `read` or `import`, which
* objectui's TypeScript twin declares; each is refused with that reason
* rather than accepted as a toggle that toggles nothing.
@@ -6194,8 +5248,9 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({
.describe('Built-in affordance toggles `{ create?, update?, delete?, export? }` (booleans). A declared block replaces the grid\'s default: `update` / `delete` not named are withheld from the row menu, `create` enables the add-row affordance, and `export: false` hides the export menu'),
/**
* Data source binding — `ViewDataSchema`, the #5090-pinned authority the
- * objectui registry declares against (`plugin-grid/src/index.tsx:225`
- * `type: 'object'`, held by `gridDataInputContract.test.ts`). Until the
+ * objectui registry declares against (a `data` input of `type: 'object'`,
+ * held by objectui's own contract test; read points recorded in
+ * `liveness/page.json`, row `regions`). Until the
* ui#6207 ruling (2026-08-25, Option A: 「同意」) this entry said
* `z.array(z.unknown())` — the bare-array spelling of the deprecated
* `staticData` shortcut — so the two spec authorities refused each other's
@@ -6226,14 +5281,13 @@ export type ObjectGridPropsParsed = z.infer;
/**
* [#21464] The `object-metric` tile's `aggregate` — the query behind its one
- * number, as the tile reads it at the `.objectui-sha` pin `89cad75d55`
- * (`plugin-dashboard/src/ObjectMetricWidget.tsx`): `field` and `function`
- * build the request and name the result column (`:403-443`, `computeOne`),
- * `function` also decides whether the field's unit dresses the number (`:305`,
- * `answersInFieldUnit`) and the `min` / `max` width (`:344-353`), and
- * `groupBy` routes a structured date-bucket node to the spec-shape query
- * (`:405-423`, `objectAggregateSpecQuery`) and is floored at the one `'_all'`
- * bucket when absent (`:427`).
+ * number, as the tile reads it (read points recorded in `liveness/page.json`,
+ * row `regions`): `field` and `function` build the request and name the
+ * result column (`computeOne`), `function` also decides whether the field's
+ * unit dresses the number (`answersInFieldUnit`) and the `min` / `max` width,
+ * and `groupBy` routes a structured date-bucket node to the spec-shape query
+ * (`objectAggregateSpecQuery`) and is floored at the one `'_all'` bucket when
+ * absent.
*
* The vocabulary is declared elsewhere, by reference; the SHAPE is the tile's
* own:
@@ -6243,15 +5297,14 @@ export type ObjectGridPropsParsed = z.infer;
* verbatim (`_` on the analytics wire, which answers
* `_count_distinct`; the function itself on the spec-shape query), and
* objectui's own pin of the unit rule classifies one row per member of that
- * enum and mounts each (`__tests__/ObjectMetricWidget.countNotCurrency-10356.test.tsx:102-124`),
- * so a `count_distinct` tile is drawn. The chart's five-function subset
+ * enum and mounts each, so a `count_distinct` tile is drawn. The chart's five-function subset
* (`ChartAggregateFunctionSchema`) is NOT this vocabulary: the chart leaves
* `count_distinct` out because the client-side fallback cannot compute it,
* and that fallback sums a `count_distinct` on the metric too — but the tile
* reads and draws it wherever the analytics service answers it, so the
* five would refuse a value the tile draws.
* - `groupBy` is the chart's {@link ChartGroupBySchema} — the tile types it as
- * `ChartAggregate['groupBy']` (`:150`) and routes its object arm the way the
+ * `ChartAggregate['groupBy']` and routes its object arm the way the
* chart does. Optional here: the chart requires it because an ungrouped chart
* draws nothing, while a metric paints one number and floors an absent one —
* every authored `object-metric` in the showcase writes `{ field, function }`
@@ -6297,15 +5350,13 @@ const ObjectMetricAggregateSchema = lazySchema(() => strictObject({
/**
* [#21464] The `object-metric` tile's static `trend` badge, as `MetricWidget`
- * draws it at the `.objectui-sha` pin `89cad75d55`
- * (`plugin-dashboard/src/MetricWidget.tsx:437-450`): `value` painted as
- * `{value}%`, `direction` choosing the arrow (`up` / `down` / `neutral`, no
- * glyph when absent), and `label` the caption, resolved with `pickLocalized`
- * (`:332-337`). The widget's own declared type is exactly these three
- * (`MetricWidget.tsx:242-246`, mirrored at `ObjectMetricWidget.tsx:176-181`).
- * No spec schema declares a trend badge, so the shape is the read's own. A
- * `compareTo`-derived trend replaces this one outright (`ObjectMetricWidget.tsx:595`,
- * `derivedTrend ?? trend`).
+ * draws it (read points recorded in `liveness/page.json`, row `regions`):
+ * `value` painted as `{value}%`, `direction` choosing the arrow (`up` /
+ * `down` / `neutral`, no glyph when absent), and `label` the caption, resolved
+ * with `pickLocalized`. The widget's own declared type is exactly these three,
+ * mirrored on `ObjectMetricWidget`. No spec schema declares a trend badge, so
+ * the shape is the read's own. A `compareTo`-derived trend replaces this one
+ * outright (`derivedTrend ?? trend`).
*/
const ObjectMetricTrendSchema = lazySchema(() => strictObject({
surface: 'this `object-metric` trend badge',
@@ -6321,14 +5372,13 @@ const ObjectMetricTrendSchema = lazySchema(() => strictObject({
/**
* [#21464] The `object-metric` tile's `drillDown` — the click-through to the
- * records behind the number, as the tile reads it at the `.objectui-sha` pin
- * `ab1879721595` (`plugin-dashboard/src/ObjectMetricWidget.tsx`): `enabled`
- * decides whether the tile is clickable (`:696`, `isDrillEnabled` — a present
- * block is on unless `enabled: false`), `title` heads the panel (`:708`,
- * `resolveDrillTitle` against an EMPTY click event, falling back to the tile's
- * `title`, then its `label`), and `target`, `columns` and `maxRows` reach the
- * shared `DrillDownDrawer` the tile opens (`:732-744`; `maxRows` defaults to
- * the tile's page size of 25). The drilled list is scoped by the metric's own
+ * records behind the number, as the tile reads it (read points recorded in
+ * `liveness/page.json`, row `regions`): `enabled` decides whether the tile is
+ * clickable (`isDrillEnabled` — a present block is on unless
+ * `enabled: false`), `title` heads the panel (`resolveDrillTitle` against an
+ * EMPTY click event, falling back to the tile's `title`, then its `label`),
+ * and `target`, `columns` and `maxRows` reach the shared `DrillDownDrawer` the
+ * tile opens (`maxRows` defaults to the tile's page size of 25). The drilled list is scoped by the metric's own
* resolved `filter`.
*
* Those five are the chart drill-down's own members, by reference
@@ -6339,8 +5389,8 @@ const ObjectMetricTrendSchema = lazySchema(() => strictObject({
* not the chart's, in two places:
*
* - `filter` and `mode` are REFUSED BY NAME, with the prescriptions objectui's
- * own type for this block carries (`ObjectMetricDrillDownConfig`,
- * `types/src/data-display.ts:2628`): a drill `filter` is interpolated
+ * own type for this block carries (`ObjectMetricDrillDownConfig`): a drill
+ * `filter` is interpolated
* against a click event and the metric has none, and `mode` chooses
* drill-to-record for a clicked row and the metric has no row. The chart's
* drill-down declares `filter`, which is why the chart's shape is not taken
@@ -6393,18 +5443,14 @@ const ObjectMetricDrillDownSchema = lazySchema(() => strictObject({
* `dataset`, a misspelled report key or a bare report name passed the
* component-props gate, and the drawer quietly listed the records instead.
*
- * Read at the `.objectui-sha` pin `2e818d0b51ec` (both files byte-identical
- * from `ab1879721595`, where the fork was measured, and at objectui `main`
- * `2abec3a96`): the tile hands `report` to the shared drawer verbatim
- * (`plugin-dashboard/src/ObjectMetricWidget.tsx:742`), and
- * `DrillDownDrawer.tsx` draws it as a `report` node when
- * `isDatasetBoundReport` holds (`:92`, used at `:115`) — a non-empty
- * `dataset`, or a `joined` report with a block that binds one — joining the
- * metric's filter into the report's own `runtimeFilter` (`:150-153`); any
- * other value lists the records. objectui types the member as this package's
- * `ReportSchema` author input (`types/src/data-display.ts`,
- * `SpecReportInput`), so the reference is the declaration both sides already
- * name.
+ * Read points recorded in `liveness/page.json`, row `regions`: the tile
+ * hands `report` to the shared drawer verbatim, and the drawer draws it as a
+ * `report` node when `isDatasetBoundReport` holds — a non-empty `dataset`, or
+ * a `joined` report with a block that binds one — joining the metric's filter
+ * into the report's own `runtimeFilter`; any other value lists the records.
+ * objectui types the member as this package's `ReportSchema` author input
+ * (`SpecReportInput`), so the reference is the declaration both sides
+ * already name.
*
* ## Admitted implies drawn
*
@@ -6432,14 +5478,13 @@ const ObjectMetricDrillDownSchema = lazySchema(() => strictObject({
/**
* [#21464] The `object-metric` tile's `compareTo` — the period-over-period
- * comparison, as the tile reads it at the `.objectui-sha` pin `ab1879721595`:
- * `kind` ALONE. `ObjectMetricWidget.tsx` runs a second aggregate over
- * `shiftFilterByCompareTo(filter, compareTo)` (`:522-523`) and labels the
- * derived trend with `compareToTrendLabelKey(compareTo, filter)` (`:675`);
- * both (objectui `core/src/utils/compare-to.ts:99`, `:124`) dispatch on
- * `compareTo.kind === 'previousYear'` (`:104`, `:128`) and treat every other
- * value as `previousPeriod`. The same file's header records `dimension` as
- * "deliberately never read on this path" (`:28-33`): this inline tile shifts
+ * comparison, as the tile reads it (read points recorded in
+ * `liveness/page.json`, row `regions`): `kind` ALONE. `ObjectMetricWidget`
+ * runs a second aggregate over `shiftFilterByCompareTo(filter, compareTo)` and
+ * labels the derived trend with `compareToTrendLabelKey(compareTo, filter)`;
+ * both dispatch on `compareTo.kind === 'previousYear'` and treat every other
+ * value as `previousPeriod`. The same module's header records `dimension` as
+ * "deliberately never read on this path": this inline tile shifts
* the date macros in its own `filter`, while a dashboard widget's dataset path
* hands `dimension` to the analytics executor, which shifts that time
* dimension's window.
@@ -6475,9 +5520,9 @@ const ObjectMetricCompareToSchema = lazySchema(() => strictObject({
}));
/**
- * `object-metric` (objectui `plugin-dashboard/src/ObjectMetricWidget.tsx` @
- * `eb7f586b`). The widget destructures every prop it reads
- * (`ObjectMetricWidgetProps`, :40-110 — the complete read set), and the
+ * `object-metric` (objectui's `ObjectMetricWidget`; read points recorded in
+ * `liveness/page.json`, row `regions`). The widget destructures every prop it
+ * reads (`ObjectMetricWidgetProps` — the complete read set), and the
* registry shell forwards the authored bag onto it. `columns`/`sort`/`limit`
* are deliberately absent — a metric is one aggregated number; the registry's
* own `ElementDataSourceMapping` comment records that they have no read site.
@@ -6502,146 +5547,22 @@ export const ObjectMetricPropsSchema = lazySchema(() => strictObject({
* scratch; #9881 / commit 60e0f900a recorded the accordion and tab items). This is the
* same record for the metric tile.
*
- * The key is LIVE at objectui `b9814b334` (re-read there 2026-10-14:
- * every objectui file this record cites is byte-identical across the hop from
- * `1fb1ced36` (`git diff --quiet`), so every anchor held unmoved. At
- * `1fb1ced36`, re-read there 2026-10-12:
- * every objectui file this record cites is byte-identical across the hop from
- * `7578323a5` (`git diff --quiet`), so every anchor held unmoved. At
- * `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:
- * every objectui file this record cites is byte-identical across the hop from
- * `e5311165a` (`git diff --quiet`), so every anchor held unmoved. At
- * `e5311165a`, re-read there 2026-10-12:
- * every objectui file this record cites is byte-identical across the hop from
- * `499799502` (`git diff --quiet`), so every anchor held unmoved. At
- * `499799502`, re-read there 2026-10-11:
- * every objectui file this record cites is byte-identical across the hop from
- * `0df67f237` (`git diff --quiet`), so every anchor held unmoved. At
- * `0df67f237`, re-read there 2026-10-11:
- * every objectui file this record cites is byte-identical across the hop from
- * `20c6d351a` (`git diff --quiet`), so every anchor held unmoved. At
- * `20c6d351a`, re-read there 2026-10-10:
- * every objectui file this record cites is byte-identical across the hop from
- * `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At
- * `47b1f0bb7`, re-read there 2026-10-09:
- * every objectui file this record cites is byte-identical across the hop from
- * `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At
- * `f0268ad78`, re-read there 2026-10-09:
- * every objectui file this record cites is byte-identical across the hop from
- * `a58626c88` (`git diff --quiet`), so every anchor held unmoved. At
- * `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 —
- * `ObjectMetricWidget.tsx`, `MetricWidget.tsx`, `MetricCard.tsx` and
- * `lazy-icon.tsx` are byte-identical to `2e818d0b5` (`git diff --quiet`), so
- * their anchors hold unmoved; `plugin-dashboard/src/index.tsx` (+37/-2)
- * gained objectui#11605's `requiresObject` gate on `ObjectMetricBlock` (six
- * lines above the `object-metric` registration) and turned the
- * registration's `objectName` input from a one-line `required: true` entry
- * into a commented, described, non-required one (twelve net lines above the
- * icon input), so its start MOVED `256` -> `262` and the icon input `281`
- * -> `299`, both byte-identical, still `{ name: 'icon', type: 'string' }`.
- * At `2e818d0b5`, re-derived there 2026-10-04 —
- * `ObjectMetricWidget.tsx`, `MetricWidget.tsx`, `MetricCard.tsx` and
- * `lazy-icon.tsx` are byte-identical to `ab1879721` (`git diff --quiet`), so
- * their anchors hold unmoved; `plugin-dashboard/src/index.tsx` (+13/-1)
- * gained objectui#11466's `DashboardMetricNodeSchema` type export, its
- * declared-node comment on the bare `metric` registration and a re-worded
- * `ObjectMetricBlock` docblock sentence, all above the `object-metric`
- * registration, so its start MOVED `244` -> `256` and the icon input `269`
- * -> `281`, both byte-identical, still `{ name: 'icon', type: 'string' }`.
- * At `ab1879721`, re-derived there 2026-10-03 —
- * `MetricCard.tsx` and `lazy-icon.tsx` are byte-identical to `89cad75d5`,
- * so their anchors hold unmoved and were re-read in place; the other three
- * files changed and every one of their anchors MOVED with its cited text
- * byte-identical, no hunk naming `icon`. `plugin-dashboard/src/index.tsx`
- * (+55/-22) marked the `metric` / `metric-card` registrations above the
- * `object-metric` one `skipFallback` (objectui#10859 batch 8 phase 2b,
- * the bare keys retired), so that registration's start MOVED `227` ->
- * `244` and the icon input `252` -> `269`, still `{ name: 'icon', type:
- * 'string' }`; `ObjectMetricWidget.tsx` (+108/-14: objectui#11526's
- * structured `groupBy` with a rule-list `filter`, objectui#11444's currency
- * and objectui#11475's percent faces) MOVED the destructure `255` -> `304`
- * and the forward `659` -> `753`; `MetricWidget.tsx` (+30/-10, the same
- * currency and percent faces) MOVED the resolve `351-360` -> `371-380` and
- * the draw `412-421` -> `432-441`. At `89cad75d5` (2026-10-02)
- * `plugin-dashboard/src/index.tsx`, `MetricWidget.tsx`, `MetricCard.tsx`
- * and `lazy-icon.tsx` are byte-identical to `31971ff1e`, so their anchors
- * hold unmoved and were re-read in place; `ObjectMetricWidget.tsx` changed
- * (+68/-4, objectui#11254: a `resolveFieldScale` import, the
- * `widthPattern` / `ownFractionDigits` helpers and the field-width
- * `inferredFormat` memo, none of it touching `icon`), and both its anchors
- * MOVED with their cited text byte-identical: the destructure `230` ->
- * `255`, the forward `595` -> `659`. At `31971ff1e` (2026-10-01)
- * `plugin-dashboard/src/index.tsx`, `ObjectMetricWidget.tsx`,
- * `MetricWidget.tsx`, `MetricCard.tsx` and `lazy-icon.tsx` were all
- * byte-identical to `e420df310`, so every anchor held unmoved and was
- * re-read in place; they were byte-identical to `db11afd49` across the hop
- * onto `e420df310` (2026-09-30) as well. At `db11afd49` (2026-09-29)
- * `MetricWidget.tsx` and `lazy-icon.tsx` are byte-identical to `dd3f7e1be`;
- * `ObjectMetricWidget.tsx` changed in one comment line (`:321`), so `:230` and
- * `:595` did not move; `plugin-dashboard/src/index.tsx` gained the
- * per-locale-map `label` / `description` / `title` input declarations
- * (objectui#10993), all below the registration's start and above the icon
- * input, so the registration start `:227` did not move and the icon input MOVED
- * `:237` -> `:252` with its text byte-identical, still `{ name: 'icon', type:
- * 'string' }`. At `dd3f7e1be` (2026-09-28)
- * `MetricWidget.tsx` and `lazy-icon.tsx` are byte-identical to `f8a9d0fb0`
- * (`git diff --quiet`); `plugin-dashboard/src/index.tsx` changed (+2/-2: a
- * comment and the `drillDown` input's description, objectui `526fc1125`),
- * neither near the icon, so `:227` and `:237` did not move and were re-read
- * in place; `ObjectMetricWidget.tsx` changed (+84/-17: the currency count
- * tile, objectui `6dc82a381`, the invalidation bus, objectui#10572, and the
- * `drillDown` refusal, objectui `526fc1125`), and both its anchors MOVED
- * with their cited text byte-identical: the destructure `181` -> `230`, the
- * forward `528` -> `595`. On the hop onto `f8a9d0fb0`, `index.tsx`,
- * `MetricWidget.tsx` and `lazy-icon.tsx` were byte-identical to `62597c588`
- * and `87af769e9`, and `ObjectMetricWidget.tsx` changed (objectui
- * `0651e7ab4`, the currency tile's decimals, objectui#10221), its two
- * anchors MOVING with their cited text byte-identical: the destructure `174`
- * -> `181`, the forward `483` -> `528`. On the hop onto
- * `87af769e9` (re-derived 2026-09-20) EVERY file in the chain moved, so no
- * anchor was carried there and each was re-READ: the `object-metric`
- * registration now begins at `:227`
- * and its icon input lands on `:237`. ⚠️ One thing the numbers do not
- * carry: that input's `label: 'Icon (Lucide name)'` member is GONE — the
- * whole registration dropped its per-input labels — so the key is still
- * PUBLISHED to the designer, now as a bare
- * `{ name: 'icon', type: 'string' }`. The four render-path anchors moved
- * with their cited text byte-identical), and the chain
- * runs three files:
- * `plugin-dashboard/src/index.tsx: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:383-392` resolves it via
+ * The key is LIVE (read points recorded in `liveness/page.json`, row
+ * `regions`), and the chain runs three files: the registration publishes it
+ * as a designer input on the registered `object-metric` block, a bare
+ * `{ name: 'icon', type: 'string' }`; `ObjectMetricWidget` destructures it
+ * and forwards it to `MetricWidget`; `MetricWidget` resolves it via
* `getLazyIcon(icon)` — guarded on `typeof icon === 'string'`, because the
- * React prop also accepts a ready-made node — and `:444-453` draws it in the
- * tinted square whose colour comes from `colorVariant`.
+ * React prop also accepts a ready-made node — and 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 92 and reads like the same read point, but nothing
+ * ⚠️ Do not re-anchor this to `MetricCard`. That sibling calls `getLazyIcon`
+ * too 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.
*
- * Vocabulary is Lucide via the `LazyIcon` module
- * (`components/src/lib/lazy-icon.tsx:98-112`): kebab-case or PascalCase,
+ * Vocabulary is Lucide via the `LazyIcon` module: kebab-case or PascalCase,
* normalised to kebab-case, degrading to the `Database` glyph when the name
* is not a real Lucide icon — the same slot the container icons use, and the
* opposite failure mode from `element:button`'s `icon`, which takes the older
@@ -6661,11 +5582,12 @@ export const ObjectMetricPropsSchema = lazySchema(() => strictObject({
* the family entry above on `object-grid` carries the ruling). This door was
* the one the family had to be sequenced behind: with `aggregate` the widget
* posts the filter as the `where` of `POST /analytics/query`, whose request
- * schema takes only a `FilterCondition`, and at the pin `a472b07` the adapter
- * posted an array verbatim — a 400 on every array form (#15828). At the pin
- * this repo builds against (`53ded82b`, objectui#7754) the adapter lowers an
- * authored array through `translateFilterArray` and the spec's own
- * `parseFilterAST` sink before the wire (`lowerAnalyticsFilterForWire`), so
+ * schema takes only a `FilterCondition`, and the adapter once posted an
+ * array verbatim — a 400 on every array form (#15828). Since objectui#7754
+ * the adapter lowers an authored array through `translateFilterArray` and
+ * the spec's own `parseFilterAST` sink before the wire
+ * (`lowerAnalyticsFilterForWire`; read points recorded in
+ * `liveness/page.json`, row `regions`), so
* the rule array reaches the analytics door as the condition it declares;
* `resolveFilterPlaceholders` walks arrays and objects alike, so the date
* macros and `{current_user_id}` still resolve. The record form is refused
@@ -6721,17 +5643,16 @@ export type ObjectMetricPropsParsed = z.infer;
/**
* [#21464] One `object-kanban` swimlane — the members the board reads off a
- * lane at the `.objectui-sha` pin `89cad75d55`, and nothing else. No list-view
- * schema declares a lane, so the shape is the read's own:
+ * lane, and nothing else (read points recorded in `liveness/page.json`, row
+ * `regions`). No list-view schema declares a lane, so the shape is the read's
+ * own:
*
* - `id` (string) — the bucketing key: a record whose `groupBy` value equals
- * it lands in this lane (`plugin-kanban/src/index.tsx:129-149`,
- * `bucketCardsIntoColumns`); `title` (string) — the heading, localized
- * against the `groupBy` picklist (`ObjectKanban.tsx:1168-1188`);
- * - `cards` — a STATIC board's own cards, kept ahead of the bucketed records
- * (`index.tsx:152-158`); `limit` — the WIP count at which the lane warns
- * (`KanbanImpl.tsx:540`, `:591`); `className` — the lane's styling channel
- * (`:568`); `collapsed` — the lane's initial collapsed state (`:742`).
+ * it lands in this lane (`bucketCardsIntoColumns`); `title` (string) — the
+ * heading, localized against the `groupBy` picklist;
+ * - `cards` — a STATIC board's own cards, kept ahead of the bucketed records;
+ * `limit` — the WIP count at which the lane warns; `className` — the lane's
+ * styling channel; `collapsed` — the lane's initial collapsed state.
*
* A card is a record row: `id` and `title` are typed (the two members the
* board identifies and heads a card by), and the rest of the card is that
@@ -6765,108 +5686,26 @@ const ObjectKanbanLaneSchema = lazySchema(() => strictObject({
}));
/**
- * `object-kanban` (objectui `plugin-kanban/src/ObjectKanban.tsx` +
- * `KanbanRenderer` in `plugin-kanban/src/index.tsx` @ `eb7f586b` — the board
- * forwards the authored bag on). Read points: `objectName`/`groupBy`
- * (throughout), `columns` (:474 — SWIMLANES, `{ id, title }` per `groupBy`
- * value or bare strings, NOT a field projection), `filter` (:198, the
- * `$filter` handoff), `data` (:217-224), `cardTitle`/`titleField` (:233),
- * `cardFields` (:322), `swimlaneField`/`grouping` (:518-519), and via the
- * forwarded schema `coverImageField`/`conditionalFormatting` (`KanbanRenderer`,
- * index.tsx — `ObjectKanban.tsx:1563` spreads the authored bag into it).
- * `quickAdd` sat on that forwarded list and is RETIRED (#17260, tombstoned
- * below): the sentence was true about the FORWARD and false about the READ,
- * which is how the key kept re-authorizing itself. `groupField` is the
- * DESIGNER's spelling with
- * zero read points (#7973 class) — aliased to the `groupBy` the board reads.
- * `limit` (#16503) was measured later, at objectui `b9814b334` (re-read there 2026-10-14:
- * `ObjectKanban.tsx` is byte-identical across the hop from `1fb1ced36` (`git
- * diff --quiet`), so the anchor did not move and was re-read in place. At
- * `1fb1ced36`, re-read there 2026-10-12:
- * every objectui file this record cites is byte-identical across the hop from
- * `7578323a5` (`git diff --quiet`), so every anchor held unmoved. At
- * `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:
- * every objectui file this record cites is byte-identical across the hop from
- * `e5311165a` (`git diff --quiet`), so every anchor held unmoved. At
- * `e5311165a`, re-read there 2026-10-12:
- * every objectui file this record cites is byte-identical across the hop from
- * `499799502` (`git diff --quiet`), so every anchor held unmoved. At
- * `499799502`, re-read there 2026-10-11:
- * every objectui file this record cites is byte-identical across the hop from
- * `0df67f237` (`git diff --quiet`), so every anchor held unmoved. At
- * `0df67f237`, re-read there 2026-10-11:
- * `ObjectKanban.tsx` changed across the hop from `20c6d351a`, +21/-1
- * (objectui#12082, objectui `5af42dbbd`: the card move reads the
- * affordance-to-grant map), two import lines above the anchor and every other
- * hunk below it, so the anchor was re-READ and MOVED `762` -> `764` with its
- * text byte-identical. At `20c6d351a`, re-read there 2026-10-10:
- * every objectui file this record cites is byte-identical across the hop from
- * `47b1f0bb7` (`git diff --quiet`), so every anchor held unmoved. At
- * `47b1f0bb7`, re-read there 2026-10-09:
- * every objectui file this record cites is byte-identical across the hop from
- * `f0268ad78` (`git diff --quiet`), so every anchor held unmoved. At
- * `f0268ad78`, re-read there 2026-10-09:
- * `ObjectKanban.tsx` is byte-identical across the hop from `a58626c88`
- * (`git diff --quiet`), so the anchor did not move and was re-read in place. At
- * `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 —
- * `ObjectKanban.tsx` changed across the hop from `2e818d0b5`, +35/-5
- * (objectui#8347: a type import edited in place, and a private
- * `GateBoundKanbanSchema` read type, a re-worded docblock and a widened
- * `schema` binding above the fetch), so the anchor was re-READ and MOVED
- * `722` -> `752` with its text byte-identical. At `2e818d0b5` (2026-10-04)
- * `ObjectKanban.tsx` was byte-identical across the hop from `ab1879721`
- * (`git diff --quiet`), so the anchor did not move. At `ab1879721`
- * (2026-10-03) `ObjectKanban.tsx` was byte-identical across the hop from
- * `89cad75d5` (`git diff --quiet`), so the anchor did not move and was
- * re-read in place.
- * At `89cad75d5` (2026-10-02) `ObjectKanban.tsx` was byte-identical across
- * the hop from `31971ff1e` (`git diff --quiet`), so the anchor did not move
- * and was re-read in place. At `31971ff1e` (2026-10-01)
- * `ObjectKanban.tsx` changed on that hop only in the comment above its
- * `navigation` read (+12/-14, objectui#8652: the key is now declared on
- * `ObjectKanbanSchema`), far below the anchor, which did not move and was
- * re-read in place. At `e420df310` (2026-09-30)
- * `ObjectKanban.tsx` changed on this hop, +40/-13: objectui#9853 renamed the
- * default `DEFAULT_KANBAN_LIMIT` to `DEFAULT_KANBAN_FETCH_BATCH_SIZE`, still
- * 100, on the anchor line itself, and objectui#11234 mounts an internal
- * `KanbanBoardCore` board. So the anchor was re-READ and MOVED `712` -> `722`,
- * now `$top: resolveRowLimit(schema.limit, DEFAULT_KANBAN_FETCH_BATCH_SIZE)`:
- * the same lowering under a renamed default. At `db11afd49` (2026-09-29)
- * `ObjectKanban.tsx` changed in one comment line only (`:1367`), so the anchor
- * did not move and was re-read in place. At `dd3f7e1be` (2026-09-28)
- * `ObjectKanban.tsx` changed on this hop, +44/-8 (objectui#10572's
- * invalidation bus, objectui#10663's error reset, objectui#10666, which
- * resolves the filter's context tokens before `$filter` — the member one line
- * above this anchor — and a line-neutral comment sweep, objectui
- * `1dae95a41`), so the anchor was re-READ and MOVED `687` -> `712` with
- * its text byte-identical. On the hop onto `f8a9d0fb0` the file changed
- * +16/-1 (objectui#10068 added the binding's `sort` as the query's
- * `$orderby`) and the anchor MOVED `676` -> `687` with its text
- * byte-identical; the file was
- * byte-identical across the hop onto `62597c588`, and was re-READ at
- * `87af769e9` 2026-09-20: it moved hard on that hop, +708/-79 against `53ded82bf`,
- * and this anchor is one the
- * numbers alone would have mis-carried: the read was a bare
- * `$top: schema.limit ?? DEFAULT_KANBAN_LIMIT` at `:264` and is now
- * `$top: resolveRowLimit(schema.limit, DEFAULT_KANBAN_LIMIT)`, objectui#9925
- * 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:764`, the `$top` of the
- * board's one query — its docblock below carries the four-face record.
+ * `object-kanban` (objectui's `ObjectKanban` renderer plus the
+ * `KanbanRenderer` its registry shell exports — the board forwards the
+ * authored bag on; read points recorded in `liveness/page.json`, row
+ * `regions`). Read points: `objectName`/`groupBy` (throughout), `columns`
+ * (SWIMLANES, `{ id, title }` per `groupBy` value or bare strings, NOT a field
+ * projection), `filter` (the `$filter` handoff), `data`,
+ * `cardTitle`/`titleField`, `cardFields`, `swimlaneField`/`grouping`, and via
+ * the forwarded schema `coverImageField`/`conditionalFormatting` (the board
+ * spreads the authored bag into `KanbanRenderer`). `quickAdd` sat on that
+ * forwarded list and is RETIRED (#17260, tombstoned below): the sentence was
+ * true about the FORWARD and false about the READ, which is how the key kept
+ * re-authorizing itself. `groupField` is the DESIGNER's spelling with zero
+ * read points (#7973 class) — aliased to the `groupBy` the board reads.
+ * `limit` (#16503) was measured later: a bare `$top: schema.limit ??
+ * DEFAULT_KANBAN_LIMIT` became `$top: resolveRowLimit(schema.limit,
+ * DEFAULT_KANBAN_FETCH_BATCH_SIZE)` (objectui#9925 put a refusal in front of
+ * it — a contract-refused row cap is dropped and reported instead of being
+ * sent; objectui#9853 renamed the default, still 100). The pinned fact is
+ * unchanged: `schema.limit` lowers into the `$top` of the board's one query —
+ * its docblock below carries the four-face record.
*/
export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({
surface: 'this `object-kanban`',
@@ -6885,11 +5724,11 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({
/**
* [#21464] Swimlanes: all bare value strings, or all lane objects
* ({@link ObjectKanbanLaneSchema}) — two array shapes, not one array of
- * either, because the board dispatches on the FIRST entry
- * (`ObjectKanban.tsx:1177-1188` at the pin `89cad75d55`): an object-first
- * mix sends each string down the object branch, a string-first mix is
- * ignored whole. The string arm draws only on a board with no `groupBy`
- * (`:1179-1186`), each value titling its own lane.
+ * either, because the board dispatches on the FIRST entry (read points
+ * recorded in `liveness/page.json`, row `regions`): an object-first mix
+ * sends each string down the object branch, a string-first mix is ignored
+ * whole. The string arm draws only on a board with no `groupBy`, each value
+ * titling its own lane.
*/
columns: z.union([
z.array(z.string()),
@@ -6899,9 +5738,10 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({
/**
* Base query filter — the `ViewFilterRule` ARRAY form, the one filter
* orthography every `filter` door in this map shares (#15449; the family
- * entry on `object-grid` carries the ruling). Measured at the objectui pin
- * `53ded82b` before the declaration moved: `ObjectKanban.tsx` hands
- * `schema.filter` verbatim to `$filter`, and `ObjectStackAdapter.convertQueryParams`
+ * entry on `object-grid` carries the ruling). Measured before the
+ * declaration moved (read points recorded in `liveness/page.json`, row
+ * `regions`): the board handed `schema.filter` verbatim to `$filter`, and
+ * `ObjectStackAdapter.convertQueryParams`
* lowers a rule array through `translateFilterArray` — the same door every
* list view's stored rule array takes. The record form is refused at
* `filter`; see migration
@@ -6917,241 +5757,22 @@ 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 objectui `b9814b334` (re-read there 2026-10-14:
- * `plugin-kanban/src/types.ts` (still no row-cap member), `ObjectKanban.tsx`,
- * `element-data-source.ts`, `ElementDataSourceGate.tsx` and
- * `plugin-kanban.mdx` are byte-identical across the hop from `1fb1ced36`
- * (`git diff --quiet`), so the query `757-767`, the default `:100`, the
- * `queryFilter` resolution `:626-627`, the import `:10`, `:268-272`,
- * `:218-220` and `:437-456` did not move, and the `limit` row and the `limit:
- * 250` snippet did not change; `plugin-kanban/src/index.tsx` changed only
- * below the mapping (+2/-2, objectui#12030, objectui `c5406c201`: a comment
- * re-cited to `18.0.0-next.0`), which did not move from `488-492`; and
- * `objectql.ts` (+15/-27, the same commit) changed only above the member,
- * which MOVED `4838` -> `4826` byte-identical, still inside
- * `ObjectKanbanSchema`. At `1fb1ced36`, re-read there 2026-10-12:
- * every objectui file this record cites is byte-identical across the hop from
- * `7578323a5` (`git diff --quiet`), so every anchor held unmoved. At
- * `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
- * re-read's record and no longer anchors here, are not among them
- * (`ListView.tsx` changed on this hop). At `088e0f705`, re-read there
- * 2026-10-12:
- * every objectui file this record cites is byte-identical across the hop from
- * `e5311165a` (`git diff --quiet`), so every anchor held unmoved. At
- * `e5311165a`, re-read there 2026-10-12:
- * every objectui file this record cites is byte-identical across the hop from
- * `499799502` (`git diff --quiet`), so every anchor held unmoved. At
- * `499799502`, re-read there 2026-10-11:
- * every objectui file this record cites is byte-identical across the hop from
- * `0df67f237` (`git diff --quiet`), so every anchor held unmoved. At
- * `0df67f237`, re-read there 2026-10-11:
- * `plugin-kanban/src/types.ts` (still no row-cap member),
- * `plugin-kanban/src/index.tsx`, `element-data-source.ts`,
- * `ElementDataSourceGate.tsx` and `objectql.ts` are byte-identical across the
- * hop from `20c6d351a` (`git diff --quiet`), so `488-492`, `:268-272`,
- * `:218-220`, `:437-456` and `4838` did not move; `plugin-kanban.mdx` changed
- * in its drag-and-drop feature bullet only (+5/-1), above the `limit` row and
- * the `limit: 250` snippet, neither of which changed; and `ObjectKanban.tsx`
- * changed (+21/-1, objectui#12082, objectui `5af42dbbd`: the card move reads
- * the affordance-to-grant map), so the type import `:10` did not move and the
- * default `:98` -> `:100`, the query `755-765` -> `757-767` and the
- * `queryFilter` resolution `:624-625` -> `:626-627` MOVED byte-identical. At
- * `20c6d351a`, re-read there 2026-10-10:
- * every objectui file this record cites is byte-identical across the hop from
- * `47b1f0bb7` (`git diff --quiet`) except `objectql.ts` (+14/-13, comments
- * only: objectui#12063, objectui `c7b30bd66`, and objectui#6152 round 15,
- * objectui `025341692`, re-word the `object-chart` legacy-axis docblocks),
- * whose every hunk is below the member, at `:5441` or later, so the member
- * `4838` did not move and is byte-identical, still inside
- * `ObjectKanbanSchema`; every other anchor held unmoved, and
- * `plugin-kanban/src/types.ts` still declares no row-cap member. At
- * `47b1f0bb7`, re-read there 2026-10-09:
- * every objectui file this record cites is byte-identical across the hop from
- * `f0268ad78` (`git diff --quiet`), so every anchor held unmoved, and
- * `plugin-kanban/src/types.ts` still declares no row-cap member. At
- * `f0268ad78`, re-read there 2026-10-09:
- * `ObjectKanban.tsx`, `plugin-kanban/src/types.ts` (still no row-cap member),
- * `element-data-source.ts`, `ElementDataSourceGate.tsx` and
- * `plugin-kanban.mdx` are byte-identical to `a58626c88` (`git diff --quiet`),
- * so the query `755-765`, the default `:98`, the `queryFilter` resolution
- * `:624-625`, the import `:10`, `:268-272`, `:218-220` and `:437-456` did not
- * move, and the `limit` row and the `limit: 250` snippet did not change;
- * `plugin-kanban/src/index.tsx` changed only below the mapping (+3/-3: a
- * comment re-cited to 17.7.0, and objectui#6152 round 8's `filter` input
- * description), which did not move from `488-492`; and `objectql.ts`
- * (+218/-125: objectui#6152 rounds 7 to 12, objectui#11880 item 5 and the
- * 17.7.0 moves) MOVED the member `4754` -> `4838` byte-identical, still
- * inside `ObjectKanbanSchema`.
- * At `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
- * 2026-10-05 — `plugin-kanban/src/types.ts` (still no row-cap member),
- * `element-data-source.ts` and `plugin-kanban.mdx` are byte-identical to
- * `2e818d0b5`, so `:268-272` did not move and the `limit` row and the
- * `limit: 250` snippet did not change; `ElementDataSourceGate.tsx` changed
- * only below `:600` (+75/-0, objectui#11605's `requiresObject` prop and its
- * "no object named" hint), so `:218-220` and `:437-456` did not move;
- * `ObjectKanban.tsx` changed (+35/-5, objectui#8347): the type import at
- * `:10` was edited in place and still imports `ObjectKanbanSchema` (beside
- * a new `SortConfig`), and above the query the component now reads
- * `schema` through a private `GateBoundKanbanSchema` — `ObjectKanbanSchema`
- * plus the gate-written `sort`, so `limit` is still `ObjectKanbanSchema`'s
- * member — so the default `:97` did not move and the query `715-725` ->
- * `745-755` and the `queryFilter` resolution `:584-585` -> `:614-615`
- * MOVED byte-identical; `plugin-kanban/src/index.tsx` (+34/-3) gained one
- * docblock line above the mapping (objectui#8347), which MOVED
- * byte-identical `487-491` -> `488-492`, and objectui#11605's
- * `requiresObject` gate and non-required `objectName` input below it; and
- * `objectql.ts` (+85/-45: objectui#11615, objectui#11266 and objectui#8347)
- * MOVED the member `4720` -> `4754` byte-identical, still inside
- * `ObjectKanbanSchema`. At `2e818d0b5`, re-measured there
- * 2026-10-04 — `ObjectKanban.tsx`, `plugin-kanban/src/types.ts` (still no
- * row-cap member), `plugin-kanban/src/index.tsx`, `ElementDataSourceGate.tsx`
- * and `element-data-source.ts` are byte-identical to `ab1879721`, so every
- * anchor in them held unmoved; `plugin-kanban.mdx` gained a `grouping`
- * Properties row below the `limit` row (objectui#11216), which, with the
- * `limit: 250` snippet, did not change; and `objectql.ts` changed only below
- * the member (objectui#11216's `grouping` declaration on
- * `ObjectKanbanSchema`), so `:4720` did not move. At `ab1879721`,
- * re-measured there 2026-10-03 — `ObjectKanban.tsx`, `plugin-kanban/src/types.ts` (still no
- * row-cap member), `ElementDataSourceGate.tsx`, `element-data-source.ts`
- * and `plugin-kanban.mdx` are byte-identical to `89cad75d5`, so the query
- * `715-725`, the default `:97`, the `queryFilter` resolution `:584-585`,
- * the import `:10`, `:218-220`, `:437-456` and `:268-272` did not move and
- * were re-read in place, and the `limit` row and the `limit: 250` snippet
- * did not change; `plugin-kanban/src/index.tsx` changed only below the
- * mapping (+3/-2: objectui#11438's 17.6.0 re-citation in the
- * `ObjectKanbanRenderer` docblock and objectui#11522's `{ condition, style }`
- * description on the `conditionalFormatting` input), which did not move
- * from `487-491`; and `objectql.ts` MOVED the member `4661` -> `4720`
- * byte-identical, still inside `ObjectKanbanSchema`. At `89cad75d5`,
- * re-measured there 2026-10-02 — `ObjectKanban.tsx`, `plugin-kanban/src/types.ts` (still no
- * row-cap member), `ElementDataSourceGate.tsx` and `element-data-source.ts`
- * are byte-identical to `31971ff1e`, so the query `715-725`, the default
- * `:97`, the `queryFilter` resolution `:584-585`, the import `:10`,
- * `:218-220`, `:437-456` and `:268-272` did not move and were re-read in
- * place; `plugin-kanban/src/index.tsx` changed only in the registration's
- * `navigation` docblock and input description (+7/-5, objectui#11293:
- * `page` now opens the record through the host's record navigator), far
- * below the mapping, which did not move from `487-491`; `objectql.ts`
- * MOVED the member `4588` -> `4661` byte-identical, still inside
- * `ObjectKanbanSchema`; and `plugin-kanban.mdx` rewrote its `navigation`
- * Properties row (objectui#11293) and gained a `swimlaneField` row
- * (objectui#11355), both below the `limit` row, which, with the
- * `limit: 250` snippet, did not change. At `31971ff1e`, re-measured there
- * 2026-10-01 — `plugin-kanban/src/types.ts` (still no row-cap member) and
- * `ElementDataSourceGate.tsx` are byte-identical to `e420df310`, so
- * `:218-220` and `:437-456` did not move; `ObjectKanban.tsx` changed only in
- * the comment above its `navigation` read (objectui#8652), below every
- * anchor here, so the query `715-725`, the default `:97`, the `queryFilter`
- * resolution `:584-585` and the import `:10` did not move;
- * `plugin-kanban/src/index.tsx` changed below the mapping (objectui#8652's
- * `navigation` input), which did not move from `487-491`;
- * `element-data-source.ts` changed above `savedViewRawLimit` (+33/-6,
- * objectui#8945's re-stated `dataSource.filter` note), which MOVED byte-identical `241-245` -> `268-272`;
- * `objectql.ts` MOVED the member `4430` -> `4588` byte-identical, still
- * inside `ObjectKanbanSchema`; and `plugin-kanban.mdx` gained a `navigation`
- * Properties row below the `limit` row, which, with the `limit: 250`
- * snippet, did not change. At `e420df310`, re-measured there
- * 2026-09-30 — `plugin-kanban/src/types.ts` (still no row-cap member),
- * `ElementDataSourceGate.tsx` and `element-data-source.ts` are
- * byte-identical to `db11afd49`, so `:218-220`, `:437-456` and `:241-245` did
- * not move; `ObjectKanban.tsx` changed (+40/-13) and its query CHANGED ONE
- * MEMBER: objectui#9853 renamed the default `DEFAULT_KANBAN_LIMIT` to
- * `DEFAULT_KANBAN_FETCH_BATCH_SIZE` (still `100`, now documented as the
- * board's fetch batch, not a page size), so `$top` reads
- * `resolveRowLimit(schema.limit, DEFAULT_KANBAN_FETCH_BATCH_SIZE)`, and the
- * query MOVED `705-715` -> `715-725`, the default `:88` -> `:97` and the
- * `queryFilter` resolution `:574-575` -> `:584-585`, while the import at
- * `:10` did not move; `plugin-kanban/src/index.tsx` lost the Quick Add
- * plumbing above the mapping (objectui#8285, objectui#11234), which MOVED
- * byte-identical `506-510` -> `487-491`; `objectql.ts` MOVED the member
- * `4302` -> `4430` byte-identical, still inside `ObjectKanbanSchema`; and
- * `plugin-kanban.mdx` changed around, not in, the `limit: 250` snippet and
- * its Properties row. At `db11afd49`, re-measured there 2026-09-29 —
- * `plugin-kanban.mdx`, `plugin-kanban/src/types.ts` and
- * `ElementDataSourceGate.tsx` are byte-identical to `dd3f7e1be`,
- * `plugin-kanban/src/index.tsx` too, `ObjectKanban.tsx` and
- * `element-data-source.ts` changed in comment lines only and none of their
- * cited lines, so those anchors did not move; `packages/types/src/objectql.ts`
- * gained declarations above the member, which is still inside
- * `ObjectKanbanSchema`, and MOVED `4139` -> `4302` with its text
- * byte-identical. At `dd3f7e1be`, re-measured there
- * 2026-09-28 — `plugin-kanban.mdx` is byte-identical to `f8a9d0fb0`; every
- * other file this block cites changed on this hop, and each anchor was
- * re-READ. Two changed CONTENT and say so where they are cited: the board's
- * query now sends `$filter: queryFilter`, the node's `filter` with its
- * context tokens resolved (objectui#10666), and the gate's limit branch now
- * asks whether the binding's cap is USABLE rather than present
- * (objectui#10016). `plugin-kanban/src/types.ts` changed only to stop
- * re-exporting `ColumnWidthConfig` (objectui#10582) and still declares no
- * row-cap member. Every other anchor MOVED with its cited text
- * byte-identical — the query `680-690` -> `705-715` apart from that one
- * member, `:85` -> `:88`, `index.tsx:507-511` -> `:506-510`,
- * `objectql.ts:3832` -> `:4139`, `ElementDataSourceGate.tsx:200-202` ->
- * `:218-220`, `element-data-source.ts:237-241` -> `:241-245` — and
- * `ObjectKanban.tsx:10` did not move. On the hop onto `f8a9d0fb0`,
- * `element-data-source.ts`, `plugin-kanban/src/types.ts` and
- * `plugin-kanban.mdx` were byte-identical to `62597c588`; every other file
- * this block cites changed on that hop, and each anchor was re-READ: the
- * board's query GAINED a member (objectui#10068's `$orderby` from the
- * binding's `sort`, between `$filter` and `$top`, `674-679` -> `680-690`)
- * and the data-source mapping gained `sort: true` (`447-450` -> `507-511`);
- * every other anchor MOVED with its cited text byte-identical — `:84` ->
- * `:85`, `:553` -> `:554`, `:559` -> `:565`, `:676` -> `:687`,
- * `objectql.ts:3735` -> `:3832`, `ElementDataSourceGate.tsx:316-331` ->
- * `:373-388` and `:192-194` -> `:200-202`, `ListView.tsx:2979` -> `:3067` and
- * `:2952` -> `:3040`, `ObjectView.tsx:1638` -> `:1666` and `:1579` ->
- * `:1607` — and `ObjectKanban.tsx:10` did not move. (`:554`, `:565`, `:687`
- * and the `ListView.tsx` / `ObjectView.tsx` pairs are that re-read's record
- * only: they anchored the view-face `kanban.limit` spread, a key #19228
- * retired before any release carried it, so this block no longer cites
- * them.) Every file here was
- * byte-identical across the hop onto `62597c588`. All four
- * anchors were re-READ at `87af769e9` 2026-09-20 — the hop that moved every
- * one of them, and RENAMED one face rather than shifting it), four
- * faces agree
- * while this map refused the key by name: the board's one query is
+ * ships, is documented and is in use). Read points recorded in
+ * `liveness/page.json`, row `regions` — four faces agree 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:757-767`, where `queryFilter` is
- * `schema.filter` with its context tokens resolved at `:626-627` —
- * objectui#10666; at `f8a9d0fb0` the member read `schema.filter` verbatim —
- * the default `100` at `:100`, named `DEFAULT_KANBAN_LIMIT` until
- * objectui#9853 — a REAL top-level `$top` since objectui#4025;
- * before that the cap sat under a `options` key no adapter read, and the
- * bare `??` became `resolveRowLimit` in objectui#9925, which drops and
- * reports a cap the contract refuses instead of sending it),
- * `OBJECT_KANBAN_DATA_SOURCE` maps `limit: 'limit'`
- * (`plugin-kanban/src/index.tsx:488-492`), the type the board reads `schema`
- * through is `ObjectKanbanSchema` — ⚠️ `KanbanSchema` was RETIRED on this hop
- * (maintainer ruling 2026-09-09) and `plugin-kanban/src/types.ts` no longer
- * declares the member at all — imported at `ObjectKanban.tsx:10` and
- * declaring `limit?: number` at `packages/types/src/objectql.ts:4826`,
- * and `content/docs/plugins/plugin-kanban.mdx`
- * teaches it with a typed snippet (`limit: 250`) plus a Properties row. So
- * an author following the published docs wrote a node the save gate
+ * resolveRowLimit(schema.limit, DEFAULT_KANBAN_FETCH_BATCH_SIZE) })`, where
+ * `queryFilter` is `schema.filter` with its context tokens resolved
+ * (objectui#10666) and the default is `100` (named `DEFAULT_KANBAN_LIMIT`
+ * until objectui#9853) — a REAL top-level `$top` since objectui#4025; before
+ * that the cap sat under an `options` key no adapter read, and the bare `??`
+ * became `resolveRowLimit` in objectui#9925, which drops and reports a cap
+ * the contract refuses instead of sending it; the registration's data-source
+ * mapping lowers `limit: 'limit'`; the type the board reads `schema` through
+ * is `ObjectKanbanSchema`, which declares `limit?: number` (`KanbanSchema`
+ * was RETIRED, maintainer ruling 2026-09-09); and objectui's own plugin
+ * guide teaches it with a typed snippet (`limit: 250`) plus a Properties
+ * row. So an author following the published docs wrote a node the save gate
* refused, with the same `unrecognized_keys` verdict a typo gets.
*
* Why the carrier is `limit` and not the bound view's `pagination.pageSize`
@@ -7159,11 +5780,10 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({
* table, not this key's. The component-level `dataSource.limit` overrides
* this key unconditionally; a bound named view's `pagination.pageSize` is
* LOWERED INTO it through the `limit: 'limit'` mapping only when this key is
- * unset (`react/src/element-data-source/ElementDataSourceGate.tsx:437-456`,
- * `readLimit`/`writeLimit` keyed by `ElementDataSourceLimitKey`; the branch
- * gained objectui#9899's presence-is-not-authorship test and a
- * `describeDisplacedRowLimit` report on the hop onto `f8a9d0fb0`). ⚠️ At
- * this pin the branch's `fromView` is
+ * unset (the gate's `readLimit`/`writeLimit` keyed by
+ * `ElementDataSourceLimitKey`; the branch gained objectui#9899's
+ * presence-is-not-authorship test and a `describeDisplacedRowLimit` report).
+ * ⚠️ The branch's `fromView` is
* `!isUsableRowLimit(binding.config?.limit)` rather than
* `binding.config?.limit === undefined` (objectui#10016): a binding cap the
* contract REFUSES is not authored and yields to the view's cap. Every cap
@@ -7175,8 +5795,8 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({
* EXACTLY right on this face — a correction to a correction, measured
* 2026-09-21T10:20Z. The branch is
* `if (!fromView || !isUsableRowLimit(authored))`, and
- * `isUsableRowLimit` is `typeof v === 'number' && Number.isInteger(v) && v > 0`
- * (`ElementDataSourceGate.tsx:218-220`), and this key's accept set
+ * `isUsableRowLimit` is `typeof v === 'number' && Number.isInteger(v) && v > 0`,
+ * and this key's accept set
* (`z.number().int().positive()`) is a SUBSET of it — ⛔ not the same set,
* and the difference is reachable: `2^53 + 2` is refused here (zod 4's
* `.int()` is safe-integer, `too_big`) and `Number.isInteger` calls it
@@ -7190,8 +5810,7 @@ export const ObjectKanbanPropsSchema = lazySchema(() => strictObject({
* beside the parse pins in `component.test.ts` rather than as prose.
*
* ⚠️ And the view half is `pagination.pageSize` ALONE on this face.
- * `savedViewLimit` does fall back to a flat `view.limit`
- * (`core/src/data-scope/element-data-source.ts:268-272`), but that names a
+ * `savedViewLimit` does fall back to a flat `view.limit`, but that names a
* THIRD face — a saved-view RECORD as the adapter's `listViews()` returns it
* — not an authored view document. Measured on this tree: `ListViewSchema`
* REFUSES a flat `limit` with `unrecognized_keys: ["limit"]`, the same