Skip to content

chore: bump the console pin to objectui 6d77acfe3125 (123 commits, not 405) - #8137

Merged
hotlong merged 1 commit into
mainfrom
claude/issue-8051-console-pin-bump
Aug 12, 2026
Merged

chore: bump the console pin to objectui 6d77acfe3125 (123 commits, not 405)#8137
hotlong merged 1 commit into
mainfrom
claude/issue-8051-console-pin-bump

Conversation

@hotlong

@hotlonghotlong commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Fixes#8051

Bumps the vendored console pin via the dedicated bump path and rebuilds packages/console/dist, then re-checks both symptoms the card named. Nothing here is hand-edited: pnpm objectui:refresh (scripts/bump-objectui.sh + scripts/build-console.sh) wrote every tracked change except the ADR-0087 disposition the bump script explicitly requires a human to answer.

Pin:6314e87f2d49b1ff3b158c296f1b2a52d14dff686d77acfe3125949796918ea12b926d3460bc933d (objectui main).

The gap is 123 commits, not 405

The card measured "405 commits ahead" and the dispatch expected the re-measurement to come out larger. It comes out smaller, and three independent measurements agree on 123:

measurementresult
git rev-list --count OLD..HEAD in a full objectui clone123
same with --first-parent123
check:objectui-pin-fresh's own log-walk"123 non-merge commit(s)"

The card's own waypoint checks out consistently: b4d3c2204 (the tip it measured) is an ancestor of the new pin, OLD..b4d3c2204 is 121 and b4d3c2204..HEAD is 2. So 405 is not reproducible from any of these; the pin was 121 commits behind when the card was filed, not 405. Flagging it because the card's framing — "an order of magnitude larger" than #7411's 18 — rests on that number, and the real multiple is closer to 7x than 22x. The staleness itself is real either way.

Range composition, from the digest: 99 releasing changesets (0 major / 22 minor / 77 patch) out of 115 added, across 123 non-merge commits; 16 release-nothing, 11 commits carrying no changeset.

Symptom 1 — objectui#4229's combo fix: FIXED

Confirmed at three levels rather than assumed:

  • The fixing commit is in range: 3c6e84cca fix(plugin-dashboard): draw an authored combo as a combo on the dataset path (#4229) (#4298).
  • Source at the new pin: git show 6d77acfe3125:packages/plugin-dashboard/src/DatasetWidget.tsx | grep combo returns combo: 'combo' at line 359 plus its rationale block; the same probe at the old pin returned nothing.
  • The rebuilt bundle actually serves itassets/plugin-dashboard-sS6Qwuba.js contains the resolved mapping …sankey:\sankey`,combo:`combo`}and the widget-kind set carryingcombo`.

Symptom 2 — #7804's GlobalFilterSchema.object: NOT FIXED, and no pin bump can fix it

This is the finding the card did not anticipate. After the bump and rebuild, GlobalFilterSchema in the newly built assets/vendor-objectstack-DneBps14.js still declares exactly:

name, field, label, type, options, optionsFrom, defaultValue, scope, targetWidgets

object is absent from precisely the slot #7804 put it in (between field and label), and #7804's own describe() text — translation-bundle entry resolves this filter — matches 0 times in the bundle. (optionsFrom.object does appear and is a different key; a bare grep for object false-positives here.)

The cause is publish ordering, not pin staleness:

  1. objectui pins "@objectstack/spec": "^17.0.0-rc.6" at both the old and the new pin, and its lockfile resolves to exactly 17.0.0-rc.6. build-console.sh installs --frozen-lockfile, so it does not float.
  2. @objectstack/spec@17.0.0-rc.6 was published to npm 2026-08-10T13:09:42Z; spec: GlobalFilterSchema needs an optional object — a dashboard global filter's field label (and its option labels) have no bundle key to resolve against #7804's key landed at 7dc10673 on 2026-08-12T11:36:21Z, two days later. Verified against the tarball actually installed into the build tree: .cache/objectui-6d77acfe3125/node_modules/@objectstack/spec is 17.0.0-rc.6 with 0 matches for the key.
  3. 17.0.0-rc.6 is the highest version on npm, and this repo's packages/spec/package.json is also17.0.0-rc.6 — the workspace has moved past the published tarball under an unchanged version string, so even the ^ range cannot reach the new content.
  4. build-console.sh injects only OBJECTSTACK_CLIENT_DIST (packages/client); there is no equivalent injection for packages/spec.

So the key becomes UI-authorable only after a spec release publishes it, then objectui relocks onto that version, then the pin moves again — three ordered steps across two repos, none performable here. Filed as #8134 with the general shape (any authorable key added after the last spec publish is server-accepted and designer-rejected, while the framework-side card closes green). #8134 remains open and is not addressed by this PR.

Gates

Both required gates are green, and they are different claims:

  • pnpm check:console-sha — "Console dist matches the objectui pin (objectui@6d77acfe3125)."
  • pnpm check:objectui-pin-fresh — "objectui pin is FRESH — .objectui-sha is objectui main". Red before this change (EXIT=1, 123 pending).

node scripts/pm/dispatch-gates.mjs .objectui-sha .changeset/console-6d77acfe3125.md surfaced three families beyond the dispatch list; all run and green: check:changeset-gate-self-tests (118 + 153 + 117 assertions), check:objectui-changeset (both self-tests), check-changeset-no-major ("introduces no major bump"). Also check:nul-bytes — OK over 7407 files.

The one judgement call: the ADR-0087 disposition

The bump script emitted adr-0087: TODO — the pin bump cannot answer this; a human must and check-adr-0087-registration rejects that placeholder by design. The range declares 10 breaking changes, so the question had to be answered rather than deleted.

I judged the ten one by one against their upstream changesets. All are TypeScript declaration surfaces of objectui's own npm packages — @object-ui/core, react, components, types, permissions, plugin-chatbot, data-objectstack — and none is reachable through @objectstack/console, whose files list is ["dist", "README.md", "CHANGELOG.md"] and whose sole exports entry is ./package.json; it forwards no @object-ui/* module entry point. No packages/spec schema, authorable key or protocol surface changes in the range, so there is no stored-metadata rewrite to prescribe. Where a prescription exists it runs the other way — ActionDef's unified visible/disabled shape and the 14 renamed symbols are objectui catching up to spec 17.0.0-rc.6, whose spec-side halves were disposed of in this repo's own PRs. Disposition: not-required (no-migration-prescription), matching the route the two most recent breaking console bumps took (console-8aad9fd50b16.md, console-09987b680d53.md).

Scope notes

Console section for the release page

Produced now because it is cheap here and expensive to reconstruct later. Regenerate verbatim with:

node scripts/objectui-range.mjs --from 6314e87f2d49b1ff3b158c296f1b2a52d14dff68 --to 6d77acfe3125949796918ea12b926d3460bc933d

(Positional args are framework refs; objectui SHAs need --from/--to.) content/docs/releases/ is untouched — release notes are written centrally at release time.

One character is altered below to survive GitHub's body sanitizer: in the lint entry, < button carries an inserted space that the real output does not have. Regenerate with the command above rather than copying that line.

!-- objectui 6314e87f2d49..6d77acfe3125 — 99 releasing changeset(s) of 115 added across 123 non-merge commit(s) --
_Largest areas: i18n (13), app-shell (13), console (8), components (6), fields (4), react (3), plugin-dashboard (3), plugin-chatbot (3), plugin-grid (3), detail (3)_### Breaking changes-**core**`rowHeightToDensityMode` answers only for the five spec row heights — the coerce-to-`comfortable` fallback is gone (objectui `fe52a0406`)
-**react**`bridgeListView` maps the five row heights the spec admits, and only those — the four dead spellings are gone (objectui `d7f3e308b`)
-**components** — The action renderers publish the modern `UIActionSchema`, and every `forwardRef` renderer's props parameter is annotated so its declared types survive (objectui `dc2aa3e77`)
-**sweep** — Retire two post-retirement dead surfaces (#4364, #4368). Both were measured at this branch point rather than taken from their cards, and one card's premise only half held. (objectui `2a40f699d`)
-**core** — Retire `ActionEngine`'s event-mapping API (objectui#3368). `ActionEngine.addMapping()`, `ActionEngine.dispatch()`, the private `mappings` registry behind them, and the exported `A… (objectui `2459a3e70`)
-**plugin-chatbot**`@object-ui/plugin-chatbot`'s `ChatMessage` is now one type instead of two (objectui `3256b141f`)
-**sweep** — Retire four zero-consumer declared surfaces (dead-surface sweep batch 3, #4328). Each was measured as declared-but-never-read at the branch point, and each is removed rather than… (objectui `d9d346307`)
-**core,app-shell** — Close `ActionDef` — delete the `[key: string]: any` index signature and converge `visible` / `disabled` on the spec's unified shape. (objectui `ee66e2ebf`)
-**@object-ui/data-objectstack** — data-objectstack: retire the phantom `CloudOperations` surface — the class, its three `Cloud*` types, and the module that claimed to integrate a cloud namespace no client has ever… (objectui `2776b110b`)
-**i18n** — Stop declaring 14 symbols under names `@objectstack/spec` owns at `17.0.0-rc.6` (objectui#4167, objectstack#4115). (objectui `bb68488ff`)
### Features-**plugin-dashboard**`MetricWidgetProps` / `MetricCardProps` declare the DOM pass-through their spread has always accepted (objectui `f24427334`)
-**plugin-chatbot**`useObjectChat` declares the message shape it actually hands back (objectui `eec2e4fd1`)
-**plugin-grid** — grid row menu — the built-in Edit/Delete predicate declarations are derived from the spec-owned authoring type, not hand-restated (objectui `24bb2de4f`)
-**i18n** — i18n: retire the reader-less `common.search` key from all ten locale packs (objectui `ac853ce92`)
-**app-shell** — fix(app-shell): a transient 404 no longer retires the shared inbox feed for the page's lifetime (objectui `ca269fecd`)
-**console** — console: seed the UI language from the tenant's server-side locale (objectui `78fa33141`)
-**plugin-grid** — ObjectGrid's host-driven pagination mode is a declared interface instead of twelve `(rest as any)` reads (objectui `51ac39f73`)
-**app-shell,console**`resolveHostAppSegment` is published from `@object-ui/app-shell`'s package root, and the console's local copy of it is deleted (objectui `e4d1c085e`)
-**console** — An unloadable app list no longer lands you on `/home` as though you had no default app — and the Applications page's Set-as-default / Disable / Delete now actually write (objectui `3b7d1cc6d`)
-**console** — Internal `/forms/:name` renders inside the console shell, and an internal submit lands on the record it just created (objectui `90e792e11`)
-**app-shell** — The console's language menu now asks the app which locales it actually ships, instead of always offering the same ten. (objectui `66fb4fae2`)
-**i18n**`element:record_picker` publishes `sort`, `limit` and `emptyText` as authoring inputs (objectui#4167). (objectui `bb68488ff`)
### Fixes-**react** — fix(react): the spec bridge abstains on a non-string `rowHeight` instead of coercing it to a density, matching core (objectui `47f551b06`)
-**components**`element:button`'s action forward is excess-property checked again — a misspelled key on that payload is now a compile error, not silence (objectui `b4d3c2204`)
-**plugin-grid** — standalone ObjectGrid resolves off-spec `rowHeight` to compact, matching ListView and the spec bridge, instead of silently styling it as medium (objectui `5e514c424`)
-**react** — The spec bridge abstains on prototype-member `rowHeight` spellings instead of leaking a function into `density`. (objectui `8f85f8bed`)
-**plugin-calendar** — fix(plugin-calendar): authoring `events` on a `calendar-view` node no longer takes the calendar down (objectui `49b9de6a6`)
-**lint** — Every plain `< button>` now declares its `type`. HTML defaults an untyped button to `type="submit"`, so any of these buttons would submit the form it was composed into instead of r… (objectui `d0c3b26ca`)
-**app-shell**`AiChatPage` narrows the chat hook's messages through the exported `toRuntimeMessages` adapter instead of five casts (objectui `d8d0d665d`)
-**plugin-dashboard** — KPI cards no longer write their own schema onto the DOM — `MetricWidget` and `MetricCard` keep `SchemaRenderer`'s schema-shaped props out of the `...props` spread (objectui#4357). (objectui `306c10136`)
-**fields** — fields: the currency adornment has one symbol channel (objectui `3a9021e26`)
-**components**`@object-ui/components` compiles under `noImplicitAny` — the workspace's last strict-relaxing package (objectui `4dadf0d3d`)
-**components** — data-table row menu — the built-in Edit/Delete predicate parameters are derived from the authoring type, not hand-restated (objectui `4b70d287c`)
-**plugin-chatbot** — Replace the three `messages as any` casts at the `@object-ui/types``@object-ui/plugin-chatbot``ChatMessage` boundary with one explicit typed adapter (`toRuntimeMessages` / `au… (objectui `37bbc42d1`)
-**fields** — Currency amounts now follow each currency's own ISO 4217 fraction-digit convention instead of a hardcoded 2 (objectui#4361). (objectui `0f2134831`)
-**plugin-charts** — Analytics: `ObjectChart` consumes the shared label-net helpers instead of a third copy (objectui `0b49d6032`)
-**i18n** — Inline-edit toggle reads "Edit fields" without an I18nProvider, matching every locale pack (objectui `e076fd50f`)
-**gate**`@object-ui/plugin-detail` now declares `react-router-dom` as a peer dependency (`^6.0.0 || ^7.0.0`), the range its three siblings already use. (objectui `456aac831`)
-**app-shell** — refactor(app-shell): collapse the metadata-admin designer table's byte-identical key pairs (objectui `f762f5bdf`)
-**core,react,dashboard,report** — Analytics: the dimension label net's fetch-and-memo glue is written once, not once per surface (objectui `ee26e65e7`)
-**i18n** — Six i18n keys no longer render as raw key strings on hosts with no `I18nProvider` (objectui#4396) (objectui `dad805d8f`)
-**app-shell,data-objectstack** — Publishing a view from the console no longer serves a five-minute-stale override map — every writer now routes through one invalidation seam (objectui `d2f6e6b1b`)
-**components**`ActionParamDialog`'s `select` branch no longer renders a hardcoded English `Select...` placeholder. The fallback used when an action param declares no `placeholder` of its own no… (objectui `5bf09fdba`)
-**i18n** — i18n: the two search placeholders become pack values, and four values the packs served in English get translated (objectui `bb58d1d61`)
-**dashboard,report** — Analytics: a LOCAL select dimension on a table / pivot widget — and on a dataset-bound report — now renders its option label through the locale bundle (objectui `326a70f32`)
-**i18n** — A gantt task titled `A$&B` no longer prints `{{title}}` back into its own delete dialog — the two hand-rolled provider-less fallback interpolators are literal, like i18next (objectui `0ca6096ff`)
-**app-shell** — fix(app-shell): the metadata-admin designer's own i18n table uses the typographic ellipsis (objectui `b31827358`)
-**i18n** — i18n copy: one ellipsis glyph across the ten packs, `usted` in the es draft-preview empty state, and a pt sentence that stops contracting `de` onto its own hole (objectui `3e19fe78a`)
-**i18n** — i18n: `createSafeTranslation`'s provider-less fallback now honours a call site's inline `defaultValue` (objectui `d46f9b8c4`)
-**data-objectstack** — Every view write path now invalidates the override map — a created, renamed or deleted view is no longer shadowed by a five-minute-stale batch read (objectui `85a3082e6`)
-**i18n**`detail.showEmptyRelated` renders Russian and Arabic again — the "+N empty" button no longer falls through to English at the counts it takes most often (objectui `2fea4d2fa`)
-**console** — Retire the dormant bespoke object-detail page factory and its seven widgets (objectui `275d7df13`)
-**fields** — fix(fields): `formatCurrency` keeps both cents digits on a fractional amount (objectui `d2e2caf40`)
-**i18n**`pickLocalized` reads own properties only, and takes only string values, on every limb (objectui `405e80875`)
-**dashboard,i18n** — fix(dashboard,i18n): KPI cards and dashboard filters resolve authored labels instead of dropping them (#4032) (objectui `7e4f0e530`)
-**app-shell** — Home's action centre badges everything that is waiting, not the five rows it has room for (objectui `de627792e`)
-**console** — The Applications page's search box no longer takes the page out on the first keystroke when an app carries a non-string label (objectui `3b4d78ea0`)
-**console,i18n** — The console's Applications page is localized — its own chrome only, never the server's words (objectui#4307). (objectui `734d186a0`)
-**app-shell** — Studio's read-only packages stop advertising writability they do not have — the `access` header badge and the `Data → Form` layout caption now report the gate that actually govern… (objectui `f046f885a`)
-**i18n,list** — List sort: the relational hint stops recommending a formula field, the one type the server refuses to sort by (objectui `7f1cb3323`)
-**fields,i18n,dashboard** — Numbers render in the user's locale, and a `Field.number` year is no longer `2,026` (objectui `45e1949b4`)
-**plugin-detail**`record:related_list` and the detail synthesizer now declare two shapes they already accepted at runtime. (objectui `63fe8fdda`)
-**app-shell** — Home's action centre stops counting messages the user has already read, and the inbox is read once per page instead of twice (#4316, #4225) (objectui `bed18a5c2`)
-**plugin-map**`object-map` reads its configuration from the declared `map` input only — `filter` is the query filter, and a map authored with both stopped rendering markers (objectui `b388d0eb0`)
-**core,plugin-dashboard,plugin-charts** — Analytics surfaces now run resolved select-option labels through the locale bundle — the chart legend and the related list on one page stop disagreeing (objectui `5900ac56f`)
-**app-shell** — Home's action centre no longer says "You're all caught up" to a user whose inbox it failed to read (#4235) (objectui `771466aa5`)
-**i18n** — Action confirm dialogs and success toasts now honour the bundle's translated `confirmText` / `successMessage`, not just `label` (objectui#4265). (objectui `ceccdcfa3`)
-**components** — A collapsed sidebar now survives a reload — `SidebarProvider` reads the `sidebar_state` cookie it has always written (objectui `f5e114348`)
-**core,console** — Form actions no longer carry a record id across an object boundary (#4292). (objectui `9461dd395`)
-**console** — API Console renders the Storage group again — its catalog key now names the canonical `file-storage` slot instead of the route (objectui `a00d23c0d`)
-**list** — List sort: the picker stops borrowing the filter whitelist, and a header click is no longer a one-way door out of the view's declared sort (objectui `33c32bf33`)
-**plugin-dashboard** — Dashboard `combo` widgets draw as combos on the dataset path — the dataset owns the data, the author owns the presentation (objectui `3c6e84cca`)
-**console** — A `type: 'form'` action fired from a record now EDITS that record instead of creating a duplicate (objectui `6d8231cc4`)
-**plugin-detail** — fix(plugin-detail): synthesize page components in the spec's `properties` carrier so Studio page-create can persist (objectui `35997cea5`)
-**core,app-shell**`DeclaredActionsBar` reads `visible` / `disabled` off the typed action def instead of through `(action as any)`. (objectui `ee66e2ebf`)
-**dashboard,report** — Pivot buckets encode an empty dimension value as JSON `null`, so it no longer collides with a row whose value is literally the placeholder character (objectui `49ae9f42d`)
-**dashboard** — fix(dashboard): resolve a dotted dimension's labels on table and pivot dataset widgets (objectui `436681e72`)
-**app-shell**`DeclaredActionsBar` binds its row through the shared `usePredicateRecordContext` (objectui `4cb0562b5`)
-**list**`list-view` now reads its `dataSource` binding through the shared `ElementDataSourceGate` instead of a private copy of the precedence table (objectui `37cd8e4ff`)
-**metadata-admin** — metadata-admin: diagnose a path on the right-hand side of `==` / `!=` in a visibility predicate (objectui `b95412031`)
-**analytics** — A dataset dimension on a dotted relationship path now renders its option labels instead of the raw stored enum (objectui `613b16707`)
-**@object-ui/core** — Retire `params.newTab` on a url action — `openIn: 'new-tab'` is the sanctioned spelling (objectui `d6aa1726a`)
-**data** — The second metadata client class surfaces the runtime authoring gate's advisories instead of discarding them (objectui `605b74720`)
-**console** — fix(console): a Setup-only environment lands on `/home`, not Setup's all-zero System Overview (objectui `234238ed7`)
-**detail,form,app-shell**`richtext` fields are placed like the long-form fields they are — four layout sets stopped spelling the type three ways the spec rejects (objectui `c32a8a1bf`)
-**fields** — A dependency-gated option list no longer deletes the field's stored value on mount (objectui `bc64bfe0f`)
-**detail** — Inline edit no longer offers a record picker for a spec-spelled `autonumber` field that carries a `reference_to` (objectui `6d01319dd`)
-**@object-ui/app-shell** — metadata-admin: retire the standalone `validation` resource, and move `ValidationPreview` onto the embedded path the framework actually evaluates (objectui#4132) (objectui `3032107dd`)
-**@object-ui/plugin-detail**`record:details` stops publishing a `layout` key the spec removed and the renderer never honoured (objectui `7d04b0e84`)
-**preview** — The Unpublished-app banner now reads the ADR-0045 publish gate `_unpublished`, not the navigation flag `hidden` — so a published app that is merely kept out of the launcher no lon… (objectui `690ae0f04`)
-**detail** — fix(detail): inline edit no longer destroys array values or flattens types on the record page (objectui `e7663f2ff`)
-**types,core** — A dashboard date filter's default has one spelling again — the bare preset name — and the `{ preset }` object becomes a documented legacy alias with a retirement window (objectui `abb0f81d3`)
-**app-shell** — The bell popover's and Home's "see all" drills open inside an app the user can actually open, not the setup app (objectui `f812de6bd`)
-**detail** — A `password` or `secret` field on the record detail page is no longer inline-editable: it renders no pencil / double-click affordance and produces no editor, on both the details b… (objectui `5e2e9fa8c`)
-**metadata-admin**`DatasourcePreview` no longer renders three key groups `DatasourceSchema` rejects (objectui#4131). `retryPolicy`, `healthCheck` and `capabilities` were removed from the datasource… (objectui `ab37c5f59`)
-**app-shell** — Set-default on a saved view fires its write again — a stored `id` can no longer rename the tab out from under the overlay read (objectui `79a40adae`)
-**app-shell** — The bell's Approvals and Activity tabs fill in on Home, Organizations and the AI screen — from the same fetch the cards below them already use (objectui `8b971f826`)
-**studio** — Studio surfaces the runtime authoring gate's advisory findings instead of discarding them client-side (objectui `c0f9a4bd5`)
-**i18n** — An inline per-locale label now renders its locale's string at the thirteen read sites the `@objectstack/spec` 17.0.0-rc.6 bump exposed (objectui `bb68488ff`)
_Derived from the changesets objectui declared over this range — 99 releasing of 115 added across 123 non-merge commit(s). Excluded as shipping no package code: 16 release-nothing changesets, 11 commits carrying no changeset (run with `--all` to list them)._

Generated by Claude Code

chore(lint): bring e2e/ under the lint gate; fix the 3 errors it exposes (#4456) (#4470)
objectui@6d77acfe3125949796918ea12b926d3460bc933d
@vercel

vercelBot commented Aug 12, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredAug 12, 2026 5:31pm

Request Review

@github-actionsgithub-actionsBot added size/m documentation Improvements or additions to documentation tooling labels Aug 12, 2026
@hotlongClaude

Copy link
Copy Markdown
ContributorAuthor

Correction to the PR body, on the release-page block only.

The body says "one character is altered below". There are two alterations, both made so the block survives GitHub's body sanitizer:

  1. The lint entry's < button carries an inserted space (disclosed).
  2. The block's first line is an HTML comment in the real output — the angle brackets around !-- objectui 6314e87f2d49..6d77acfe3125 … -- were stripped and are not disclosed in the body. That line is a machine-readable marker, so pasting it as shown would land a broken marker on the release page.

Neither alteration affects any entry's text beyond those two spots, but treat the block as a preview rather than a paste source. The authoritative output is:

node scripts/objectui-range.mjs --from 6314e87f2d49b1ff3b158c296f1b2a52d14dff68 --to 6d77acfe3125949796918ea12b926d3460bc933d


Generated by Claude Code

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mtooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

chore: bump the console pin — 405 objectui commits behind, and the gap now holds a shipped bug fix plus the spec key #7804 added

2 participants

@hotlong@claude