Skip to content

Commit ba95607

Browse files
chore(objectui): bump the console pin to 20c6d35 (carries objectui#12056) (#22592)
Fixes #22476 Clause-②: no This moves the bundled Console's objectui pin from `47b1f0bb7174` (PR #22496) to `20c6d351ad74d2b14a93becdc134d51b91b2d2e6`, which was objectui `main` when this bump was cut (2026-10-10T00:23:41Z). The maintainer ordered it, in the `domain:devx` seat 1's session: 「22476 插队, objectui 更新到最新版。」 and 「22476 objectui 更新到当前的最新版」. The new pin contains objectui `2a48bd408dab`, the merge of objectstack-ai/objectui#12064, which carries objectstack-ai/objectui#12056's change: Studio's page designer writes `element:repeater`'s object and limit into the node-level `dataSource`. Ruling `6051498447` on #11509 orders the work this way ("objectui first (…, the designer writes the node-level `dataSource`, …), and the spec retirement ships with the pin bump that carries it"). The retirement itself is PR #22421 (#11509), not this PR: no key retires here, no schema shape changes, and no conversion or lint rule changes. The bump follows the repo's own procedure, as PR #22412 did: `scripts/bump-objectui.sh`, then `pnpm objectui:build` and `node scripts/gen-sdui-manifest-node.mjs`, then the gates they derive. It adds no step to that procedure. This is not a release act. The Version Packages PR is untouched, and this diff edits neither `packages/console/CHANGELOG.md` nor `packages/console/package.json`. The console's release input is the new `.changeset/console-20c6d351ad74.md`. ## Range and acceptance - objectui `main` read `20c6d351ad74d2b14a93becdc134d51b91b2d2e6` at the cut, 2026-10-10T00:23:41Z (`git ls-remote`, and `origin/main` of a fresh full clone). - **REST `compare` on objectstack-ai/objectui** (base...head, head = the new pin): - `2a48bd408dab...20c6d35`: `status: ahead`, `ahead_by: 7`, `behind_by: 0`. The pin contains that merge. **This is the card's acceptance.** - `47b1f0bb7174...20c6d35`: `ahead`, 24 ahead, 0 behind. The pin moves forward from `main`'s. - `8a55f0ccda...20c6d35`: `ahead`, 5 ahead, 0 behind (objectui#12059; its checklist amendment #22487 landed as `9411faa1ba`). - `47b1f0bb7174..20c6d35` has 24 commits, 0 merges and 320 changed paths (72 added, 2 deleted, both test files). - PR #22496 (#22432) merged at 2026-10-10T00:22:34Z, before this branch had any commit. This branch then took `main`, so `.objectui-sha` is written by one open PR only. - objectui `main` has moved since the cut, to `d758f2f20dd1` (read 2026-10-10T01:36Z). This bump does not chase it: the ruling names `main` at cut time. ## The range's notable commits (the two breaking `plugin-list` changes first) 1. **`3fd862510` (objectui#6152 round 14), breaking.** The list renderers stop reading the list-view keys every door already refuses: the pre-objectui#2231 aliases (`kanban.groupField` / `cardFields`, `gallery.imageField`, `timeline.dateField`, `calendar.dateField` as a timeline axis), `calendar.defaultView`, `tree.titleField`, `options.grid`, and any undeclared key of a per-kind block. `ListView`'s projection collectors stop asking the server for the fields those keys named. 2. **`025341692` (objectui#6152 round 15), breaking.** A `chart` list view binds only an ADR-0021 `dataset`. The legacy inline axes and their `name` / `value` floors are retired on every route. A chart view that names no dataset now shows `ObjectChart`'s "Chart category axis required" refusal. (On `main`, #22528 refuses such a view at every list-view door.) 3. `3c3115e38` (objectui#5144), annotated breaking: list views read `userActions.editInline` with the spec's own default, `false`, folding a boolean `inlineEdit` into it. A grid that declares neither key no longer offers the inline-edit toggle, and the console toggle no longer writes to the view. 4. `c7b30bd66` (objectui#12063): `UnifiedViewConfig.chart` retires in `@object-ui/types` (types only). 5. `8a55f0ccd` (objectui#12059): the runtime sidebar menu is not user-reorderable; the pinned section keeps the user's order. 6. `2a48bd408` (objectui#12056): the page designer writes the repeater's query into `dataSource`, and the repeater arm takes the spec gate's `object` waiver. 7. Further annotated breaking entries, each objectui's own surface: `7282c6a51` (objectui#12055, the upload adapter no longer sends `path` as the storage scope), `e4c0b5432` (objectui#5250, `objectui validate` / `check` judge through the strict face), `1f1c4b526` and `d32869883` (objectui#6349 batches 4 and 6, type renames). 8. Console behaviour: `e97a0e2d1` (a declared `type: 'flow'` action starts its flow through `POST /api/v1/actions/:object/:action`, a route this repo serves), `9b6c19ef6` (the Attachments panel offers Upload and delete only with the `sys_attachment` grant), `2571a3eb9` (a caller without Studio access is told so), `5275d1f37` (search on the Studio landing), `d99b731f0` / `a368ccb1a` / `20c6d351a` (approval requests through the standard `provider: 'api'` door, a record card and the decision panel), `e391f8768` (an activity row names its actor from `actor_id`), `acc432806` (plugin-view's gallery reads its nested block), `d03b0227c` (`ObjectChart` refuses before it fetches). 9. Types and docs only: `b4e0787d5`, `c0c0a0d56` (objectui#6349 batches 5 and 7), `55e90fd38`, `972e56659`. The bump's digest: 33 releasing changesets across 24 non-merge commits, 0 release-nothing, 1 commit with no changeset (`972e56659`, docs). None declares `major`; six carry the author's breaking annotation. The highest declared level is `minor`, so the console changeset is `minor`. Its `adr-0087: TODO` placeholder is answered `not-required (no-migration-prescription)`, each of the six annotated entries and the three `!` subjects named in it. ## objectstack-side metadata the breaking commits could hit Measured on this tree (`git grep` over `examples/**`, `packages/**` without tests, fixtures and `packages/spec`, `content/docs/**` without `references/` and `releases/`, and `skills/**`): - **Retired list-view keys:** no list view in this repo authors one. Every non-grid list view writes only declared block keys: the showcase task views (`board`, `cards`, `calendar`, `timeline`, `gantt`, `map`, `chart`), the showcase project views (`by_status`, `budget_chart`), the showcase and platform `org_chart` tree views (`labelField`, never `titleField`), and the CRM `activity` calendar and `lead` / `opportunity` kanban views. - The keyword hits that are NOT list views, named so they are not re-chased: `content/docs/protocol/objectui/layout-dsl.mdx:815-816` (`cardTitle` / `cardFields` on an `object-kanban` component node), `content/docs/ui/pages.mdx:157-158` (`categoryField` / `valueField` on a page chart component), `content/docs/protocol/objectui/concept.mdx:198` (a dashboard widget), and object-level `imageField` / flow `dateField` keys. - **Chart list views:** the two in this repo, the showcase task view `chart` and project view `budget_chart`, both bind a dataset. Both render at the new pin (below). - **Inline edit:** the showcase task view `grid` declares `inlineEdit: true` and keeps its toggle. Grids that declare neither key lose the toggle. That is the spec's declared default (`editInline: z.boolean().default(false)`), not a break. So the rendered lists do not change for any metadata this repo ships. ## Console build and browser smoke - **Builds** (under the verify lock): the dependency closure `turbo run build --concurrency=2 --filter=@objectstack/client --filter=@objectstack/spec --filter=@objectstack/sdui-parser` (34 tasks, exit 0). Then `pnpm objectui:build` (exit 0, lock held 7m13s), with `OBJECTUI_ROOT` at a full scratch clone of objectui, so no worktree was registered in the sibling checkout. Its log reports the bundle canary `import/jobs` present, exactly one zod version literal, "Console bundle carries THIS tree's @objectstack/spec, and only it", and "@objectstack/console dist ready (64164 KB) from objectui@20c6d351ad74". - **Smoke:** Chromium (`/opt/pw-browsers/chromium`, headless, 1440x900) against `pnpm dev -- --fresh -p 38917` on this branch, serving that dist (`check:console-sha` green at boot). - **Signed out:** `/_console/` lands on the sign-in page. A deep link to a showcase list redirects to `/_console/login?redirect=…`. The only API reads are `runtime/config`, `auth/me/localization`, `auth/get-session` (the expected 401), `auth/config` and `auth/bootstrap-status`. The sign-in page reads no `/api/v1/i18n`. - **Signed in** (seeded admin): the home page lists Showcase and Setup. - **Sidebar:** the Showcase sidebar draws the authored menu (Capability Map, Page Authoring, then the Workspace, Data Model, Data Slices, Analytics and Authoring groups). Every entry offers a `Pin` button, and none is draggable. Pinning "Capability Map" puts it in a new pinned section ("Favorites") at the top. - **Tasks list views:** All Tasks (grid, 10 rows), Task List, Grid, Board (Kanban, lanes with their `summarizeField` totals), Cards (Gallery), Calendar (October 2026), Activity Timeline, Schedule (Gantt) and Hours by Status (Chart) all render. The chart draws its bars from the `showcase_task_metrics` dataset, with no refusal. - Work Locations (Map) lists its markers. Its base map fails to load because this sandbox blocks `demotiles.maplibre.org`: an environment limit, not this bump. - **Projects and Business Units:** Budget by Account (the dataset chart) and the Organization Chart tree render. - **Inline edit:** the task view `grid` offers "Edit records inline (click a cell to edit)"; All Tasks does not. - **Record and form:** the "Warehouse schema" record page renders. "New" opens the Create Task form with its fields. - Studio's landing renders for the admin. - The only console errors seen were `favicon.ico` 404 and the signed-out session 401. ## What changed here | file | written by | gate that required it | |---|---|---| | `.objectui-sha` | `OBJECTUI_ROOT=… scripts/bump-objectui.sh 20c6d35… --no-commit` | Console Pin Gate builds what it names | | `.changeset/console-20c6d351ad74.md` | the same run (the digest); the only later edit is the ADR-0087 answer | `check-adr-0087-registration`, `check:objectui-changeset` | | `scripts/sdui-manifest.record.json` | `node scripts/gen-sdui-manifest-node.mjs` over `.cache/objectui-20c6d351ad74` | `check-sdui-manifest.mjs` | | `packages/sdui-parser/objectui-lockstep.json` | `node scripts/check-sdui-lockstep.mjs --update`, `OBJECTUI_ROOT` at the same built tree | `check:sdui-lockstep` | | 55 asserting citations in 15 files under `packages/spec/src` (the generated `migrations/registry.ts` among them), plus three quoted anchors of the dated `view.zod.ts` map record | re-measured by hand (below); `registry.ts` by `gen:migration-registry` | `check:objectui-pin-citations` (and `--verify-anchors`) | | `.changeset/objectui-pin-citations-20c6d351ad74.md` | hand-written, `@objectstack/spec` patch | Check Changeset (the shipped describes name the pin) | | `content/docs/references/ui/view.mdx` | `gen:docs` | `check:docs` | - `sdui.manifest.json` is byte-identical across the range: the generator rewrote it to the same bytes (sha256 `097ae3cbcf95…`, 107 components), so only its record moves. objectui's workspace version stays 17.7.0. - The lockstep records 214 grammar lines (blob `0131f27cf86d`), 25 diagnostic codes and containment predicate `76c18fb95d1f`, all unchanged. objectui's `packages/sdui-parser` is untouched by the range, so no port is owed. - Diff size: 21 files, +476 / -111 against `main`, generated files included. ## How the citations were re-measured - **Method.** Each asserting record's cited objectui files were resolved at `47b1f0bb7174` and intersected with the range's 320 changed paths. Every anchor in a changed file was mapped through `git diff -U0 47b1f0b 20c6d35` and its text compared at both pins. A record whose cited files are all byte-identical (`git diff --quiet`) gains that sentence and no re-pointing. - **Changed cited files:** `ListView.tsx`, `ObjectTimeline.tsx`, plugin-view's `ObjectView.tsx`, `objectql.ts`, `objectql.zod.ts`, `KanbanImpl.tsx`, `plugin-grid/src/index.tsx`, `ActionRunner.ts`, `data-objectstack/src/index.ts`, `previews/block-config.ts`, and the `en` / `zh` / `de` packs (whose `calendar.configRequired` strings did not change). - **Re-pointed, each byte-identical:** - `KanbanImpl.tsx` `:668` / `:681` -> `:671` / `:684`; - `ActionRunner.composeSuccessMessage` `1504` -> `1498`; - the `object-timeline` read points, `:306`-`:565` each by +1 (`:30` and `:591` on held); - `data-objectstack`'s `translateFilterArray` arm `5042-5053` -> `5048-5059`; - `resolveListMapConfig` `147` -> `200`, `case 'map':` in plugin-view's `ObjectView.tsx` `2340` -> `2461`, `ObjectMapConfigSchema` `2513` -> `2523` (still `.strict()`); - the `case 'timeline'` / `case 'map'` arms moved by 50 / 52. - **Read around the same read and said so in the hop sentence:** - the `case 'calendar'` and `case 'gantt'` arms: their raw spreads and the calendar's `defaultView` lift retired; the date bindings stay conditional, with no floor; - `ObjectTimeline.tsx`'s start-date chain `:589-591`: lost the nested `timeline.dateField` rung, still ends without a literal rung; - `resolveTimelineDateBinding` `634` -> `686`: its alias rung retired; - `previews/block-config.ts`: the two inspectors re-read, `311-345` -> `311-351`, with the repeater's rows now writing `dataSource`. - **A read point that died, reported and not rewritten:** the `OBJECT_TREE_FLAT_CONFIG_GUIDANCE` docblock in `ui/component.zod.ts` keeps `titleField` in the flat tree key set because `ListView.tsx:3927` resolved `treeCfg.titleField` into `labelField`. objectui `3fd862510` removed that rung; the arm now emits `labelField: treeCfg.labelField || 'name'` (`:3986`). The record's hop sentence says so, and its paragraph and the key set are left as they are: changing the key set is a schema decision this re-read does not make. The guidance still prescribes the right key (`tree.labelField`) for a flat `titleField`, so nothing an author sees is wrong. - **Corpus counts.** The six migration entries' counts were re-taken with `git grep -o -F`. That method first reproduced every `47b1f0bb7174` number: 8281 files, `objectstack` 17980, `@objectstack/spec` 7523, `useState` 2630, `timeout` 1674, `RuntimeConfig` 337, `resourceLimits` 2, `window` 4449, `period` 249, `interval` 213, `metrics` 455, `Span` 517, `SpanSchema` 57, `TTL` 184 and `tenant` 1338. - At the new pin they read 8351 files, `objectstack` 18047, `@objectstack/spec` 7545, `useState` 2630, `timeout` 1694, `RuntimeConfig` 337, `resourceLimits` 2 (the same two `packages/app-shell` prose hits), `window` 4470, `period` 249, `interval` 213, `metrics` 456, `Span` 517, `SpanSchema` 57, `TTL` 184 and `tenant` 1340. - All 97 zero-tokens (the exports of `plugin-lifecycle-advanced.zod.ts`, `tracing.zod.ts` and `metrics.zod.ts`, plus every named key) still read zero. ## For the contract review: changed lines in `packages/spec/src/**` that are neither a comment nor a string fragment There are none. Measured mechanically: each changed file was parsed with the TypeScript compiler at `main` and at the head, JSDoc dropped, comments skipped, and every string, template and regular-expression literal replaced by one placeholder token. The remaining token sequences are identical in 12 of the 15 files. The other three: - `18.system-metrics-jsdoc-durations-unit-in-key.ts` and `18.system-tracing-otel-exporter-durations-unit-in-key.ts` each gain one `+` joining one new string fragment into their `reason` string. - `migrations/registry.ts` mirrors both. No identifier, key, value or export moves. The one shipped `describe` that changes is `FormField.span`'s, and only its sha moves. ## Gates and tests Everything below ran at head `0b3e83ce5`, the merge of `origin/main` `96e4be482`, after a full workspace build at that head (`turbo run build --concurrency=2`, 72 tasks, exit 0). Exit codes were captured before any pipe. - **Derived gates.** `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derived 127 commands from 21 changed paths against merge base `96e4be482`. All 127 ran and exited 0. The `--ran` reconciliation reads "127 derived famil(ies) accounted for — 127 run, 0 NOT-MEASURED (a DERIVED zero — all 127 recorded an exit code and none of them is 3)". - **Verdict lines of the gates this bump exists for:** - `check:objectui-pin-citations`: "55 asserting objectui pin citation(s) match .objectui-sha (20c6d35), 145 historical citation(s) recorded and not checked, across 1946 spec source(s)." With `--verify-anchors` (`OBJECTUI_ROOT` at a full objectui clone): "13 anchor content assertion(s) verified against objectui at 20c6d35". - `check:sdui-lockstep`: "OK — this copy is byte-identical to objectui@20c6d351ad74 … over 214 grammar line(s) [blob 0131f27cf86d], agrees on all 25 diagnostic code(s) and on the `not-a-container` predicate". - `check-sdui-manifest.mjs`: "present, intact (sha256 097ae3cbcf95…, 107 components) and recorded at the live objectui pin 20c6d35…". - `check:console-sha`: "Console dist matches the objectui pin (objectui@20c6d351ad74)". `check:console-injection`: "the dist carries this tree's copy, and not the published one". - `check-adr-0087-registration --base origin/main`: "1 declared-breaking changeset(s), each carrying an ADR-0087 disposition". `check-changeset-no-major --base origin/main`: "This diff introduces no `major` bump". - `check:generated`: "All 15 generated artifacts are up to date". `check:migration-registry`: "src/migrations/registry.ts is current (412 semantic, 247 retired-key, 222 retired-def)". `check:api-surface`: "public API surface + factory signatures unchanged". `check:nul-bytes`: OK, no raw control bytes. - **Tests.** - `@objectstack/spec` vitest (its `test` script, `--project local`): 638 files, 19014 passed, 1 todo. `@objectstack/spec` typecheck, the scripts and test-layer checks included: exit 0. - `@objectstack/sdui-parser`: 14 files, 225 passed; typecheck exit 0. - `@objectstack/lint` `validate-jsx-pages.production-witness.test.ts`: 5 passed. `@objectstack/metadata-protocol` `protocol.runtime-authoring-gate.test.ts`: 133 passed. - `@objectstack/cli`, unit tier (`sdui-manifest`, `console.sha-drift`, `validate-build-gate-parity`, `console-resolve`): 4 files, 108 passed. The integration tier is declared to CI: this diff touches no integration-tier file and no spawn entry. - **Lint, narrowed and proven.** ESLint (`--no-inline-config`) over the 15 changed TS files under `packages/spec/src`: 0 errors, 0 warnings, 15 files by the `--format json` count. The population is the `eslint.config.mjs` block that lints every `ts` file (line 971). The config never enables type-aware linting (line 328), so this diff cannot move the verdict on any file it does not touch. The repo-wide `pnpm lint` is CI's run. - **`main` after the last merge.** `origin/main` gained `25be87612` (#22570, `plugin-security` only) after `0b3e83ce5`. It touches no file of this diff, so there is no further merge here; CI and the merge queue judge the merge. ## Acceptance notes - **`functional-completeness.ts`, the `kanban` and `tree` rows.** They carry no asserting citation, and they still describe `groupByField || groupField || detectStatusField(objectDef)` and `labelField || titleField || 'name'`, with a sentence saying both were re-read at the pin. At this pin `ListView` reads neither alias (`3fd862510`). The `view/layout-without-binding` message those rows feed is still true: with no block, the board detects a status field and the tree labels by `name`. Only the docblock's rung list is stale. Noted here only, carrier: none. - **The `OBJECT_TREE_FLAT_CONFIG_GUIDANCE` rationale** (above): stale rationale, correct prescription. Carrier: none. - **objectui `main` moved** to `d758f2f20dd1` after the cut. The next bump picks it up. - **The shallow checkout:** `check-plugin-teardown-shape.mjs --self-test` first exited 3 because this checkout could not read its pinned fixture commit `621a48760788`. That commit was fetched (`git fetch --depth=1 origin 621a487…`, objects only) and the self-test re-ran to exit 0. A prerequisite, not a red. - **Writes.** This PR was opened through `scripts/pm/fleet-write/dispatch.mjs` (`pr_create`, draft), and its assignee set through `scripts/pm/label-write.mjs`. No label was written, `skip-changeset` included: the path and size labels come from `pr-automation.yml`. No MCP write was used. --- _Generated by [Claude Code](https://claude.ai/code/session_01LYXc6ckoWuZyVZpWYizdMh)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 3e72f93 commit ba95607

21 files changed

Lines changed: 476 additions & 111 deletions

‎.changeset/console-20c6d351ad74.md‎

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
---
2+
"@objectstack/console": minor
3+
---
4+
5+
Console (objectui) refreshed to `20c6d351ad74`. Frontend changes in this range:
6+
7+
Derived from the changesets objectui declared over the range — 33 releasing of 33 changesets added across 24 non-merge commits; omitted: 1 commit carrying no changeset (they ship no package code).
8+
9+
- **minor** — The approval decision panel draws a short notice instead of nothing when it is placed anywhere other than an approval request's record page (objectui#12072). (objectui `20c6d351a`)
10+
- **minor** — The per-group aggregation type that `useGroupedData` takes is declared and exported as `GroupAggregationConfig` instead of `AggregationConfig` (objectui#6349, batch 7). `@object-u… (objectui `c0c0a0d56`)
11+
- **minor** — The view switcher's views are typed as `@object-ui/core`'s `ListViewVisualization`, and this package no longer re-exports that union as `ViewType` (objectui#6349, batch 7). `@obje… (objectui `c0c0a0d56`)
12+
- **minor** — The console sidebar no longer lets a user drag the app's menu into a private order; the Pinned section is now the one place a user orders entries (objectui#12059). Arranging an ap… (objectui `8a55f0ccd`)
13+
- **minor** — feat(types)!: `UnifiedViewConfig.chart` retires with a tombstone that names the spec's list chart block, and the three `object-chart` legacy-axis refusals stop calling those keys… (objectui `c7b30bd66`)
14+
- **minor** — An `element:repeater` node may omit `properties.object` when its `dataSource.object` names the object. The zod arm `ElementRepeaterBlockSchema` now applies the same `object` waive… (objectui `2a48bd408`)
15+
- **minor** — A pointer field draws the record it points at, the console reads an approval request's record page through the approvals routes, and the approval decision panel is built for the r… (objectui `a368ccb1a`)
16+
- **minor** — feat(plugin-list)!: a chart list view binds only an ADR-0021 `dataset`; the legacy inline chart axes and their `name` / `value` floors are retired on every route (objectui#6152, r… (objectui `025341692`)
17+
- **minor** — **BREAKING** — `createObjectStackUploadAdapter` no longer sends an upload's `path` as the storage scope (objectui#12055). (objectui `7282c6a51`)
18+
- **minor** — **BREAKING** — The result type of `useConfirmDialog` is declared as `DesignerConfirmDialogState` instead of `ConfirmDialogState` (objectui#6349, batch 6). `@object-ui/app-shell` declares an unre… (objectui `1f1c4b526`)
19+
- **minor** — feat(plugin-list)!: the renderers stop reading the list-view keys every door refuses: the pre-#2231 aliases, `calendar.defaultView`, and the undeclared keys a per-kind block carri… (objectui `3fd862510`)
20+
- **minor** — **BREAKING** — `objectui validate` and `objectui check` judge a document through the strict authoring face (objectui#5250) (objectui `e4c0b5432`)
21+
- **minor** — The runtime chat contracts have their own names, apart from `@object-ui/types`' authoring `ChatMessage` / `ChatToolInvocation` (objectui#6349, batch 5). The shape `<ChatbotEnhance… (objectui `b4e0787d5`)
22+
- **minor** — `UndoRedoEntry`, `UndoRedoConfig` and `UndoRedoState` are retired from this package (objectui#6349, batch 5). Nothing in the repository read or wrote any of the three, `@objectsta… (objectui `b4e0787d5`)
23+
- **minor** — A caller without Studio access who opens a Studio URL (`/studio`, a package's pillar builder, or the package-less scope) is told why (objectui#12035). The console's Studio entry g… (objectui `2571a3eb9`)
24+
- **minor** — **BREAKING** — List views read `userActions.editInline` with the spec's default, off. A view's `inlineEdit` folds into it, and the console's inline-edit toggle no longer writes to the view (obje… (objectui `3c3115e38`)
25+
- **minor** — The Studio landing (`/studio`) gets search (objectui#11863). It mounts the command palette, so its header shows the "Search ⌘K" trigger and `Ctrl+K` / `⌘K` opens the palette. Unti… (objectui `5275d1f37`)
26+
- **minor** — **BREAKING** — The metadata-admin widget registry's labelling vocabulary (`WidgetLabelling`) and the dashboard widget inspector's `labelling` prop are typed against `@object-ui/core`'s `Registry… (objectui `d32869883`)
27+
- **minor** — `ActionContext`, `ActionResult`, `UndoableOperation` and `ComponentMeta` are re-exported from `@object-ui/types` instead of declared a second time here (objectui#6349, batch 4), s… (objectui `d32869883`)
28+
- **minor** — **BREAKING** — `FIELD_WIDGET_LABELLING` is typed against `@object-ui/core`'s `RegistryComponentMeta['labelling']` instead of `ComponentMeta['labelling']` (objectui#6349, batch 4). `@object-ui/co… (objectui `d32869883`)
29+
- **minor** — `ActionContext` and `ActionResult` each have one declaration again, here, and `UndoableOperation` is published from this package (objectui#6349, batch 4). `@object-ui/core` used t… (objectui `d32869883`)
30+
- **patch** — The board implementation types its `conditionalFormatting` rules as `@object-ui/types`' `KanbanConditionalFormattingRule` by that name, instead of through a module-local alias nam… (objectui `c0c0a0d56`)
31+
- **patch** — A record's History tab and activity feed name the user behind an activity row that carries `actor_id` and no `actor_name` (objectui#12067). On `@objectstack/*` 17.7.0 the audit wr… (objectui `e391f8768`)
32+
- **patch** — A gallery view handed to `ObjectView` now draws with the `coverFit`, `cardSize` and `visibleFields` its `gallery` block declares (objectui#12053). (objectui `acc432806`)
33+
- **patch** — `ObjectChart` decides its missing-category-axis refusal before it fetches, so a chart that refuses reads nothing (objectui#12061). (objectui `d03b0227c`)
34+
- **patch** — The page designer writes a repeater's query into its node-level `dataSource` binding, as it already does for `element:number` (objectui#12056, the repeater half of objectui#11880). (objectui `2a48bd408`)
35+
- **patch** — The flow designer's structural-check finding type is declared as `FlowSimDiagnostic` instead of `Diagnostic` (objectui#6349, batch 6), because `@object-ui/sdui-parser` publishes `… (objectui `1f1c4b526`)
36+
- **patch** — The `objectui doctor` check-result types are declared as `DoctorDiagnostic` and `DoctorDiagnosticLevel` instead of `Diagnostic` and `DiagnosticLevel` (objectui#6349, batch 6), bec… (objectui `1f1c4b526`)
37+
- **patch** — Doc comments now name the runtime message type `ChatbotEnhancedMessage`, its name since objectui#6349 batch 5, instead of `ChatbotEnhanced.ChatMessage` (objectui#6349, batch 6). (objectui `1f1c4b526`)
38+
- **patch** — Comments and test names only (objectui#5250). The `@object-ui/types` docblocks that called `safeValidateSchema`, the tolerant face, what `objectui validate` or `objectui check` ru… (objectui `55e90fd38`)
39+
- **patch** — The record Attachments panel offers Upload and delete only to a caller whose `sys_attachment` grant allows them (objectui#12047). (objectui `9b6c19ef6`)
40+
- **patch** — A console click on a declared `type: 'flow'` action now starts its flow through the action endpoint, `POST /api/v1/actions/:object/:action`, so the server-side gates that action d… (objectui `e97a0e2d1`)
41+
- **patch** — Approval requests can now be read by the standard list and record views, and `ApiDataSource.findOne` now rejects a refused or failed read instead of reporting the record as missin… (objectui `d99b731f0`)
42+
43+
⚠️ 6 of these carry a breaking change: 6 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.
44+
45+
**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.
46+
47+
- _(no changeset)_ docs(agents): an authored `events` bag is refused by `objectui validate` once PR objectui#11069 lands (objectui#5250) (#12050) (objectui `972e56659`)
48+
49+
<!-- adr-0087: not-required (no-migration-prescription)
50+
This diff moves `.objectui-sha` and the artefacts that travel with it: this console
51+
changeset, the re-recorded `scripts/sdui-manifest.record.json` (the regenerated
52+
`sdui.manifest.json` is byte-identical across the range, 107 components), the
53+
re-recorded `packages/sdui-parser/objectui-lockstep.json` (its grammar region,
54+
diagnostic codes and containment predicate are unchanged across the range) and the
55+
re-measured pin citations in `packages/spec/src`, which carry their own
56+
`@objectstack/spec` patch changeset. It adds, removes or renames no
57+
ObjectStack-authorable key: no Zod schema, no spec declaration and no stored
58+
`sys_metadata` shape moves in it, so `objectstack migrate meta` has nothing here to
59+
rewrite, and this body carries no FROM/TO prescription of its own.
60+
The range carries six declared-breaking objectui changes, each by its author's
61+
breaking annotation and none by a declared `major`. Each is answered here:
62+
(1) objectui#12055 (`7282c6a51`): `@object-ui/providers`' upload adapter no longer
63+
sends an upload's `path` as the storage scope. The scope vocabulary is the server's
64+
`sys_file` `scope` select, which this repo already enforces; nothing moves here.
65+
(2) objectui#6349 batch 6 (`1f1c4b526`): `useConfirmDialog`'s result type is
66+
declared as `DesignerConfirmDialogState`. An objectui TypeScript type; no ObjectStack
67+
key.
68+
(3) objectui#5250 (`e4c0b5432`): `objectui validate` and `objectui check` judge a
69+
document through objectui's strict authoring face. objectui's own CLI; this repo's
70+
`os validate` and publish doors are unchanged.
71+
(4) objectui#5144 (`3c3115e38`): list views read `userActions.editInline` with the
72+
default `@objectstack/spec` already declares (`false`), folding a boolean
73+
`inlineEdit` into it. The renderer now follows this repo's existing declaration, so
74+
nothing here moves. Measured on this tree: the showcase task view `grid`
75+
declares `inlineEdit: true` and keeps its toggle; a grid that declares neither key no
76+
longer offers one.
77+
(5) and (6) objectui#6349 batch 4 (`d32869883`): `WidgetLabelling` and
78+
`FIELD_WIDGET_LABELLING` are typed against `RegistryComponentMeta['labelling']`.
79+
objectui TypeScript types; no ObjectStack key.
80+
Three more commits carry `!` in their subject and are listed above at their declared
81+
level: objectui#6152 rounds 14 and 15 (`3fd862510`, `025341692`), where the list
82+
renderers stop reading the per-kind block keys and the legacy chart axes that
83+
`@objectstack/spec`'s view write door already refuses, and objectui#12063
84+
(`c7b30bd66`), `UnifiedViewConfig.chart` retired in objectui's types. They follow this
85+
repo's existing declarations. Measured on this tree: no example, package or docs
86+
list view authors a retired key, and both chart list views (the showcase task
87+
view `chart` and project view `budget_chart`) bind an ADR-0021 dataset.
88+
Scope of the claim, stated rather than implied: it is a claim about THIS diff, not a
89+
per-entry re-measurement of the upstream declared-breaking entries.
90+
-->
91+
92+
objectui range: `47b1f0bb7174...20c6d351ad74`
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
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 `20c6d351ad74`.
6+
7+
Clause-②: no
8+
9+
Every anchor was mapped through the objectui diff `47b1f0bb7174..20c6d351ad74`: 320 paths over 24 commits, 2 of them deleted test files, none renamed. Ten files a record cites changed on the hop, plus the `en` / `zh` / `de` packs: `ListView.tsx` and `ObjectTimeline.tsx` (objectui#6152 rounds 14 and 15), plugin-view's `ObjectView.tsx`, `objectql.ts` and `objectql.zod.ts` (the same rounds and objectui#12063), `KanbanImpl.tsx` and `plugin-grid/src/index.tsx` (objectui#6349 batch 7), `ActionRunner.ts` (objectui#6349 batch 4), `data-objectstack/src/index.ts` (objectui#5144) and `previews/block-config.ts` (objectui#12056). Every cited line in them moved or held with its text byte-identical, except in the four readings below, and each record that cites one is re-pointed with a hop sentence that says by how much. The records that cite only byte-identical files gain a hop sentence that says so.
10+
11+
Three readings changed around a cited read, and each hop sentence says what it found:
12+
13+
- The calendar, gantt and tree arms of `ListView.tsx` changed inside (objectui `3fd862510` retired their raw block spreads, the calendar's `defaultView` lift and the tree's `titleField` label rung). The calendar and gantt rows of `functional-completeness.ts` still hold: their date bindings stay conditional, with no floor.
14+
- `previews/block-config.ts` now writes the repeater's object and limit into the node-level `dataSource` (objectui#12056); the two inspectors span `311-351`.
15+
- `ObjectTimeline.tsx`'s start-date chain lost its nested `timeline.dateField` rung; it still ends without a literal rung, and the component's `schema.*` read set is unchanged.
16+
17+
The fourth reading: one record names a read that is gone at this pin. The `OBJECT_TREE_FLAT_CONFIG_GUIDANCE` docblock keeps `titleField` in the flat tree key set because `ListView`'s flatten resolved `treeCfg.titleField` into `labelField`. objectui `3fd862510` removed that rung. The hop sentence records it; the paragraph and the key set are left as they are, because changing the key set is a schema decision this re-read does not make.
18+
19+
The six migration entries' corpus counts were re-taken with `git grep -o -F`, the method that reproduces every `47b1f0bb7174` number. The corpus is now 8351 tracked files. Every token an entry counts as zero still reads zero (97 tokens). The controls moved with the corpus, for example `objectstack` from 17980 to 18047 and `timeout` from 1674 to 1694.
20+
21+
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-
47b1f0bb71748a7d16f36edecc50059367d2e35a
1+
20c6d351ad74d2b14a93becdc134d51b91b2d2e6

‎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` = `47b1f0bb7174`), 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` = `20c6d351ad74`), 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` = `47b1f0bb7174`), 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` = `20c6d351ad74`), 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 |

0 commit comments

Comments
 (0)