Skip to content

chore: bump the console pin to objectui d8ec8d6d4f01 - #14165

Merged
baozhoutao merged 4 commits into
mainfrom
claude/issue-14027-console-pin-bump
Sep 1, 2026
Merged

chore: bump the console pin to objectui d8ec8d6d4f01#14165
baozhoutao merged 4 commits into
mainfrom
claude/issue-14027-console-pin-bump

Conversation

@claude

@claude claude Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Fixes #14027

Bumps the console pin from 9602dc820450 (objectui, 2026-08-25 22:43Z) to d8ec8d6d4f01 (objectui main, 2026-09-01 08:23Z), the step the maintainer's 2026-08-25 "Ruled: A" sequence on #12039 parked its Key 2 on.

Performed with the repo's dedicated tooling, never a hand edit: scripts/bump-objectui.sh SHA then scripts/build-console.sh (the two halves of pnpm objectui:refresh), plus the two follow-on steps those scripts name.

Acceptance criterion (from the card)

$ git -C ../objectui show $(cat .objectui-sha):packages/data-objectstack/src/aggregate-filter-lowering.test.ts
PROBE_EXIT=0   # 261 lines

The file exists at the new pin, and translateFilterArray(params.filter) has 1 hit in packages/data-objectstack/src/index.ts there (0 at the old pin). Ancestry, which the card could only approximate by content probe because the container's objectui checkout was shallow, is now measured directly: the old pin is an ancestor of the new one, the range is 339 commits, and objectui PR #6828 is in it as 512737848.

This bump pulls in ~4 days of unrelated objectui work

339 non-merge commits, 218 releasing changesets, 15 declared-breaking, 25 commits with no changeset. Per the pin-bump discipline that is the bump's normal cost and is stated here rather than trimmed: CI red traceable to one of those upstream changes is a property of the range, not of this PR's mechanics. The full itemised list is in the changeset.

Files changed (3)

File Why
.objectui-sha the pin itself, written by bump-objectui.sh
.changeset/console-d8ec8d6d4f01.md emitted by the bump; @objectstack/console: minor
packages/sdui-parser/objectui-lockstep.json re-recorded by pnpm gen:sdui-lockstep

packages/console/dist/ is gitignored (packages/console/.gitignore), so the rebuilt SPA is build-time only and correctly appears in no commit here.

Why the lockstep record is in this diff, and is not a rider

check:sdui-lockstep refuses when the live pin moves past the pin its parity record was taken at — by its own design, a pin bump is the moment a parser divergence stops being latent and starts shipping. It went red on [pin-moved] immediately after the bump, naming its own remedy, which is what ran:

✓ no new DECLARATION divergence ... check:sdui-lockstep: OK — this copy is byte-identical to
  objectui@d8ec8d6d4f01 over 214 grammar line(s) [blob 0131f27cf86d] and agrees on all 24 diagnostic code(s)

The grammar region blob and all 24 diagnostic codes are unchanged, so no parser port is owed. The record's content diff is 4 metadata lines (rev, revDate, recordedAgainstPin, and repo, which the current generator writes from its own OBJECTUI_REMOTE constant as a clone URL where the older record held the short owner/name form).

The ADR-0087 disposition

The generated changeset declares 15 breaking entries and therefore carried an unanswered adr-0087: TODO placeholder, which check-adr-0087-registration rejects on purpose ("the pin bump cannot answer this; a human must"). Answered as not-required (no-migration-prescription), judging all fifteen one at a time against their own upstream changeset, in the shape the previous pin bump's disposition established. The load-bearing measurements, each re-taken at this HEAD:

  • every one of the 15 ships in an @object-ui/* package; none names an @objectstack/* package (read from the digest's per-entry packages field, not from prose);
  • the entries that touch authored-metadata vocabulary are objectui catching up to refusals this repo already enforcesDashboardWidgetSchema here is a strictObject and has been since the ADR-0021 cutover; LocationValueSchema already declares { lat, lng }; FieldSchema is a strictObject carrying no sortOrder member;
  • timeScale, ComponentConfig, buildExpressionUser, isConcurrentUpdateError and the spec-bridge symbols have 0 tracked references here (mentions are prose in docs, audits and CHANGELOGs);
  • @objectstack/console publishes a frozen prebuilt SPA — files is ["dist", "README.md", "CHANGELOG.md"], its sole exports entry is ./package.json — and no package.json in this workspace declares any @object-ui/* dependency, so none of the 15 is reachable through anything this repo publishes.

f07b976ef (objectui#6825, aggregate() refusing an unlowered where) is Key 1 of #12039; the spec-side convergence is the ruled follow-up (Key 2) and carries its own changeset and disposition. Nothing is prescribed from here.

Gates run (locally, on 6c9f68fa)

The family was derived from the actual diff with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack, re-derived after the lockstep record entered the surface — which grew it from 12 families to 29, since that file sits inside a package.

29 families run, 27 exit 0. Including the four pin/console gates the card's dispatch named:

✓ Console dist matches the objectui pin (objectui@d8ec8d6d4f01).            check:console-sha
✓ @objectstack/spec: the dist carries this tree's copy, and not the published one.   check:console-injection
✓ bump-objectui self-test PASSED — 13 assertions across 4 cases.            check:objectui-bump
✓ objectui-range --self-test: all checks passed                            check:objectui-changeset
✓ check-adr-0087-registration: 1 declared-breaking changeset(s), each carrying an ADR-0087 disposition.

Both console gates skip when there is no dist/ and were re-run after build-console.sh so the greens above are measurements, not skips. The build itself reported ✓ Bundle canary 'import/jobs' present and ✓ Console bundle carries THIS tree's @objectstack/spec, and only it (50196 KB from objectui@d8ec8d6d4f01).

The documented second half of the pin procedure also ran — pnpm sdui:manifest, the ADR-0082 D4 declaration-parity ratchet whose only trigger is a pin bump: ✓ no new DECLARATION divergence vs accepted baseline, so packages/spec/react-declaration-parity.baseline.json needed no update and is not in this diff.

2 of the 29 are NOT MEASURED, by their own words — neither is a red:

  • check-test-completeness.mjs (exit 3) — needs a turbo run test log CI tees to it; run with no argument it exits before parsing a line and says so.
  • check:dual-build-cjs-loads (exit 3) — PREREQUISITE NOT MET, needs a full workspace pnpm build; 34 packages have no dist/.

Repo-wide pnpm lint was not run locally; it is CI's, and CI runs the farm exactly once regardless.


Patch round — the pin citations in packages/spec

CI came back red on Type Check · source gates, and the red was this PR's own: check:objectui-pin-citations found 8 spec sources asserting the OLD pin 9602dc820 beside objectui file:line anchors. The coupling is atomic — landing the citations alone or the pin alone reds main either way — so the gate's own remedy text defines the bump's true required surface. Exactly the files it named were touched, nothing else.

The gate is explicit that the obvious fix is the wrong one:

⛔ Do NOT fix this by replacing the sha. The sha is not the record — the objectui file:line ANCHORS beside it are, and they are only true of the tree they were counted in.

So every anchor was re-read at the new pin (git -C ../objectui show d8ec8d6d4:PATH) and re-derived from that file, never carried over on byte-identity — which preserves a wrong anchor as faithfully as a right one (#10274).

What each anchor measured

Three of the ten cited objectui files changed across the move; every anchor was re-read regardless.

Cited file Anchor At 9602dc820 At d8ec8d6d4 Verdict
containers.tsx (CHANGED) tabs item.icon block 662-668 729-735 moved
containers.tsx tabs registration items input 721 788 moved
containers.tsx accordion item.icon block 851-857 918-924 moved
containers.tsx accordion registration items input 898 965 moved
ObjectGrid.tsx (CHANGED) effectiveBulkActions / selection block 2586-2601 3187-3202 moved
plugin-dashboard/index.tsx (CHANGED) object-metric icon designer input 204 204 same
useBulkExecutor.ts bulk-update / bulk-delete branches 284-289 284-289 same
button.tsx resolveIcon call; icon renders 36; 57, 59 same same
button.tsx registration inputs 70-87 same same
resolve-icon.ts resolveIcon; toPascalCase + rename map 30-35; 14-24 same same
lazy-icon.tsx getLazyIcon; + LazyIcon 66-80; 66-92 same same
ObjectMetricWidget.tsx icon destructure; forward 142; 474 same same
MetricWidget.tsx getLazyIcon resolve; tinted square 312-321; 373-382 same same
MetricCard.tsx the sibling the record warns NOT to re-anchor to 83 same same

No read point moved to a different construct, and none died. Every moved span is byte-identical to the one cited before (verified by extracting both and diffing), shifted only by insertions above it — so no record needed more than a citation refresh, and nothing here forks back to the PM.

Two results worth stating because they are the ones that would have been got wrong by inference:

No citation was converted to the historical `.objectui-sha` pin `SHA` spelling: all 8 sites are claims about what is live at today's pin, not dated records of a past measurement, so all 8 stay in the checked spelling.

Scope of the spec edit

Comment lines only. Mechanically checked, not asserted: git diff -U0 -- packages/spec filtered to lines that are not //, * or /* matches nothing. Zero accept/reject behaviour change, no schema, no export, no .describe(). needs:contract-review is applied for the path limb; the content limb is "no".

pnpm --filter @objectstack/spec build && check:generatedall 15 generated artifacts already up to date, so the TSDoc touched here lands in none of them.

Gates re-run after the patch (on 0137a8dc)

The family was re-derived from the grown diff — spec sources are in the surface now, so it went 29 → 51 families. All 51 run; 46 exit 0, including the gate that reds this round and the four pin/console gates:

✅ 8 asserting objectui pin citation(s) match .objectui-sha (d8ec8d6d4), 13 historical
   citation(s) recorded and not checked, across 1096 spec source(s)   check:objectui-pin-citations
✓ Console dist matches the objectui pin (objectui@d8ec8d6d4f01).      check:console-sha
✓ the dist carries this tree's copy, and not the published one.       check:console-injection
✓ check:sdui-lockstep: OK — byte-identical over 214 grammar line(s), 24 diagnostic code(s)
✓ no new DECLARATION divergence vs accepted baseline                  check:react-declaration-parity

check:react-declaration-parity is the ADR-0082 D4 ratchet, and it has no CI backstop — it is on-demand by decision (#5960), never a CI job — so rather than declare a narrowing, its input was regenerated: console rebuilt at the new pin, pnpm sdui:manifest re-dumped the registry in a real browser, then the gate run explicitly with MANIFEST and --strict. Green.

5 of the 51 are unmet preconditions, not reds — each says so in its own words, and every one wants a full workspace pnpm build or a CI-produced log that no local run can supply: check-dev-prereqs ("the workspace is not built — 1 unmet precondition, not a list of problems"), check:doc-formula-expressions, check:dual-build-cjs-loads, check:type-check-debt (all PREREQUISITE NOT MET), and check-test-completeness (needs the turbo run test log CI tees to it). None is measuring anything about this diff.


Patch round 2 — the tracked SDUI manifest's provenance

Lint & Repo Gates red, again this PR's own: check-sdui-manifest reds on a moved pin until the repo-root manifest is regenerated and its provenance re-recorded. Regenerated with the generator the gate names, never hand-edited:

node scripts/gen-sdui-manifest-node.mjs --objectui-version 17.6.0

17.6.0 is @object-ui/core's version at the new pin, read from the objectui checkout's packages/core/package.json at d8ec8d6d4f01.

Two manifests, two generators — round 1's run could not have fixed this

Worth stating plainly, because the names collide:

writes tracked? generator feeds
pnpm sdui:manifest (round 1) packages/console/dist/sdui.manifest.json no, gitignored gen-sdui-manifest.sh, browser dump of a built console the ADR-0082 D4 declaration-parity ratchet
this round sdui.manifest.json (repo root) + scripts/sdui-manifest.record.json yes gen-sdui-manifest-node.mjs, plain Node against the PUBLISHED @object-ui/* packages resolveSduiManifest() in the CLI, switching validateJsxPages from parse-only to full validateTree

So round 1's browser run refreshed a different artefact; the gate's one was untouched and correctly stayed red.

The artefact did not move — only provenance did

✓ wrote sdui.manifest.json (57 components, 66910 bytes, sha256 49211fee7792…)
✓ re-recorded scripts/sdui-manifest.record.json at pin d8ec8d6d4f01 / @object-ui 17.6.0

Same sha256, same component count, same byte count as before: sdui.manifest.json is not in this diff at all. It could not have moved — the manifest describes the published @object-ui registry, and both pins ship 17.6.0, so the four days of objectui commits riding this bump changed no published registry version. The only diff is two lines of provenance in the record: objectuiSha and generatedAt.

That is also the useful negative result for the freshness gate: it is doing anti-rot bookkeeping here, not catching a stale component whitelist.

Verified

✓ check-sdui-manifest self-test: 6 cases behave (green passes; absence, tamper, moved pin, emptiness are RED).
✓ check-sdui-manifest: sdui.manifest.json is present, intact (sha256 49211fee7792…, 57 components)
  and fresh at objectui pin d8ec8d6d4f01….

check:react-declaration-parity was re-taken against the regenerated artefact and does not move: ✓ no new DECLARATION divergence vs accepted baseline, with a summary identical to round 1's browser-dump run (90 spec-only divergences, 0 blocks missing from the registry). Run against both manifests, they agree.

The family grew again, 51 → 58, since scripts/** is now in the surface. All 7 new families exit 0 (check:agent-test-spelling, check:bash32-floor, check:cli-command-ids, check:entry-guard, check:parse-guard, check:pnpm-filter-targets, check:watch-hint-literal), as do the sweep gates no per-file mapping predicts (check-ratchet-remedy-authority, check-nul-bytes) and the ratchet/pin families re-run on this head (check:authorable-surface, check:liveness, check:strictness-ledger, check:objectui-pin-citations, check:sdui-lockstep, check:objectui-changeset, and the three changeset gates).

One honest gap: check:console-sha skipped this round rather than passing — this worktree has no packages/console/dist, and the gate skips without one. Its green in the previous round was a real measurement against a real dist at this same pin, and nothing in this round's diff (two lines of JSON provenance) can affect it.


Generated by Claude Code

fix(plugin-detail,i18n): ActivityTimeline's remaining 18 literals resolve from the packs (#7162)

objectui@d8ec8d6d4f011b11c8eb1e6dbd364ef206711391
…rity at the new pin

The pin bump's generated changeset carries an unanswered `adr-0087: TODO`
placeholder; `check:adr-0087-registration` rejects the placeholder on purpose.
Answered as `not-required (no-migration-prescription)`, judging all fifteen
declared-breaking entries in the objectui range one at a time.

`check:sdui-lockstep` refuses when the live pin moves past the pin its parity
record was taken at, so re-recorded with `pnpm gen:sdui-lockstep` against the
objectui checkout the bump already required. The grammar region and the 24
diagnostic codes are byte-unchanged, so no parser port is owed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WLJQhde67SeTccsmnBVarV
@github-actions github-actions Bot added the size/m label Sep 1, 2026
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/sdui-parser, @objectstack/spec, touching 4 documentable anchor(s). ⚠️ 1 changed file(s) yielded no anchor (packages/sdui-parser/objectui-lockstep.json), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files.

1 release-owned page(s) name something this change touched. These are read-only:

  • content/docs/releases/v15.mdx (via PageTabsProps (symbol, a top-level const object))

content/docs/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/sdui-parser/objectui-lockstep.json) — pages documenting those are invisible to this run
  • the SDK route bridge reached 47 of 219 client-bound route-ledger rows — the other 172 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 172: 14 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 56 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 102 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 129 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 45b9051248f86f362b042fa9de63295a8c224073packageMentionDocs.

Which tree this was computed on

This run read content/docs from ce77e665fe495bcb492e2b9755515f0f9dcaa177 — the merge of head 5876a3dcace5745b1af6f587607c916f944e45b3 into base 45b9051248f86f362b042fa9de63295a8c224073, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin ce77e665fe495bcb492e2b9755515f0f9dcaa177 && git checkout ce77e665fe495bcb492e2b9755515f0f9dcaa177
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 45b9051248f86f362b042fa9de63295a8c224073 5876a3dcace5745b1af6f587607c916f944e45b3 && git checkout -B drift-repro 45b9051248f86f362b042fa9de63295a8c224073 && git merge --no-ff 5876a3dcace5745b1af6f587607c916f944e45b3

node scripts/docs-audit/affected-docs.mjs --json 45b9051248f86f362b042fa9de63295a8c224073

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs 45b9051248f86f362b042fa9de63295a8c224073 → pass the list as
args.docs, on the commit named under Which tree this was computed on.

check:objectui-pin-citations reds on this PR's own diff: moving .objectui-sha
left 8 spec sources asserting the old pin 9602dc820 with objectui file:line
anchors. The gate's remedy is explicit that replacing the sha alone is the
wrong fix, so every anchor was re-READ at the new pin and the anchors and the
sha are updated together.

Three of the ten cited objectui files changed across the move. What moved:

  containers.tsx  tabs icon block      662-668 -> 729-735
  containers.tsx  tabs registration        721 -> 788
  containers.tsx  accordion icon block 851-857 -> 918-924
  containers.tsx  accordion registration   898 -> 965
  ObjectGrid.tsx  bulk/selection block 2586-2601 -> 3187-3202

Each moved span is byte-identical to the one cited before, shifted only by
insertions above it. Everything else is unmoved, including plugin-dashboard's
index.tsx:204 in a file that DID change elsewhere. No read point died and none
changed meaning, so no record needed more than a citation refresh.

Comment lines only — git diff -U0 over packages/spec matches no non-comment
line. No accept/reject behaviour changes. pnpm --filter @objectstack/spec build
&& check:generated: all 15 generated artifacts already up to date.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WLJQhde67SeTccsmnBVarV
…4f01

check-sdui-manifest reds on a moved pin until the repo-root sdui.manifest.json
is regenerated and its provenance record re-written. Regenerated with the
generator the gate names, never hand-edited:

  node scripts/gen-sdui-manifest-node.mjs --objectui-version 17.6.0

17.6.0 is @object-ui/core's version at the new pin, read from the objectui
checkout's packages/core/package.json at d8ec8d6d4f01.

The ARTEFACT did not move: same sha256 49211fee7792, same 57 components, same
66910 bytes. It could not have, because the manifest describes the PUBLISHED
@object-ui registry and both pins ship 17.6.0 — the four days of objectui
commits in this bump changed no published registry version. So only provenance
moves: objectuiSha and generatedAt.

This is a different artefact from the one pnpm sdui:manifest writes. That one
is the browser dump at packages/console/dist/sdui.manifest.json (gitignored,
feeds the ADR-0082 D4 parity ratchet); this one is the tracked repo-root
manifest resolveSduiManifest() picks up to switch validateJsxPages from
parse-only to full validateTree. Two generators, two artefacts; round 1's
browser run did not and could not refresh this one.

node scripts/check-sdui-manifest.mjs --self-test && node scripts/check-sdui-manifest.mjs
both exit 0, the second reporting freshness at pin d8ec8d6d4f01.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WLJQhde67SeTccsmnBVarV
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

chore: bump the console pin — .objectui-sha (9602dc82, 2026-08-25) predates objectui#6828, the ruled prerequisite of #12039 Key 2

2 participants