Skip to content

Commit 299a2c6

Browse files
chore(objectui): bump the console pin to a58626c (carries objectui#11670 and #11669) (#22015)
Fixes #21996 Clause-②: no This moves the bundled Console's objectui pin from `0abd4f9f8769` (#21807, PR #21827) to `a58626c88dc85954bd0af24f16ebb69454c03eee`, which was objectui `main` when this run started. The new pin carries `5ba255538a` (objectui#11670): the Studio flow designer saves a screen field's `Min` / `Max` as numbers. That is the commit the timing clause of #21898 (PR #21974) waits on. The range also carries `c3623eb1` (objectui PR 11669, Studio's shared picklists). The bump follows the repo's own procedure (`scripts/bump-objectui.sh`, then `pnpm objectui:build` and `node scripts/gen-sdui-manifest-node.mjs`) and the gates it derives. It adds no step to that procedure. Every file below is one the procedure or a gate wrote, and nothing else rides here. ⛔ This is not a release act. Version Packages PR #21988 is untouched. It edits `packages/console/CHANGELOG.md` and `packages/console/package.json`, and this diff edits neither. The console's release input is the new `.changeset/console-a58626c88dc8.md`. ## Range - objectui `git ls-remote origin refs/heads/main` read `a58626c88dc85954bd0af24f16ebb69454c03eee` at 2026-10-06T15:32:48Z, the same sha the dispatch read at 15:08Z. - **REST `compare` on objectstack-ai/objectui proves containment** (base...head, head = the new pin): - `5ba255538a...a58626c`: `status: ahead`, `ahead_by: 18`, `behind_by: 0`, merge base `5ba255538a1115e2dc2d52fa094ecf491621a5fe`. The pin contains objectui#11670. - `c3623eb1...a58626c`: `ahead`, 15 ahead, 0 behind. - `0abd4f9f87...a58626c`: `ahead`, 36 ahead, 0 behind. - `0abd4f9f8769..a58626c` has 36 commits, 0 merges and 252 changed paths. - objectui declared 36 changesets over the range, and all 36 release. There are 0 release-nothing changesets and 0 commits without a changeset. None declares `major`. Three carry the author's breaking annotation. **The highest declared level is `minor`, so the console changeset is `minor`.** The script takes the highest level objectui itself declared over OLD..NEW. These counts are the bump's own digest output. - No commit subject in the range carries `!`. `git log --format='%h %s' 0abd4f9..a58626c | grep -E '^[0-9a-f]+ [a-z]+(\([^)]*\))?!:'` matches nothing (exit 1). - Re-read at 16:25:59Z, objectui `main` reads `834c5594b`, four commits past the pin (objectui#11685, objectui PR 11724, objectui#11682 and objectui#11687). This PR does not carry them. ## Declared-breaking entries and the ADR-0087 disposition The script wrote its `adr-0087: TODO` placeholder into the console changeset. It is answered `not-required (no-migration-prescription)`, in the wording the previous bumps used. `check-adr-0087-registration --base origin/main` reports "1 declared-breaking changeset(s), each carrying an ADR-0087 disposition". `check-changeset-no-major --base origin/main` exits 0. Each entry is objectui's own package surface: 1. **objectui#4425 (`eb4552e71`)**: objectui's `@object-ui/types` faces refuse `label` on a `metric-card` in an objectui `dashboard` node's `widgets[]` slot. 2. **objectui#11709 (`89cc738da`)**: inside a widget's legacy `component` envelope, a `metric-card` is judged by the slot's component arm alone. - `metric-card` is not a member of `@objectstack/spec`'s `PageComponentType` and has no `ComponentPropsMap` row. - The ObjectStack dashboard widget's `type` vocabulary is the chart types (`metric`, `kpi` and the rest). - No example or package source here authors a `metric-card` node, and the regenerated `sdui.manifest.json` has no `metric-card` entry. 3. **objectui#11678 (`48c82c9d5`)**: `@object-ui/app-shell`'s `RecentItem` becomes a union, and `addRecentItem` stops taking a label for an object, dashboard, page or report entry. No code here imports `@object-ui/app-shell`. The only code here that names the `ui.recent` preference is the SQL driver's tests, which store the row as an opaque value. ## What changed here (22 files, +491 / -161) | file | written by | gate that required it | |---|---|---| | `.objectui-sha` | `scripts/bump-objectui.sh a58626c --no-commit` | Console Pin Gate builds what it names | | `.changeset/console-a58626c88dc8.md` | the same run (the digest); the only later edit is the ADR-0087 answer above | `check-adr-0087-registration`, `check:objectui-changeset` | | `sdui.manifest.json`, `scripts/sdui-manifest.record.json` | `node scripts/gen-sdui-manifest-node.mjs` over `.cache/objectui-a58626c88dc8` | `check-sdui-manifest.mjs` | | `packages/sdui-parser/objectui-lockstep.json` | `pnpm gen:sdui-lockstep` against the same tree | `check:sdui-lockstep` | | 54 asserting citations in 12 files under `packages/spec/src`; `migrations/registry.ts` via `gen:migration-registry` | re-measured by hand (below) | `check:objectui-pin-citations` | | `.changeset/objectui-pin-citations-a58626c88dc8.md` | hand-written, `@objectstack/spec` patch | `check:published-files` / Check Changeset (the shipped describes name the pin) | | `content/docs/references/ui/view.mdx` | `check:generated --fix` | `check:docs` | - **The bump script.** It ran against the sibling objectui checkout after `git fetch origin main` there, with the target sha passed explicitly. The range walked completely without a deepen. The checkout was read and fetched only. - **The manifest.** It still has 107 components. The sha256 moves from `f95d406a584e…` to `e0654735a318…`. - One input moved: `record:details` `sections` gained a sentence in its description. A section that names a field group now takes the group's `visibleWhen` as well (objectui#11630). - No key, type or required flag moves. - The record moves its pin and `modulesRoot`. objectui's workspace version stays 17.7.0. - **The lockstep.** It records 214 grammar lines (blob `0131f27cf86d`), 25 diagnostic codes and containment predicate `76c18fb95d1f`. All are unchanged, so no port is owed. - **The 54 asserting pin citations were re-measured, not restamped.** - **Method.** Each record's cited objectui files were resolved against the tree at `0abd4f9f8` and intersected with the range's 252 changed paths. Every anchor in a changed file was mapped through `git diff -U0 0abd4f9 a58626c` and its text compared at both pins. - **Fifteen cited files changed:** `ObjectKanban.tsx`, `KanbanImpl.tsx`, `ObjectTree.tsx`, `ObjectTimeline.tsx`, `record-details.tsx`, `action-group.tsx`, `action-menu.tsx`, `static-params.ts`, `MetricWidget.tsx`, `MetricCard.tsx`, `form.tsx`, `plugin-kanban.mdx` and the `en` / `zh` / `de` packs. - **Result.** Every cited line in them is byte-identical at the new pin. 97 anchor citations in the records' current text MOVED and were re-pointed, and each record's new hop sentence says by how much. No read point an asserting record cites changed content or died. Every other cited file is byte-identical across the hop (`git diff --quiet`). - **Records.** Each of the 41 comment records gains a dated 2026-10-06 hop sentence and keeps its earlier history. The `FormField.span` describe changes its sha only: `WIDE_FIELD_TYPES`, the field-type alias table and `spanLadderFor` are byte-identical. - **Counts.** Each was re-taken by the record's own method and reads as before: the `keyboardNavigation` hit lines (15, against 3 for `schema.editable`), `ObjectKanban.tsx`'s `quickAdd` / `onQuickAdd` (2 each, against 11 for `onCardClick`), and the `ElementDataSourceGate` occurrences in the five `src/index.tsx` shells (0, 3, 3, 3 and 4). - **Corpus counts.** The six migration entries' counts were re-taken with `git grep -o -F`. That method first reproduced every `0abd4f9f8` number: 7650 files, `objectstack` 17390, `@objectstack/spec` 7209, `timeout` 1360, `RuntimeConfig` 293, `resourceLimits` 2, `useState` 2478, `window` 4194, `period` 238, `interval` 195, `metrics` 401, `Span` 508, `SpanSchema` 57, `TTL` 182 and `tenant` 1318. - The new readings are 7754 files, `objectstack` 17468, `@objectstack/spec` 7246, `timeout` 1431, `RuntimeConfig` 299, `resourceLimits` 2 (the same two `packages/app-shell` hits), `useState` 2491, `window` 4255, `period` 247, `interval` 200, `metrics` 401, `TTL` 184 and `tenant` 1319. - All 99 checked tokens still read zero at both pins: the export lists of `plugin-lifecycle-advanced.zod.ts`, `tracing.zod.ts` and `metrics.zod.ts`, plus every named key. The exceptions are `Span` / `SpanSchema`, which read 509 / 57. The one new `Span` hit is a `colSpan`. No example, test or gate needed adapting, and no code changed outside generated records, citations and changesets. ## Console build (the local Console Pin Gate equivalent) Both steps ran under the verify lock. - **Dependency build.** `turbo run build --filter=@objectstack/client --filter=@objectstack/spec --filter=@objectstack/sdui-parser` ran 33 tasks and exited 0 in 2m05s. - **Console build.** `pnpm objectui:build` exited 0 in 7m03s on the shared box. - `OBJECTUI_ROOT` pointed at a scratch repository holding only the pin commit, so the build's `git worktree add` registered nothing in the sibling objectui checkout. - The log reports "Bundle canary 'import/jobs' present". - It reports "Single-zod canary: exactly one zod version literal {major:4,minor:6,patch:5}". - It reports **"Console bundle carries THIS tree's @objectstack/spec, and only it"**. - It reports "@objectstack/console dist ready (64400 KB) from objectui@a58626c88dc8". - `check:console-sha` and `check:console-injection` exit 0 against that dist. ## Gates and tests (head `b86e6f264`) - **Derived gates.** `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derived 127 commands from the 22-path diff. A throwaway merge onto current `main` (`1bc6ca1d3`) derives the same 127. - All 127 ran at `b86e6f264` after a full workspace build (`turbo run build --filter=!@objectstack/docs`), each exit code written to disk. All 127 exit 0. `--ran` reports "127 derived, 127 run, 0 NOT-MEASURED, 0 UNRUN", with every exit code recorded. - An earlier pass also ran all 127. There, `check:skill-examples` and `check:dual-build-cjs-loads` answered PREREQUISITE NOT MET (exit 3). `check:dts-closure` and `check:docs-transcript-drift` read a `packages/spec/dist` that a concurrent build of mine was rewriting. All four are green on the rerun above. - **Pin citations.** `check:objectui-pin-citations --verify-anchors` reads the sibling checkout at the pin. It reports "54 asserting objectui pin citation(s) match .objectui-sha (a58626c)" and "7 anchor content assertion(s) verified against objectui at a58626c". - **Other pin gates.** `check:sdui-lockstep` reports "this copy is byte-identical to objectui@a58626c88dc8". `check-sdui-manifest` reports "recorded at the live objectui pin a58626c… @object-ui 17.7.0 is the version objectui a58626c… declares". - **`@objectstack/spec`.** `vitest run --project local` passed 619 files: 18485 tests, 1 todo. `typecheck` exits 0. - **`@objectstack/sdui-parser`.** 14 files and 225 tests pass, and `typecheck` exits 0. - **Suites that read the regenerated manifest:** - `@objectstack/lint` `src/validate-jsx-pages.production-witness.test.ts`: 5 passed. - `@objectstack/metadata-protocol` `src/protocol.runtime-authoring-gate.test.ts`: 70 passed. - `@objectstack/cli` unit tier `src/utils/sdui-manifest.test.ts`, `src/utils/console.sha-drift.test.ts` and `test/validate-build-gate-parity.test.ts`: 3 files, 87 passed. - The CLI integration tier (`test/jsx-gate-manifest-notice.e2e.test.ts` spawns the CLI) is declared to CI. - **Lint.** `eslint --no-inline-config --format json` over the 15 changed TS files reports 15 files, 0 errors and 0 warnings. - The lint population is `**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}` (`eslint.config.mjs:971`). - The config enables no type-aware linting (`:328`), so this diff cannot move a verdict on an untouched file. - Repo-wide `pnpm lint` is left to CI. - **Console Pin Gate.** It is CI's to run on this head, and its verdict is read on the PR. - **Browser smoke.** NOT MEASURED. The dispatch asked for none, and the range's own landings carry their objectui-side tests. ## Acceptance notes - **objectui#11638 retired a read that a dated record still lists.** The two action containers no longer read a member's `properties.params`. - `ui/component.zod.ts`'s action-container member docblock still lists that read under "Read, and refused anyway". The docblock is in the historical spelling, measured at `.objectui-sha` pin `2e818d0b51ec`. - The spec refuses the key either way, so the accept set and the save gate do not move, and the renderer and the save gate still agree. - The record is a dated measurement that the pin-citation gate does not hold to the current pin, so nothing here re-measures it. Noted, not filed. Carrier: none. - **The shipped console now reads `KanbanConfig.summarizeField`** (objectui#11629): each kanban column header totals it. The key is declared in `ui/view.zod.ts`, and the liveness ledger carries no row for it, so nothing here is owed. - **The console's sign-up gating now reads `features.audiencePosture`** from `/api/v1/auth/config` (objectui#11691, objectui#11705). This repo's auth plugin serves that key (`auth-manager.ts`, `getPublicConfig`) and serves `GET /auth/bootstrap-status`, so that seam holds. - `main` moved four commits past this branch's base (`f0022c46c..1bc6ca1`). None of them touches a file this diff touches, and `git merge-tree --write-tree HEAD origin/main` is clean. No merge was made; the merge queue rebuilds on the current `main`. - **Writes.** One draft PR through the relay, one label write on the PR (assignee `os-justin`), and the report comment on #21996. --- _Generated by [Claude Code](https://claude.ai/code/session_01VF48aw8RPG6wzDnMgp6rtw)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 1fb274e commit 299a2c6

22 files changed

Lines changed: 491 additions & 161 deletions

‎.changeset/console-a58626c88dc8.md‎

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
---
2+
"@objectstack/console": minor
3+
---
4+
5+
Console (objectui) refreshed to `a58626c88dc8`. Frontend changes in this range:
6+
7+
Derived from the changesets objectui declared over the range — 36 releasing of 36 changesets added across 36 non-merge commits.
8+
9+
- **minor** — The timeline's unused "Overdue" bucket label is removed: `timeline.bucket.overdue` is gone from all ten language packs and from the timeline's built-in English defaults (objectui#… (objectui `c910630cf`)
10+
- **minor** — **BREAKING** — Inside a dashboard widget's legacy `component` envelope, a `metric-card` is now judged by the slot's component arm alone, so every key that arm refuses is refused there too, with… (objectui `89cc738da`)
11+
- **minor** — **BREAKING** — "Recently Accessed" shows each item's own label, in the current language, and a visit that does not change the list no longer writes the `ui.recent` preference (objectui#11678). (objectui `48c82c9d5`)
12+
- **minor** — The calendar and the timeline start the week on the first day of the week of the user's locale (objectui#11675), instead of a fixed Sunday (calendar) and a fixed Monday (timeline)… (objectui `9ca3cacbe`)
13+
- **minor** — The console's settings pages resolve icons through the shared `getLazyIcon` helper and no longer log `[lucide-react]: Name in Lucide DynamicIcon not found` (objectui#11679). (objectui `abd374bb2`)
14+
- **minor** — `DefaultLoginPage` and `DefaultRegisterPage` offer a generic sign-up only where the server would accept one (objectui#11705). Under the default `invite_only` audience posture the… (objectui `7e2d5b0ee`)
15+
- **minor** — Objects with a picklist-bound field save again from the OWD overview, the Setup fields and objects pages, the metadata-admin embedded-item editor, and `MetadataService.saveFields`… (objectui `da3545375`)
16+
- **minor** — The keyboard-shortcuts dialog (`?`) lists only shortcuts that do something (objectui#11674). (objectui `de96f3d0c`)
17+
- **minor** — **BREAKING** — A `metric-card` placed in a dashboard's widget slot refuses `label` by name and points at `title`, the key its heading is drawn from (objectui#4425). (objectui `eb4552e71`)
18+
- **minor** — The console's login and register pages offer a generic sign-up only where the server would accept one (objectui#11691). `/api/v1/auth/config` states the sign-up rule as two keys,… (objectui `daa7caff4`)
19+
- **minor** — An object-bound timeline no longer heads every past date "Overdue": a day before today goes under a neutral "Earlier" bucket, translated in every language (objectui#11676). (objectui `ce464d958`)
20+
- **minor** — Studio reads shared picklists: a select field can use one, an object with a picklist-bound field saves again, and the picklist page is read-only (objectui#10202, the objectui half… (objectui `c3623eb11`)
21+
- **minor** — The AI chat's tool-approval card and its "Open in Builder" handoff card are translated in every language (objectui#11667). (objectui `57d82cb34`)
22+
- **minor** — The chat launchers show a marker while a proposed plan awaits the user's approval (objectui#11666, item 6 of objectui#2458). A user who closed the chat with a blueprint still wait… (objectui `848ba0e12`)
23+
- **minor** — Five fixes on the AI build surface, from the 2026-10-05 cloud acceptance run (objectui#11658). (objectui `fc3c2cc1c`)
24+
- **minor** — `action:group` and `action:menu` no longer read a member's `properties.params` (objectui#11638). A container member's `properties.params` no longer reaches the action runner. (objectui `73b5d7764`)
25+
- **minor** — `LoginForm` shows its "Don't have an account? Sign up" row only when the caller passes `registerUrl` (objectui#11634). The prop used to default to `'/register'`, so a caller that… (objectui `f1a177c41`)
26+
- **minor** — A field group's `visibleWhen` now gates its section on the record detail page, the same way it gates the section on the entry form (objectui#11630). Take an object whose `fieldGro… (objectui `76993f8ef`)
27+
- **patch** — fix(plugin-tree): tree cells draw the same field faces as list cells, so a boolean no longer shows as `true` (objectui#11686) (objectui `a58626c88`)
28+
- **patch** — **The record header's highlight chips share the row's free width and truncate only when it runs out (objectui#11684).** A Product with SKU "QA Widget 1" read "QA Wid…" in the reco… (objectui `7300fcafe`)
29+
- **patch** — An authored `view:calendar` or `view:timeline` node loads its plugin and renders the calendar or the timeline, and a console boot no longer logs the registry's race warning for th… (objectui `e6dcd85cc`)
30+
- **patch** — The approvals inbox's request drawer shows its record summary the way the record page shows the record (objectui#11677). (objectui `3409fe89e`)
31+
- **patch** — The flow designer saves a screen field's `Min` and `Max` as numbers (objectui#11664). (objectui `5ba255538`)
32+
- **patch** — The metric cards no longer write authored keys they do not read onto the page (objectui#4425). Rendered through `SchemaRenderer`, which is how every dashboard draws its KPI tiles… (objectui `a600924f2`)
33+
- **patch** — Console, record page and Studio copy from the 2026-10-05 cloud acceptance run (objectui#11659). (objectui `f9f4a62d5`)
34+
- **patch** — The flow designer's SLA escalation switch on an approval node no longer writes a refused `escalation: { enabled: false }` block, and switching it off keeps the values the author e… (objectui `9f3ed7bca`)
35+
- **patch** — Cancelling a background import shows the rows the server already committed, with Undo (objectui#11650). `ImportWizard`'s Cancel used to show "Import cancelled · 0 imported" withou… (objectui `846f98251`)
36+
- **patch** — Drag-to-reorder works on a grouped sidebar menu, within each level (objectui#11626). `NavigationRenderer` had a sortable path only in its group-free arm. Every stock app's menu is… (objectui `b88937b65`)
37+
- **patch** — The `object-kanban` board totals the view's `summarizeField` in each column header (objectui#11629). (objectui `f4370f426`)
38+
- **patch** — On an object that declares no list view, a grid toolbar change no longer sends a save the door refuses (objectui#11643). Such an object opens on the "All Records" tab the console… (objectui `43671468d`)
39+
- **patch** — The console's `/verify-email?token=…` page verifies the address again (objectui#11633). It used to send the token as `POST /api/v1/auth/verify-email` with a JSON body. better-auth… (objectui `8057a8b14`)
40+
- **patch** — On a runtime with no marketplace that still mounts install-local (an offline boot, `OS_CLOUD_URL=off`), a local install's Details page now offers its local menu: re-seed sample da… (objectui `0baf86f1b`)
41+
- **patch** — A dataset-bound dashboard widget names its comparison window from `compareTo.kind` (objectui#11632). `previousPeriod` reads "vs previous period" and `previousYear` reads "vs last… (objectui `e398a54f0`)
42+
- **patch** — Two grid toolbar changes to one view in one session now both survive a reload (objectui#11642). Before, the second change overwrote the first: changing density and then sorting by… (objectui `531b26c8f`)
43+
- **patch** — A lookup whose `dependsOn` names a parent field drops its selection when that parent changes or is cleared (objectui#11631). (objectui `c00039842`)
44+
- **patch** — A grid toolbar change on a served view is stored where the save door keeps it, so it survives a reload (objectui#11625). This covers density, a column-header sort and the hide-fie… (objectui `59917c4b2`)
45+
46+
⚠️ 3 of these carry a breaking change: 3 by the author's own breaking annotation in the changeset body — objectui declares no `major` inside a launch window (`scripts/check-changeset-no-major.mjs`). Each is marked **BREAKING** in the list above — read them before compiling the release record.
47+
48+
<!-- adr-0087: not-required (no-migration-prescription)
49+
This diff moves `.objectui-sha` and the artefacts that travel with it: this console
50+
changeset, the regenerated `sdui.manifest.json` and its record
51+
`scripts/sdui-manifest.record.json`, the re-recorded
52+
`packages/sdui-parser/objectui-lockstep.json` (objectui's `packages/sdui-parser/src` is
53+
byte-identical across the range) and the re-measured pin citations in `packages/spec/src`,
54+
which carry their own `@objectstack/spec` patch changeset. It adds, removes or renames no
55+
ObjectStack-authorable key: no Zod schema, no spec declaration and no stored
56+
`sys_metadata` shape moves in it, so `objectstack migrate meta` has nothing here to
57+
rewrite, and this body carries no FROM/TO prescription of its own.
58+
The range carries three declared-breaking objectui changes, each by its author's
59+
breaking annotation and none by a declared `major`. Each is objectui's own package
60+
surface, with its upstream record, and each is answered here:
61+
(1) objectui#4425 (`eb4552e71`) and (2) objectui#11709 (`89cc738da`): objectui's
62+
`@object-ui/types` faces refuse `label` on a `metric-card` in an objectui `dashboard`
63+
node's `widgets[]` slot, and judge a `metric-card` inside a widget's legacy `component`
64+
envelope by the slot's component arm alone. `metric-card` is objectui's own node type:
65+
it is neither a member of `@objectstack/spec`'s `PageComponentType` nor a
66+
`ComponentPropsMap` row, the ObjectStack dashboard widget's `type` vocabulary is the
67+
chart types (`metric`, `kpi` and the rest), no example or package source in this
68+
repository authors a `metric-card` node, and the regenerated `sdui.manifest.json`
69+
carries no `metric-card` entry.
70+
(3) objectui#11678 (`48c82c9d5`): `@object-ui/app-shell`'s `RecentItem` becomes a
71+
union, and `addRecentItem` stops taking a label for an object, dashboard, page or
72+
report entry. No code in this repository imports `@object-ui/app-shell`, and the only
73+
code here that names the `ui.recent` preference is the SQL driver's tests, which store
74+
that row as an opaque value. Lists stored in the old shape are read by identity
75+
upstream, so no stored row has to change.
76+
Where an entry mirrors an ObjectStack key, the ledger entry belongs to the
77+
`packages/spec` PR that lands it, never to the pin bump.
78+
Scope of the claim, stated rather than implied: it is a claim about THIS diff, not a
79+
per-entry re-measurement of the upstream declared-breaking entries.
80+
-->
81+
82+
objectui range: `0abd4f9f8769...a58626c88dc8`
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
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 `a58626c88dc8`.
6+
7+
Clause-②: no
8+
9+
Every anchor was mapped through the objectui diff `0abd4f9f8769..a58626c88dc8`, 252 paths over 36 commits. Fifteen of those paths are files an asserting record cites: `ObjectKanban.tsx`, `KanbanImpl.tsx`, `ObjectTree.tsx`, `ObjectTimeline.tsx`, `record-details.tsx`, `action-group.tsx`, `action-menu.tsx`, `static-params.ts`, `MetricWidget.tsx`, `MetricCard.tsx`, `form.tsx`, `plugin-kanban.mdx` and the `en` / `zh` / `de` packs. In each, every cited line is byte-identical at the new pin, so each anchor that moved was re-pointed to its new line and the record says by how much; no read point an asserting record cites changed content or died. Every other cited file is byte-identical across the hop (`git diff --quiet`). The seven quoted anchor lines verify against objectui at the new pin. Three records carry a count, and each count was re-taken by its record's own method with the same reading: the `keyboardNavigation` hit lines (15, against 3 for the `schema.editable` control), `ObjectKanban.tsx`'s `quickAdd` / `onQuickAdd` (2 each, against 11 for `onCardClick`), and the `ElementDataSourceGate` occurrences in five `src/index.tsx` shells (0, 3, 3, 3 and 4).
10+
11+
The six migration entries' corpus counts were re-taken with `git grep -o -F`, the method that first reproduced every `0abd4f9f8769` number. The corpus is now 7754 tracked files. All 99 checked tokens (the export lists of `plugin-lifecycle-advanced.zod.ts`, `tracing.zod.ts` and `metrics.zod.ts`, plus every named key) still read zero, except `Span` / `SpanSchema`, which read 509 / 57: the one new `Span` hit is a `colSpan`.
12+
13+
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-
0abd4f9f8769fc4c19ad2f96707684876f74c09f
1+
a58626c88dc85954bd0af24f16ebb69454c03eee

‎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` = `0abd4f9f8769`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. |
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` = `a58626c88dc8`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. |
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` = `0abd4f9f8769`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. |
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` = `a58626c88dc8`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. |
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": "0abd4f9f8769fc4c19ad2f96707684876f74c09f",
10-
"revDate": "2026-10-05T04:03:25+00:00",
9+
"rev": "a58626c88dc85954bd0af24f16ebb69454c03eee",
10+
"revDate": "2026-10-06T15:08:56+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": "0abd4f9f8769fc4c19ad2f96707684876f74c09f",
24+
"recordedAgainstPin": "a58626c88dc85954bd0af24f16ebb69454c03eee",
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` = `0abd4f9f8`, re-read there 2026-10-05:
64+
// (`.objectui-sha` = `a58626c88`, re-read there 2026-10-06:
65+
// every objectui file this record cites is byte-identical across the hop from
66+
// `0abd4f9f8` (`git diff --quiet`), so every anchor held unmoved.
67+
// At `0abd4f9f8`, re-read there 2026-10-05:
6568
// every objectui file this record cites is byte-identical across the hop from
6669
// `9dfaca654` (`git diff --quiet`), so every anchor held unmoved.
6770
// At `9dfaca654`, `packages/plugin-grid`; re-measured at

0 commit comments

Comments
 (0)