Skip to content

Commit 2acff87

Browse files
chore(objectui): move the console pin to 9646e2ed2bf3 (objectui#12185, objectui#12183) (#15204 C9) (#23018)
Part of #15204 Clause-②: no **The console pin hop `088e0f705520` → `9646e2ed2bf3`** (objectui `main`, `9646e2ed2bf315a6ae99b2a1633bc7c7d162f7b9`, exactly that commit). This hop exists for objectui#12185 (`d928c8394`, objectui#12183). Under a wall (`isolated` / `group`), Setup's security catalog pages (position, permission set, capability) are read-only for a tenant and say why, while the platform operator keeps write. The server already refuses those writes (#22895, #22935). **Tier:** no governed surface (`GOVERNED_SURFACES` in `scripts/pm/check-governed-merges.mjs`). 20 files. ## The hop: 9 objectui commits, all on objectui `main` - `d928c8394`, objectui#12185 (objectui#12183): under a wall, the catalog pages are read-only for a tenant and say why; - `9646e2ed2`, objectui#12193: the fallback email-template form stops offering the retired `category` / `isSystem` keys; - `5dd583f5e`, objectui#12199: a gallery card whose title field is a lookup draws the referenced name; - `26b0bd2d1`, objectui#12189, and `35a2b59a5`, objectui#12180: objectui#6349 batches 12 and 11 (one authority each for the FilterBuilder types, `DataSource`, `DomProps`, `SchemaNode`); - `5b20aed39`, objectui#12181: a hatch-elevated type's packaged item opens read-only; - `b0c5f9ddf`, objectui#12177: Studio names an environment overlay, not an org overlay; - `0f31c3a03`, objectui#12186 (CLI test) and `7e30d0b6e`, objectui#12182 (docs deploy CI): ship no console code. ## The pin round, as #22967's **Console Pin Gate steps, run locally** (each exited 0): 1. Client build: `turbo run build --filter=@objectstack/client...`. 2. `scripts/build-console.sh` at the pin. 3. `check:console-sha`: "Console dist matches the objectui pin (objectui@9646e2ed2bf3)". 4. `check:console-injection --require-stamp`. **Artefacts that travel with the pin:** - **Console changeset.** `scripts/bump-objectui.sh` generated `.changeset/console-9646e2ed2bf3.md`: `@objectstack/console` **minor**, the level #22967 used (also the level the script derived from objectui's own changesets). It has 13 releasing entries and 0 breaking, so there is no ADR-0087 placeholder. One commit carries no changeset and is listed by subject. `Clause-②: no` was added by hand, as in #22967. `check:objectui-changeset` passes. - **SDUI manifest.** `node scripts/gen-sdui-manifest-node.mjs`: `sdui.manifest.json` is byte-identical across the hop (107 components), and `scripts/sdui-manifest.record.json` is re-recorded at the pin. `check-sdui-manifest` passes. - **Lockstep record.** `pnpm gen:sdui-lockstep` re-records `packages/sdui-parser/objectui-lockstep.json` at `9646e2ed2bf3`. objectui's `sdui-parser` changed on this hop (objectui#12180's type renames), and `check:sdui-lockstep` still passes: 214 grammar lines are byte-identical, all 25 diagnostic codes agree, and the `not-a-container` predicate agrees. **No parser port is owed.** - **Pin citations, re-measured for this hop only** (re-measure, never find-and-replace): - one file that any record cites changed on the hop: `plugin-list/src/ListView.tsx` (+9/-9, objectui#12189, the FilterBuilder group type's rename). All nine lines were replaced in place (`:13`, `:324`, `:326`, `:332`, `:399`, `:756`, `:774`, `:777`, `:1558`), so **no line in the file moved** and no cited range contains a changed line. Its `case 'kanban'` / `'calendar'` / `'timeline'` / `'gantt'` / `'map'` / `'tree'` arms held at `3762` / `3813` / `3902` / `3959` / `4079` / `4120-4144`. `resolveListMapConfig` `:209-214` and `resolveTimelineDateBinding` `:695-699` held too, each ending before the next changed line below it; - the records citing it got hand-written hop sentences: the four view-type rows of the functional-completeness table (`calendar`, `gantt`, `timeline`, `map`), plus the `object-gantt` and flat-`TreeConfig` records in `component.zod.ts`. The `kanban` row-cap record names `ListView.tsx` / `ObjectView.tsx` only as an earlier re-read's record, and its sentence says so; - every other record cites only files that are byte-identical across the hop, and each gains a hop sentence saying so. Every cited objectui file was resolved against the tree at the pin and checked with `git diff --quiet 088e0f705520 9646e2ed2bf3 -- <path>`, one file at a time; bare names (`index.tsx`, `types.ts`, `button.tsx`) were resolved by their record's context. That covers `form.tsx`, `autoLayout.ts`, `field-type-alias.ts`, `ObjectCalendar.tsx`, the `en` / `zh` / `de` packs, `data-objectstack/src/index.ts` and the action renderers, so the `FormField.span` describe's claim holds (pin re-stamped, `content/docs/references/ui/view.mdx` regenerated by `check:generated --fix`, the only stale artifact); - the six migration entries were recounted with `git grep -o -F`, which reproduces every `088e0f705520` figure exactly. The corpus is 8540 files, and every retired name each entry counts still reads 0. A superset was counted to be safe: every current export of `plugin-lifecycle-advanced.zod.ts`, `metrics.zod.ts` and `tracing.zod.ts`, plus every key each entry names. Every term is 0 except the unrelated `Span` 519 / `SpanSchema` 57, which the tracing entry already explains and which are unchanged. The lit controls moved with the corpus, e.g. `objectstack` 18400 → 18438, `tenant` 1365 → 1393; - `check:objectui-pin-citations --verify-anchors`: 55 asserting citations match `9646e2ed2`, and the 13 quoted anchors verify against objectui at the pin. `gen:migration-registry` regenerates the six generated-registry rows; - changeset `.changeset/objectui-pin-citations-9646e2ed2bf3.md`: `@objectstack/spec` patch, `Clause-②: no`. ## Browser check, against this branch's built console `examples/app-showcase` was booted `--fresh` on this branch's console dist (Playwright, Chromium), once per posture. **Harness note:** as committed, the showcase cannot boot walled. It does not declare `@objectstack/organizations`, and the CLI refuses a walled posture without it (ADR-0093 D5). A walled boot also needs `OS_PLATFORM_OWNER_EMAIL` and a declared `OS_AUTH_MEMBERSHIP_POLICY`. For the `isolated` and `group` runs I added the dependency to the showcase's `package.json` locally and uncommitted, set `OS_PLATFORM_OWNER_EMAIL=admin@objectos.ai` and `OS_AUTH_MEMBERSHIP_POLICY=invite-only`, and reverted both files afterwards. `/auth/config` served `tenancyPosture: isolated` / `group` with `degradedTenancy: false`. **Tenant fixture (each walled run):** `tenant@wall.test` owns organization "Tenant A". The operator authored a runtime permission set `w_meta_author` (`manage_metadata`) and a runtime position `wall_demo_pos`, and granted `w_meta_author` to the tenant inside Tenant A. The tenant's `/auth/me/permissions` carries `manage_metadata`, and its session reads `isPlatformAdmin: false`. The server refuses the tenant's `PUT /meta/position/wall_probe` with `403 FORBIDDEN` naming the posture. | | position list / editor | permission-set list / editor | capability list / editor | |:--|:--|:--|:--| | **`isolated`, tenant** | no New; `catalog-readonly-reason`; editor `walled-catalog-readonly-banner`, no Design / Save / Delete, Delegatable switch disabled | no New; reason line; editor `perm-walled-readonly`, badge "Read-only (the platform operator defines this catalog)", no Save / Clone | read-only by the package lock ("locked … `com.example.showcase@0.1.0`"), the type's own tier, as objectui#12185 specifies for a stock capability | | **`isolated`, operator** | New offered; editor in Design with editable fields and the save / delete affordances | New offered; editor offers Save | read-only (code-only type: the server refuses a runtime capability for everyone, `allowRuntimeCreate=false`) | | **`group`, tenant** | as `isolated` | as `isolated` | as `isolated` | | **`group`, operator** | as `isolated`; **a label edit auto-saved**: `PUT /meta/position/wall_demo_pos?mode=draft` → 200 | as `isolated` | as `isolated` | | **`single`, non-operator `manage_metadata` holder** (`author@single.test`, `isPlatformAdmin: false`) | New offered, editor editable, no wall notes; **a label edit auto-saved**: `PUT …?mode=draft` → 200 | New offered; editor offers Save | read-only (type tier, as before) | The one enabled switch on the tenant's permission-set editor is the matrix's "Only granted" view filter, not a write. **User page grant pickers** (`single`, as the operator, on `author@single.test`'s record): the Positions tab's New opens the grant form, and `registry-ref-position` lists 17 positions (16 stock plus `wall_demo_pos`). The Permission Sets tab's New opens `registry-ref-permission`, which lists 18 permission sets. Picking `auditor` and `showcase_auditor` and pressing Create wrote both rows (`POST /data/sys_user_position` → 201, `POST /data/sys_user_permission_set` → 201), confirmed through the data API. **`everyone` is still listed** among the positions: the open objectui finding #22967 carried, unchanged by this hop. Also seen, not this hop's: a fresh workspace opens the "Set the workspace timezone" dialog over Setup until it is dismissed. ## Verification (local) - full `turbo run build` green (74/74, none cached); - `check:generated`: 14/14 current after the `view.mdx` regeneration; - `dispatch-gates --ran`: 125 derived families. The sweep was running when this draft opened, and its verdict follows in a comment. --- 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_018yfmohHttjK9aTbKnZLuDr --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 3071d3e commit 2acff87

20 files changed

Lines changed: 259 additions & 55 deletions

‎.changeset/console-9646e2ed2bf3.md‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
---
2+
"@objectstack/console": minor
3+
---
4+
5+
Console (objectui) refreshed to `9646e2ed2bf3`. Frontend changes in this range:
6+
7+
Derived from the changesets objectui declared over the range — 13 releasing of 14 changesets added across 9 non-merge commits; omitted: 1 release-nothing changeset, 1 commit carrying no changeset (they ship no package code).
8+
9+
- **minor** — The FilterBuilder's row and group types are exported as `FilterBuilderRow` and `FilterBuilderRowGroup` instead of `FilterBuilderCondition` and `FilterGroup` (objectui#6349, batch… (objectui `26b0bd2d1`)
10+
- **minor** — `FilterBuilderOperator` is no longer exported from this package (objectui#6349, batch 12). It was `@objectstack/spec`'s `ViewFilterOperator`, the protocol's canonical view-filter… (objectui `26b0bd2d1`)
11+
- **minor** — The result type of this package's `toDomProps` is declared and exported as `FieldDomProps` instead of `DomProps` (objectui#6349, batch 11). `@object-ui/core` publishes a different… (objectui `35a2b59a5`)
12+
- **minor** — The node type of the tree this package's parser produces is declared and exported as `ParsedSchemaNode` instead of `SchemaNode` (objectui#6349, batch 11). `@object-ui/types` publi… (objectui `35a2b59a5`)
13+
- **patch** — The Studio fallback form for an email template no longer offers `category` or `isSystem`, and the fallback skill form no longer offers `triggerPhrases` (objectstack-ai/objectstack… (objectui `9646e2ed2`)
14+
- **patch** — A gallery card whose title field is a lookup now shows the referenced record's name, not `[object Object]` (objectui#12188). (objectui `5dd583f5e`)
15+
- **patch** — The list view's URL filter state reads the FilterBuilder's group by `@object-ui/components`' new name for it, `FilterBuilderRowGroup` (it was exported as `FilterGroup`; objectui#6… (objectui `26b0bd2d1`)
16+
- **patch** — `ListViewProps.onFilterChange` and `ListViewProps.initialFilters` now name the advanced-filter group by `@object-ui/components`' new name for it, `FilterBuilderRowGroup` (it was e… (objectui `26b0bd2d1`)
17+
- **patch** — `toFilterGroup` now declares its return type by `@object-ui/components`' new name for the FilterBuilder's group, `FilterBuilderRowGroup` (it was exported as `FilterGroup`; objectu… (objectui `26b0bd2d1`)
18+
- **patch** — Under a tenancy wall (`isolated` or `group`), the security catalog's pages are read-only for everyone but the platform operator, and say why (objectui#12183). (objectui `d928c8394`)
19+
- **patch** — `DataSource` inside this package is now a re-export of `@object-ui/types`' `DataSource`, the one adapter contract, instead of an older and looser second declaration of it (objectu… (objectui `35a2b59a5`)
20+
- **patch** — On a metadata type the `OS_METADATA_WRITABLE` hatch elevates, an item a package ships now opens read-only in the metadata editor and in the permission matrix, and an item no packa… (objectui `5b20aed39`)
21+
- **patch** — Studio's landing page and the permission matrix name the overlay that exists: an environment overlay, not an org overlay (objectui#12171). (objectui `b0c5f9ddf`)
22+
23+
**In this console build, declared nowhere** — objectui merged 1 commit in this range with no `.changeset/*.md`. The code is inside the pin above and ships here, but nothing upstream declared it, so it appears in no objectui CHANGELOG and in no entry above. Listed by subject rather than counted, because a count cannot tell a dependency bump from a form-behaviour change (objectstack#6174); the upstream gate that would prevent this is objectui#3387.
24+
25+
- _(no changeset)_ ci(site): deploy the docs from a GitHub Actions workflow every 6 hours, and turn Vercel's Git-triggered builds off (objectui#12178) (#12182) (objectui `7e30d0b6e`)
26+
27+
Clause-②: no
28+
29+
objectui range: `088e0f705520...9646e2ed2bf3`
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
---
2+
'@objectstack/spec': patch
3+
---
4+
5+
The spec's objectui citations, and the shipped description text that names the `.objectui-sha` pin (the `FormField.span` describe and six migration-entry descriptions), are re-measured against the new console pin, objectui `9646e2ed2bf3`.
6+
7+
Clause-②: no
8+
9+
Every anchor was mapped through the objectui diff `088e0f705520..9646e2ed2bf3`: 64 paths over 9 commits. One file that any record cites changed on the hop: `plugin-list/src/ListView.tsx` (+9/-9, objectui#12189, objectui `26b0bd2d1`, which renames the FilterBuilder group type to `FilterBuilderRowGroup`). All nine lines were replaced in place, the last at `:1558`, so no line in the file moved and no cited range contains a changed line:
10+
11+
- the `kanban` / `calendar` / `gantt` / `timeline` / `map` / `tree` arms of its per-type props builder held at `3762` / `3813` / `3959` / `3902` / `4079` / `4120-4144`;
12+
- `resolveListMapConfig` (`:209-214`) and `resolveTimelineDateBinding` (`:695-699`) held, and each ends before the next changed line below it (`:324`, `:756`).
13+
14+
That file is cited by the four view-type rows of the functional-completeness table (`calendar`, `gantt`, `timeline`, `map`) and by the `object-gantt` and flat-`TreeConfig` records. Each of those gains a hop sentence naming it. The `kanban` row-cap record names `ListView.tsx` only as an earlier re-read's record, and its sentence says so.
15+
16+
Every other record cites only files that are byte-identical across the hop (`git diff --quiet`, checked file by file), and each gains a hop sentence that says so. That covers `form.tsx`, so `FormField.span: 'full'` still takes the whole row at every multi-column tier.
17+
18+
The six migration entries' corpus counts were re-taken with `git grep -o -F`, the method that reproduces every `088e0f705520` number. The corpus is now 8540 tracked files, and every retired name each entry counts still reads 0. The lit controls moved with the corpus, for example `objectstack` from 18400 to 18438, `tenant` from 1365 to 1393 and `useState` from 2661 to 2662.
19+
20+
No key, default, enum member or export moves.

‎.objectui-sha‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
088e0f705520e82bee1d65a5fa3c1f7a26672dde
1+
9646e2ed2bf315a6ae99b2a1633bc7c7d162f7b9

‎content/docs/references/ui/view.mdx‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ Column footer summary configuration
213213
| **required** | `boolean` | optional | Required override |
214214
| **hidden** | `boolean` | optional | Hidden override |
215215
| **colSpan** | `integer` | optional | Absolute column span (1-4). The renderer clamps it to the form grid's current column count, so the cell starts at a real column boundary at every surface width and never overflows (`colSpan: 4` in a 3-column grid renders as 3); a `colSpan` within the column count renders as authored, and `colSpan: 1` emits no span class at all. |
216-
| **span** | `Enum<'auto' \| 'full'>` | optional (default: `"auto"`) | Relative field width. 'auto' (default — omit it): the renderer sizes the field from its widget type × the current column count — at the pin this repo builds against (`.objectui-sha` = `088e0f705520`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. |
216+
| **span** | `Enum<'auto' \| 'full'>` | optional (default: `"auto"`) | Relative field width. 'auto' (default — omit it): the renderer sizes the field from its widget type × the current column count — at the pin this repo builds against (`.objectui-sha` = `9646e2ed2bf3`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. |
217217
| **widget** | `string` | optional | Custom widget/component name (overrides type-based inference) |
218218
| **language** | `string` | optional | Code editor language (for type=code) |
219219
| **keyField** | `{ field?: string; label?: string \| Record<string, string>; placeholder?: string \| Record<string, string>; helpText?: string \| Record<string, string>; … }` | optional | Key column config for record-typed fields |
@@ -343,7 +343,7 @@ Form-view select option — the object-field option shape minus the per-option `
343343
| **required** | `boolean` | optional | Required override |
344344
| **hidden** | `boolean` | optional | Hidden override |
345345
| **colSpan** | `integer` | optional | Absolute column span (1-4). The renderer clamps it to the form grid's current column count, so the cell starts at a real column boundary at every surface width and never overflows (`colSpan: 4` in a 3-column grid renders as 3); a `colSpan` within the column count renders as authored, and `colSpan: 1` emits no span class at all. |
346-
| **span** | `Enum<'auto' \| 'full'>` | optional (default: `"auto"`) | Relative field width. 'auto' (default — omit it): the renderer sizes the field from its widget type × the current column count — at the pin this repo builds against (`.objectui-sha` = `088e0f705520`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. |
346+
| **span** | `Enum<'auto' \| 'full'>` | optional (default: `"auto"`) | Relative field width. 'auto' (default — omit it): the renderer sizes the field from its widget type × the current column count — at the pin this repo builds against (`.objectui-sha` = `9646e2ed2bf3`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. |
347347
| **widget** | `string` | optional | Custom widget/component name (overrides type-based inference) |
348348
| **language** | `string` | optional | Code editor language (for type=code) |
349349
| **keyField** | `{ field?: string; label?: string \| Record<string, string>; placeholder?: string \| Record<string, string>; helpText?: string \| Record<string, string>; … }` | optional | Key column config for record-typed fields |

‎packages/sdui-parser/objectui-lockstep.json‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
],
77
"objectui": {
88
"repo": "https://github.com/objectstack-ai/objectui.git",
9-
"rev": "088e0f705520e82bee1d65a5fa3c1f7a26672dde",
10-
"revDate": "2026-10-12T03:19:24+00:00",
9+
"rev": "9646e2ed2bf315a6ae99b2a1633bc7c7d162f7b9",
10+
"revDate": "2026-10-12T08:01:27+00:00",
1111
"source": "packages/sdui-parser/src",
1212
"files": [
1313
"packages/sdui-parser/src/body-dialect.ts",
@@ -21,7 +21,7 @@
2121
"packages/sdui-parser/src/validate.ts"
2222
]
2323
},
24-
"recordedAgainstPin": "088e0f705520e82bee1d65a5fa3c1f7a26672dde",
24+
"recordedAgainstPin": "9646e2ed2bf315a6ae99b2a1633bc7c7d162f7b9",
2525
"grammarRegion": {
2626
"file": "packages/sdui-parser/src/parse.ts",
2727
"delimiter": "/* ---------------------- the JS literal subset (#6614) ---------------------- */",

‎packages/spec/src/data/api-methods-batch-conformance.test.ts‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,10 @@ const SINGLE_RECORD_WRITE_ONLY: Record<string, string> = {
6161
// `revoked` on ONE key. The multi-select surface this rule protects does not
6262
// exist for API keys, and the shape a future one would take does not need
6363
// `bulk` either — both read off the console build this release pins
64-
// (`.objectui-sha` = `088e0f705`, re-read there 2026-10-12:
64+
// (`.objectui-sha` = `9646e2ed2`, re-read there 2026-10-12:
65+
// every objectui file this record cites is byte-identical across the hop from
66+
// `088e0f705` (`git diff --quiet`), so every anchor held unmoved. At
67+
// `088e0f705`, re-read there 2026-10-12:
6568
// every objectui file this record cites is byte-identical across the hop from
6669
// `e5311165a` (`git diff --quiet`), so every anchor held unmoved. At
6770
// `e5311165a`, re-read there 2026-10-12:

‎packages/spec/src/kernel/functional-completeness.ts‎

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,15 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] {
298298
* English sentence. So the loss is total rather than partial — every
299299
* record, on every object — and the author is told at render time as well
300300
* as here. Both reads hold at the pin this repo builds against
301-
* (`.objectui-sha` = `088e0f705`, re-read there 2026-10-12:
301+
* (`.objectui-sha` = `9646e2ed2`, re-read there 2026-10-12:
302+
* on the hop off `088e0f705` `ObjectCalendar.tsx` and the `en` / `zh` / `de`
303+
* packs are byte-identical (`git diff --quiet`), so `getCalendarConfig` `:311`,
304+
* the `if (!calendarConfig)` arm `:1354` with its `tt(…)` lines `:1361-1362`
305+
* and the packs' `calendar.configRequired` strings did not move; and
306+
* `ListView.tsx` changed (+9/-9, objectui#12189, objectui `26b0bd2d1`: the
307+
* FilterBuilder group type's rename, nine lines replaced in place, the last at
308+
* `:1558`), so its `case 'calendar'` held at `3813`. At `088e0f705`, re-read
309+
* there 2026-10-12:
302310
* on the hop off `e5311165a` `ObjectCalendar.tsx` and `ListView.tsx` are
303311
* byte-identical (`git diff --quiet`), so `getCalendarConfig` `:311`, the
304312
* `if (!calendarConfig)` arm `:1354` with its `tt(…)` lines `:1361-1362` and
@@ -440,7 +448,13 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] {
440448
* This repo already records the same deletion one door over: the #13817
441449
* check in `../ui/view.zod.ts` names objectui#7029 as its runtime half.
442450
* - `gantt` → NO fallback, and no silence [#19630]. Measured at the pin
443-
* this repo builds against (`.objectui-sha` = `088e0f705`, re-read there 2026-10-12:
451+
* this repo builds against (`.objectui-sha` = `9646e2ed2`, re-read there 2026-10-12:
452+
* on the hop off `088e0f705` `ObjectGantt.tsx` is byte-identical (`git diff
453+
* --quiet`), so `getGanttConfig` `:612` and the `if (!ganttConfig)` arm `:2330`
454+
* did not move, and `ListView.tsx` changed (+9/-9, objectui#12189, objectui
455+
* `26b0bd2d1`: the FilterBuilder group type's rename, nine lines replaced in
456+
* place, the last at `:1558`), so its `case 'gantt'` held at `3959`. At
457+
* `088e0f705`, re-read there 2026-10-12:
444458
* every objectui file this record cites is byte-identical across the hop from
445459
* `e5311165a` (`git diff --quiet`), so every anchor held unmoved. At
446460
* `e5311165a`, re-read there 2026-10-12:
@@ -545,7 +559,14 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] {
545559
* requires. So the view does not draw a blank chart: it refuses, by name.
546560
* - `timeline` → date axis: NO fallback [#19630]; title: `titleField || 'name'`,
547561
* which still stands. Measured at the same pin (`.objectui-sha` =
548-
* `088e0f705`, re-read there 2026-10-12:
562+
* `9646e2ed2`, re-read there 2026-10-12:
563+
* on the hop off `088e0f705` `ObjectTimeline.tsx` is byte-identical (`git diff
564+
* --quiet`), so its start-date chain `:589-591` and its `if (!hasAuthoredItems
565+
* && !startDateField)` refusal arm `:974` did not move, and `ListView.tsx`
566+
* changed (+9/-9, objectui#12189, objectui `26b0bd2d1`: the FilterBuilder group
567+
* type's rename, nine lines replaced in place, the last at `:1558`), so its
568+
* `case 'timeline'` held at `3902` and `resolveTimelineDateBinding` at `695`.
569+
* At `088e0f705`, re-read there 2026-10-12:
549570
* every objectui file this record cites is byte-identical across the hop from
550571
* `e5311165a` (`git diff --quiet`), so every anchor held unmoved. At
551572
* `e5311165a`, re-read there 2026-10-12:
@@ -647,7 +668,14 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] {
647668
* block does render; the warning still fires there, because the block the
648669
* view TYPE names is the one that is missing. Unchanged by this row.
649670
* - `map` → NO fallback, and no silence [#19630]. Measured at the same
650-
* pin (`.objectui-sha` = `088e0f705`, re-read there 2026-10-12:
671+
* pin (`.objectui-sha` = `9646e2ed2`, re-read there 2026-10-12:
672+
* on the hop off `088e0f705` `ObjectMap.tsx` is byte-identical (`git diff
673+
* --quiet`), so `getMapConfig` `:421`, `hasCoordinateBinding` `:527` and the
674+
* refusal arm `:1337` did not move; and `ListView.tsx` changed (+9/-9,
675+
* objectui#12189, objectui `26b0bd2d1`: the FilterBuilder group type's rename,
676+
* nine lines replaced in place, the last at `:1558`), so its `case 'map'` held
677+
* at `4079` and `resolveListMapConfig` at `:209`. At `088e0f705`, re-read there
678+
* 2026-10-12:
651679
* every objectui file this record cites is byte-identical across the hop from
652680
* `e5311165a` (`git diff --quiet`), so every anchor held unmoved. At
653681
* `e5311165a`, re-read there 2026-10-12:

0 commit comments

Comments
 (0)