Skip to content

Commit 100f68b

Browse files
chore(objectui): bump the console pin to 2e818d0 (carries objectui#11466, #11574, #11578, #11581 and #11583) (#21710)
Fixes #21696 Clause-②: no This moves the bundled Console's objectui pin from `ab1879721595` (#21625) to objectui `main` as of the write time, `2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6`, which is past `973fc20f3`. The Console now carries objectui#11574 (the phantom "(empty)" groups fix), objectui#11578, objectui#11581, objectui#11576, objectui#11583 and objectui#11466 (V1 declared node slot). It also carries objectui's own 17.7.0 package release. ⛔ This is not a release act. Version PR #21352 is untouched, and no tag, publish or Release was made. Whether 17.7.0 ships with this pin is the maintainer's call. ## Range `ab1879721595..2e818d0` has 22 non-merge commits. `git merge-base --is-ancestor` exits 0 against objectui `origin/main` for `973fc20f3`, and `2e818d0b51ec` was objectui `main` when it was read (`git ls-remote` just before this PR). From the changesets objectui declared over the range: - 17 releasing changesets, 1 release-nothing, and 6 commits that carry no changeset. - 12 of the 18 changesets were already consumed by objectui's release `b493919c7`. Each was read from the commit that added it. - 2 breaking entries, both annotated by the author and both from one commit. The range was listed by measurement, not copied from the card. Exactly one commit subject in the range carries `!`: `git log --format='%h %s' ab18797..2e818d0 | grep -E '^[0-9a-f]+ [a-z]+(\([^)]*\))?!:'` gives `83e3f8377 feat(types,react,core,plugin-dashboard)!: … (objectui#11466)`. | objectui landing | commit | note | |---|---|---| | objectui#11466: node slot and `SchemaRenderer`'s `schema` take `DeclaredNode`; the dashboard producers name declared nodes; an envelope's object-metric retires | `83e3f8377` | **declared breaking**, both breaking entries | | objectui#11574: a grouping-field switch paints only the server's groups | `2f54dca53` | smoke below | | objectui#11581 / #11578 / #11576: Create View doors share one builder; a refused save is said; chart views bind an ADR-0021 dataset | `b65aa5e65`, `f1c937966`, `d0097af2e` | | | objectui#11583: a refused metadata write on the view, report and draft surfaces is said | `e8c0b9614` | past the card's `973fc20f3` | | objectui#11598: dashboard slot-entry and chart-producer reads compile without `BaseSchema`'s index signature | `2e818d0b5` (the pin itself) | | | objectui#11572 / #10380: interface and object page relay stored view config | `09036173c`, `068564691` | | | objectui#11588: grid summary footer reads currency/precision from the object field only | `d768c3178` | | | objectui#11216: `object-kanban` declares `grouping` as the spec's `GroupingConfig` | `a7557a7d4` | | | objectui#11573, #11564: `AnyComponentSchema` / flex child typing | `bdc9049ed`, `b10c68e58` | | | objectui release 17.7.0 | `b493919c7` | removes 2726 consumed `.changeset/*.md` files | ## ADR-0087 disposition of the declared-breaking entries Both entries are `not-required (no-migration-prescription)`. The disposition is in `.changeset/console-2e818d0b51ec.md`, which replaces the script's `adr-0087: TODO` placeholder. | objectui PR | commit | entry | disposition | |---|---|---|---| | objectui#11466 (PR objectui#11512) | `83e3f8377` | A node slot and `SchemaRenderer`'s `schema` prop take `DeclaredNode` | not-required (no-migration-prescription). This is objectui's own TypeScript face (`@object-ui/types` / `@object-ui/react`). No ObjectStack schema declares or references it. | | objectui#11466 (PR objectui#11512) | `83e3f8377` | An `object-metric` node in a dashboard widget's legacy `component` envelope draws the retired-format prompt | not-required (no-migration-prescription). An ObjectStack author cannot write that envelope: `ui/dashboard.zod.ts` refuses a widget's `component` key by name as objectui-internal, and no example authors one. The showcase's `object-metric` page tiles still draw their numbers (smoke below). | `check-adr-0087-registration --base origin/main` gives "1 declared-breaking changeset(s), each carrying an ADR-0087 disposition". `check-changeset-no-major --base origin/main` gives "This diff introduces no `major` bump". ## What changed here - **`.objectui-sha` and `.changeset/console-2e818d0b51ec.md`** were written by `scripts/bump-objectui.sh 2e818d0 --no-commit` with `OBJECTUI_ROOT` set to a read-only clone of objectui. The level was auto-set to `minor`. No `../objectui` sibling exists in this container. - **`scripts/sdui-manifest.record.json`** was re-recorded by `node scripts/gen-sdui-manifest-node.mjs` over the tree that `pnpm objectui:build` built at the pin. **`sdui.manifest.json` is byte-identical**: 107 components, sha256 `0ead67c1111d…` at both pins, so no component input moved. The record moves its pin, its `modulesRoot` and objectui's workspace version (17.6.0 to 17.7.0). - **`packages/sdui-parser/objectui-lockstep.json`** was re-recorded with `pnpm gen:sdui-lockstep` against `OBJECTUI_ROOT=.cache/objectui-2e818d0b51ec`. It records 214 grammar lines (blob `0131f27cf86d`), 25 codes and containment predicate `76c18fb95d1f`. All are unchanged, so no port is owed. objectui's `packages/sdui-parser/src` is byte-identical across the range; only its CHANGELOG and package.json moved. - **The 54 asserting pin citations in `packages/spec/src`** were re-measured at the new pin, not restamped: - Every anchor in each asserting record was resolved against objectui's tree at the old pin and mapped through `git diff -U0 ab18797 2e818d0`. - Four cited files changed: - `plugin-dashboard/src/index.tsx` (+13/-1, objectui#11466). Lines were added above the `object-metric` registration, so its start moves `244` to `256` and the icon input moves `269` to `281`. Both lines are byte-identical, still `{ name: 'icon', type: 'string' }`. - `packages/types/src/objectql.ts`. objectui#11216's `grouping` member landed below the cited `limit` member, so `:4720` did not move. - `content/docs/plugins/plugin-kanban.mdx`. A `grouping` row landed below the `limit` row, and the page still teaches `limit: 250`. - `packages/react/src/SchemaRenderer.tsx` (+21/-20, objectui#11466). Only the type import, the `SchemaRendererProps` docblock and the `schema` type changed. The `properties.*` hoist, its strip list and the `createElement` spread did not, so `object-timeline`'s prop channel still carries `data`. - Every other cited file is byte-identical across the hop. - Each record gains a dated 2026-10-04 hop sentence and keeps its `ab1879721` history. - **The six migration entries' corpus counts** were re-taken with `git grep -o -F`. That method first reproduced every `ab1879721` number: 10267 files, `objectstack` 16377, `@objectstack/spec` 6665, `timeout` 1348, `useState` 2476, `TTL` 180, `tenant` 1238, `Span` 491. - The new numbers are 7579 files, 17227, 7134, 1351, 2477, 182, 1317 and 505. The file count drops because objectui's 17.7.0 release removed 2726 consumed changesets. - Every zero is still zero: 98 tokens were checked, the export lists of the three cited spec files plus every named key. The only non-zero tokens are the expected `Span` / `SpanSchema`. The 14 new `Span` hits are `Spanish` prose. - `packages/spec/src/migrations/registry.ts` was regenerated with `gen:migration-registry`. - **`.changeset/objectui-pin-citations-2e818d0b51ec.md`** is a `@objectstack/spec` patch, because the `FormField.span` describe and six migration descriptions name the pin. `content/docs/references/ui/view.mdx` was regenerated by `check:generated --fix`. - **`main` was merged** (`7e0066af7a`) with `scripts/pm/os-regen-merge.sh` in merge commit `a0a35cb30f`, with no conflict hunk. Afterwards: - `check:generated` reports all 15 artifacts current. - main's three new semantic entries (`ui-object-form-fields-names-typed`, `ui-object-gantt-markers-typed`, `ui-object-timeline-mapping-typed`) are present in the regenerated registry. - The pin-citation gate still counts 54 asserting citations. main added historical ones only (108 to 118). No example, test or gate needed adapting, and no code changed outside generated records, citations and changesets. ## Browser smoke: `examples/app-showcase` with the Console built at `2e818d0b51ec` The Console was built by `pnpm objectui:build`. The build log reports: "Console dist matches the objectui pin (objectui@2e818d0b51ec)", "Single-zod canary: exactly one zod version literal {major:4,minor:6,patch:5}" and "Console bundle carries THIS tree's @objectstack/spec, and only it". The server ran `pnpm dev -- --fresh --ui --no-watch -p 41853` (with `OS_PORT=41853`) on its own ephemeral DB with the seeded admin. Headless Chromium (`/opt/pw-browsers/chromium`) drove it, with console messages, page errors and every non-2xx response captured. Only the PIDs this run started were stopped. **Dashboards.** objectui#11466 touches the dashboard producers. There are no page errors and no "retired" prompt on any of the four dashboards. | dashboard | metric tiles (value read in the DOM) | charts drawn | console errors | |---|---|---|---| | Delivery Operations `showcase_ops_dashboard` | Active Projects 2, At-Risk (Red) 1, Awaiting Review 2, Total Budget 1,090,000 | 4 | 404 `/api/v1/usage/storage`, 404 `/favicon.ico` | | Revenue Pulse `showcase_revenue_pulse` | Invoices 7, Invoiced Subtotal 1,920, Accounts Signed 3, Accounts (all time) 14, Paid Rate 42.9% | 4 | 404 `/api/v1/usage/storage` | | Chart Gallery `showcase_chart_gallery` | Total Tasks 10, Avg Progress 47.0, Total Spent 616,000 | 13 | 404 `/api/v1/usage/storage` | | System Overview `system_overview` (setup) | Total Users 3, Active Sessions 3, Login Events 3, Config Changes 0 | 2 | 404 `/api/v1/usage/storage` | The Delivery Operations tiles match the REST data on the same server: - `showcase_project?status=active` returns 2 rows, `?health=red` returns 1, and the budget sum is 1,090,000. - `showcase_task?status=in_review` returns 2 rows. - `showcase_task` has 10 rows, matching the Chart Gallery's Total Tasks. - `showcase_account` has 14 rows, matching Revenue Pulse's all-time count. The `object-metric` page tiles that this repo authors also draw: - My Work shows Open Tasks 8, In Review 2 and At-Risk Projects 1. - Command Center (大屏) shows 2 / 8 / 2 / 1 / 14 / 1.1M. Neither page has a page error. **Grouping-field switch (objectui#11574).** The drive was Tasks list, then Group, then Add group field (it selects Title). The select then switched to Priority, Status and Priority. The painted groups are counted from the DOM, and the server answers are each `POST /api/v1/data/showcase_task/query` with `groupBy`, all 200: | step | painted groups | server rows | "(empty)" groups | stuck "Loading grid…" | |---|---|---|---|---| | Title | 10 (one per task) | 10 | 0 | 0 | | Priority | 4: High 3, Low 1, Medium 4, Urgent 2 | 4 | 0 | 0 | | Status | 5: Backlog 2, Done 2, In Progress 2, In Review 2, To Do 2 | 5 | 0 | 0 | | Priority | 4: High 3, Low 1, Medium 4, Urgent 2 | 4 | 0 | 0 | The same sequence painted 13, 8 and 8 groups (9, 3 and 4 phantom) at `ab1879721595`, as #21625's acceptance notes recorded. **No phantom "(empty)" groups appear at this pin.** **Console errors across the run.** The only ones are the browser's "Failed to load resource: 404" lines for `/api/v1/usage/storage` and `/favicon.ico`, and the run has 0 page errors. The `usage/storage` 404 was already recorded in #21625's smoke. ## #21671 lockstep reading - objectui's `packages/sdui-parser/src/validate.ts` at `2e818d0b5` is byte-identical to `ab1879721595`. - `checkType` (`:450-466`) still grades `type-mismatch` with `severity: arms.includes('enum') ? 'error' : 'warning'`. `checkMemberTypes` (`:407-419`) grades `member-type-mismatch` the same way. - This repo grades both `error` since PR #21678 (`packages/sdui-parser/src/validate.ts:446`, `:506`). **The gap still stands at this pin.** - This repo's "Known lead" note (`packages/sdui-parser/src/validate.ts:336-340`) names objectui's copy "at the `.objectui-sha` pin" without a sha, so it is still true and needs no update. The bump route regenerates nothing there, and `validate.ts` is not edited. - `check:sdui-lockstep` does not compare severity, so this is a reading, not a gate result. ## Gates and tests (head `a0a35cb30f`) - `node scripts/pm/dispatch-gates.mjs --commands` derived 127 commands from the 21-path diff. That is the same set before and after the merge. - At `378d424915` (pre-merge) and again at `a0a35cb30f`, all 127 exited 0. `--ran` reports "127 derived, 127 run, 0 NOT-MEASURED, 0 UNRUN", with every exit code recorded. - Also exit 0: - `check:objectui-pin-citations --verify-anchors` with objectui at the pin: 54 asserting citations match `2e818d0b5`, and 7 content assertions are verified. - `check:objectui-bump` (20 assertions across 5 cases), `check:sdui-lockstep`, `check-sdui-manifest`, `check:console-sha`, `check:console-injection`, `check:migration-registry`. - `@objectstack/spec check:generated`: all 15 artifacts current after the merge. - `pnpm --filter @objectstack/spec test`: 612 files, 18185 passed, 1 todo. - `pnpm --filter @objectstack/spec typecheck`: exit 0. - `pnpm --filter @objectstack/sdui-parser test`: 225 passed. - `eslint --no-inline-config` on the 15 changed TS files: 0 errors and 0 warnings. The lint population is `**/*.{ts,…}` (`eslint.config.mjs:971`). The config enables no type-aware linting (`:328`), so this diff cannot move a judgment on an untouched file. Repo-wide `pnpm lint` is left to CI. ## Acceptance notes - `ui/component.zod.ts`'s `object-grid` `columns` record (the ⚠️ paragraph on `plugin-grid/src/useColumnSummary.ts:558-568`) says, about `ab1879721595`, that the footer summary reads `currency` / `defaultCurrency` / `precision` / `scale` off an authored column. objectui#11588 (`d768c3178`, inside this pin) retires that read. The record is in the historical spelling and stays true of the pin it names, so it is left as is. - Two anchors in records that cite no sha are outside the pin-citation gate's population and were not re-measured: - `ObjectView.tsx:882`, in `ui/view.zod.ts`'s [#5074] block and two view tests. - `plugin-dashboard/src/index.tsx:204`, in the `ObjectMetricPropsSchema icon liveness` test. - Both already read an unrelated line at `ab1879721595`, and they shift to `:936` and `:214` here. - Writes: no PR assignee or label was written. This dispatch's write budget names neither. --- _Generated by [Claude Code](https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 9d91f58 commit 100f68b

21 files changed

Lines changed: 328 additions & 112 deletions

‎.changeset/console-2e818d0b51ec.md‎

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
---
2+
"@objectstack/console": minor
3+
---
4+
5+
Console (objectui) refreshed to `2e818d0b51ec`. Frontend changes in this range:
6+
7+
Derived from the changesets objectui declared over the range — 17 releasing of 18 changesets added across 22 non-merge commits; omitted: 1 release-nothing changeset, 6 commits carrying no changeset (they ship no package code).
8+
9+
- **minor** — `FlexBlockNode`, the TypeScript type of an authored `flex` node, types its bag's child list as nodes: `properties.children` is `SchemaNode | SchemaNode[]`, where it was `unknown[]… (objectui `b10c68e58`)
10+
- **minor** — The dashboards' metric card node, `plugin-dashboard:metric`, is a declared node type, and both dashboard surfaces hand `SchemaRenderer` declared nodes with no cast (objectui#11466… (objectui `83e3f8377`)
11+
- **minor** — **BREAKING** — **An `object-metric` node in a dashboard widget's legacy `component` envelope now draws the retired-format prompt instead of its number (objectui#11466).** This follows the mainta… (objectui `83e3f8377`)
12+
- **minor** — **BREAKING** — A node slot and `SchemaRenderer`'s `schema` prop take the union of the declared node types, `DeclaredNode` (objectui#11466). (objectui `83e3f8377`)
13+
- **minor** — `safeValidateSchema`, and so `objectui validate`, accepts `record:line_items`, the last ADR-0080 public block it refused at `type` (objectui#10872). `@objectstack/spec` 17.6.0 car… (objectui `8d0ca9183`)
14+
- **minor** — `ObjectKanbanSchema.grouping` is declared on both faces, as `@objectstack/spec`'s `GroupingConfig`, by reference (objectui#11216). (objectui `a7557a7d4`)
15+
- **patch** — The dashboard surfaces read every `widgets[]` entry without leaning on `BaseSchema`'s index signature: a widget key is read on the widget arm alone, and the `chart` node is built… (objectui `2e818d0b5`)
16+
- **patch** — A refused save, pin, reorder, view setting, report save, publish or discard in the console is now said to the user, and the view-config panel no longer reports a refused save as s… (objectui `e8c0b9614`)
17+
- **patch** — The `object-grid` summary footer reads `currency`, `defaultCurrency`, `precision` and `scale` from the object field only. A column that carries one of these keys no longer changes… (objectui `d768c3178`)
18+
- **patch** — fix(types): `AnyComponentSchema`'s declaration prints every category union by name, so `@object-ui/types` no longer sits at the edge of TypeScript's serialization ceiling (objectu… (objectui `bdc9049ed`)
19+
- **patch** — "Save as view" now saves a Kanban view the platform accepts, and both Create View doors save the same view from the same dialog choices (objectui#11581). (objectui `b65aa5e65`)
20+
- **patch** — The console and runner stylesheets compile only from their declared `@source` lines. Tailwind's automatic source detection is now off (`source(none)`), as it already was for `@obj… (objectui `5a2ca6b12`)
21+
- **patch** — A refused view save is now said to the user, and the Create View dialog no longer closes as if the view were saved (objectui#11578). (objectui `f1c937966`)
22+
- **patch** — The console's Create View dialog now creates chart views the platform accepts (objectui#11576). (objectui `d0097af2e`)
23+
- **patch** — fix(plugin-grid): switching a server-grouped grid's grouping field shows exactly the new field's groups (objectui `2f54dca53`)
24+
- **patch** — fix(app-shell): an interface page relays its source view's `tree` and `chart` blocks, and its own `allowPrinting` (objectui#11572) (objectui `09036173c`)
25+
- **patch** — A stored list view now renders the same on an interface page and on the object page when it carries a legacy `options` bag (objectui#10380). (objectui `068564691`)
26+
27+
⚠️ 2 of these carry a breaking change: 2 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.
28+
29+
**In this console build, declared nowhere** — objectui merged 6 commits in this range with no `.changeset/*.md`. The code is inside the pin above and ships here, but nothing upstream declared them, so they appear in no objectui CHANGELOG and in no entry above. Listed by subject rather than counted, because a count cannot tell a dependency bump from a form-behaviour change (objectstack#6174); the upstream gate that would prevent this is objectui#3387.
30+
31+
- _(no changeset)_ fix(release): the publish lane pushes the version's git tags and creates its GitHub Releases itself — changesets/action@v1 finds no `New tag:` line under CLI v3 (objectui#11596) (… (objectui `973fc20f3`)
32+
- _(no changeset)_ docs(skills): `schema-expressions.md` states `{ condition, style }` as the only authorable conditional-formatting rule on every list carrier (objectui#11534) (#11595) (objectui `94985a92b`)
33+
- _(no changeset)_ chore: release packages (#5400) (objectui `b493919c7`)
34+
- _(no changeset)_ docs(plugin-detail): the reference-rail README says `entries` go in the `properties` bag, and that the validator refuses a flat one (objectui#10872) (#11584) (objectui `7a7660c65`)
35+
- _(no changeset)_ docs(skills): the page-builder guide's object-form example names its fields; a per-form override goes on a section entry (objectui#11550) (#11561) (objectui `0a53c67f9`)
36+
- _(no changeset)_ docs(skills): type three marked fences' schema as SchemaRendererProps['schema'] (objectui#11543) (#11558) (objectui `5cde2c6fe`)
37+
38+
<!-- adr-0087: not-required (no-migration-prescription)
39+
This diff moves `.objectui-sha` and the artefacts that travel with it: this console
40+
changeset, `scripts/sdui-manifest.record.json` (the regenerated `sdui.manifest.json` is
41+
byte-identical: 107 components, sha256 `0ead67c1111d…` at both pins), the re-recorded
42+
`packages/sdui-parser/objectui-lockstep.json` and the re-measured pin citations in
43+
`packages/spec/src`, which carry their own `@objectstack/spec` patch changeset. It adds,
44+
removes or renames no ObjectStack-authorable key: no Zod schema, no spec declaration and
45+
no stored `sys_metadata` shape moves in it, so `objectstack migrate meta` has nothing here
46+
to rewrite, and this body carries no FROM/TO prescription of its own.
47+
The 2 declared-breaking entries listed above are both objectui#11466 (`83e3f8377`, the
48+
range's one `!` commit, measured with `git log ab1879721595..2e818d0b51ec`) and both are
49+
objectui's OWN package surfaces, each already carrying its upstream record: (1) a node
50+
slot and `SchemaRenderer`'s `schema` prop take objectui's `DeclaredNode` union, a
51+
TypeScript type of `@object-ui/types` / `@object-ui/react` that no ObjectStack schema
52+
declares or references; (2) an `object-metric` node inside a dashboard widget's legacy
53+
`component` envelope draws objectui's retired-format prompt instead of its number. That
54+
envelope is not ObjectStack-authorable: `ui/dashboard.zod.ts` refuses a widget's
55+
`component` key by name as an objectui-internal renderer capability, so no stored
56+
ObjectStack dashboard can carry the form being retired, and no example in this repo
57+
authors one (the showcase's `object-metric` tiles are page blocks, which this entry
58+
leaves drawing). Where an entry mirrors an ObjectStack key, the ledger entry belongs to
59+
the `packages/spec` PR that lands the retirement, never to the pin bump.
60+
Scope of the claim, stated rather than implied: it is a claim about THIS diff, not a
61+
per-entry re-measurement of the 2 upstream declared-breaking entries.
62+
-->
63+
64+
objectui range: `ab1879721595...2e818d0b51ec`
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
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 `2e818d0b51ec`.
6+
7+
Clause-②: no
8+
9+
Every anchor was mapped through the objectui diff `ab1879721595..2e818d0b51ec`. Every file a current anchor cites is byte-identical across the hop except four, and in those the cited text is byte-identical too:
10+
11+
- `plugin-dashboard/src/index.tsx`: objectui#11466 added lines above the `object-metric` registration, so the `object-metric` icon input record moves from `:269` to `:281`. It is still `{ name: 'icon', type: 'string' }`.
12+
- `packages/types/src/objectql.ts`: objectui#11216 declared `grouping` on `ObjectKanbanSchema` below the cited `limit` member.
13+
- `plugin-kanban.mdx`: objectui#11216 added a `grouping` row below the cited `limit` row.
14+
- `SchemaRenderer.tsx`: objectui#11466 changed the type of `schema`. Its `properties.*` hoist and `createElement` spread are unchanged.
15+
16+
The six migration entries' corpus counts were re-taken with `git grep -o -F`, the method that reproduces the previous pin's numbers. objectui's 17.7.0 release removed 2726 consumed changesets, so the corpus is now 7579 tracked files. Every zero still reads zero.
17+
18+
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-
ab187972159583b595facdcae3c73b50f6f312e9
1+
2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6

‎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` = `ab1879721595`), 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` = `2e818d0b51ec`), 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` = `ab1879721595`), 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` = `2e818d0b51ec`), 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": "ab187972159583b595facdcae3c73b50f6f312e9",
10-
"revDate": "2026-10-03T17:12:55+00:00",
9+
"rev": "2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6",
10+
"revDate": "2026-10-04T07:05:00+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": "ab187972159583b595facdcae3c73b50f6f312e9",
24+
"recordedAgainstPin": "2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6",
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: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,11 @@ 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` = `ab1879721`, `packages/plugin-grid`; re-measured at
65-
// that pin, 2026-10-03. On the hop off `89cad75d5`, `ObjectGrid.tsx` changed
64+
// (`.objectui-sha` = `2e818d0b5`, `packages/plugin-grid`; re-measured at
65+
// that pin, 2026-10-04: `ObjectGrid.tsx` and `hooks/useBulkExecutor.ts` are
66+
// byte-identical across the hop off `ab1879721` (`git diff --quiet`), so
67+
// every anchor held unmoved. Re-measured at `ab1879721`, 2026-10-03. On the
68+
// hop off `89cad75d5`, `ObjectGrid.tsx` changed
6669
// again (74 insertions, 11 deletions: objectui#11544's group-header labels
6770
// read from the object field's `options` only, objectui#11475's percent
6871
// storage `max` copied onto the cell's field meta on three paths and one

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

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,10 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] {
287287
* English sentence. So the loss is total rather than partial — every
288288
* record, on every object — and the author is told at render time as well
289289
* as here. Both reads hold at the pin this repo builds against
290-
* (`.objectui-sha` = `ab1879721`, re-read 2026-10-03: on the hop off
290+
* (`.objectui-sha` = `2e818d0b5`, re-read 2026-10-04: `ObjectCalendar.tsx`
291+
* and `ListView.tsx` are byte-identical across the hop off `ab1879721`
292+
* (`git diff --quiet`), so every anchor held unmoved; re-read at
293+
* `ab1879721` 2026-10-03: on the hop off
291294
* `89cad75d5` `ObjectCalendar.tsx` changed in one comment line only, line
292295
* for line (`:1250`, objectui#11438 re-citing the installed spec as
293296
* 17.6.0), so `getCalendarConfig` `:294`, the `if (!calendarConfig)` arm
@@ -344,8 +347,10 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] {
344347
* This repo already records the same deletion one door over: the #13817
345348
* check in `../ui/view.zod.ts` names objectui#7029 as its runtime half.
346349
* - `gantt` → NO fallback, and no silence [#19630]. Measured at the pin
347-
* this repo builds against (`.objectui-sha` = `ab1879721`, re-read
348-
* 2026-10-03; on the hop off `89cad75d5` `ObjectGantt.tsx` changed (8
350+
* this repo builds against (`.objectui-sha` = `2e818d0b5`, re-read
351+
* 2026-10-04: `ObjectGantt.tsx` and `ListView.tsx` are byte-identical across
352+
* the hop off `ab1879721`, so every anchor held unmoved; re-read at
353+
* `ab1879721` 2026-10-03; on the hop off `89cad75d5` `ObjectGantt.tsx` changed (8
349354
* insertions, 0 deletions: one import line and objectui#11475's storage
350355
* argument on the tooltip's `percent` row), none of it in `getGanttConfig`
351356
* or the refusal arm, which are byte-identical and moved `:608` → `:609`
@@ -398,7 +403,9 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] {
398403
* requires. So the view does not draw a blank chart: it refuses, by name.
399404
* - `timeline` → date axis: NO fallback [#19630]; title: `titleField || 'name'`,
400405
* which still stands. Measured at the same pin (`.objectui-sha` =
401-
* `ab1879721`; on the hop off `89cad75d5` `ObjectTimeline.tsx` is
406+
* `2e818d0b5`; `ObjectTimeline.tsx` and `ListView.tsx` are byte-identical
407+
* across the hop off `ab1879721`, so every anchor held unmoved; on the hop
408+
* off `89cad75d5` `ObjectTimeline.tsx` is
402409
* byte-identical, so the start-date chain `:574-576` and the refusal arm
403410
* `:911` did not move, and `ListView.tsx`'s `case 'timeline'` and
404411
* `resolveTimelineDateBinding` are byte-identical, moved by 14 and by 9
@@ -444,7 +451,9 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] {
444451
* block does render; the warning still fires there, because the block the
445452
* view TYPE names is the one that is missing. Unchanged by this row.
446453
* - `map` → NO fallback, and no silence [#19630]. Measured at the same
447-
* pin (`.objectui-sha` = `ab1879721`; on the hop off `89cad75d5`
454+
* pin (`.objectui-sha` = `2e818d0b5`; `ObjectMap.tsx` and `ListView.tsx`
455+
* are byte-identical across the hop off `ab1879721`, so every anchor held
456+
* unmoved; on the hop off `89cad75d5`
448457
* `ObjectMap.tsx` is byte-identical, so `getMapConfig` `:387`,
449458
* `hasCoordinateBinding` `:493` and the refusal arm `:1291` did not move,
450459
* and `ListView.tsx`'s `case 'map'` is byte-identical, moved by 14, with

0 commit comments

Comments
 (0)