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

@claudeclaudeBot 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)

FileWhy
.objectui-shathe pin itself, written by bump-objectui.sh
.changeset/console-d8ec8d6d4f01.mdemitted by the bump; @objectstack/console: minor
packages/sdui-parser/objectui-lockstep.jsonre-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-locksteprefuses 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 nopackage.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 fileAnchorAt 9602dc820At d8ec8d6d4Verdict
containers.tsx (CHANGED)tabs item.icon block662-668729-735moved
containers.tsxtabs registration items input721788moved
containers.tsxaccordion item.icon block851-857918-924moved
containers.tsxaccordion registration items input898965moved
ObjectGrid.tsx (CHANGED)effectiveBulkActions / selection block2586-26013187-3202moved
plugin-dashboard/index.tsx (CHANGED)object-metric icon designer input204204same
useBulkExecutor.tsbulk-update / bulk-delete branches284-289284-289same
button.tsxresolveIcon call; icon renders36; 57, 59samesame
button.tsxregistration inputs70-87samesame
resolve-icon.tsresolveIcon; toPascalCase + rename map30-35; 14-24samesame
lazy-icon.tsxgetLazyIcon; + LazyIcon66-80; 66-92samesame
ObjectMetricWidget.tsxicon destructure; forward142; 474samesame
MetricWidget.tsxgetLazyIcon resolve; tinted square312-321; 373-382samesame
MetricCard.tsxthe sibling the record warns NOT to re-anchor to83samesame

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:

writestracked?generatorfeeds
pnpm sdui:manifest (round 1)packages/console/dist/sdui.manifest.jsonno, gitignoredgen-sdui-manifest.sh, browser dump of a built consolethe ADR-0082 D4 declaration-parity ratchet
this roundsdui.manifest.json (repo root) + scripts/sdui-manifest.record.jsonyesgen-sdui-manifest-node.mjs, plain Node against the PUBLISHED @object-ui/* packagesresolveSduiManifest() 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-shaskipped 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-actionsBot 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:dataprotocol:uisize/mteststooling

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

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
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

@claudeclaudeBot 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)

FileWhy
.objectui-shathe pin itself, written by bump-objectui.sh
.changeset/console-d8ec8d6d4f01.mdemitted by the bump; @objectstack/console: minor
packages/sdui-parser/objectui-lockstep.jsonre-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-locksteprefuses 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 nopackage.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 fileAnchorAt 9602dc820At d8ec8d6d4Verdict
containers.tsx (CHANGED)tabs item.icon block662-668729-735moved
containers.tsxtabs registration items input721788moved
containers.tsxaccordion item.icon block851-857918-924moved
containers.tsxaccordion registration items input898965moved
ObjectGrid.tsx (CHANGED)effectiveBulkActions / selection block2586-26013187-3202moved
plugin-dashboard/index.tsx (CHANGED)object-metric icon designer input204204same
useBulkExecutor.tsbulk-update / bulk-delete branches284-289284-289same
button.tsxresolveIcon call; icon renders36; 57, 59samesame
button.tsxregistration inputs70-87samesame
resolve-icon.tsresolveIcon; toPascalCase + rename map30-35; 14-24samesame
lazy-icon.tsxgetLazyIcon; + LazyIcon66-80; 66-92samesame
ObjectMetricWidget.tsxicon destructure; forward142; 474samesame
MetricWidget.tsxgetLazyIcon resolve; tinted square312-321; 373-382samesame
MetricCard.tsxthe sibling the record warns NOT to re-anchor to83samesame

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:

writestracked?generatorfeeds
pnpm sdui:manifest (round 1)packages/console/dist/sdui.manifest.jsonno, gitignoredgen-sdui-manifest.sh, browser dump of a built consolethe ADR-0082 D4 declaration-parity ratchet
this roundsdui.manifest.json (repo root) + scripts/sdui-manifest.record.jsonyesgen-sdui-manifest-node.mjs, plain Node against the PUBLISHED @object-ui/* packagesresolveSduiManifest() 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-shaskipped 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-actionsBot 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:dataprotocol:uisize/mteststooling

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

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

@claudeclaudeBot 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)

FileWhy
.objectui-shathe pin itself, written by bump-objectui.sh
.changeset/console-d8ec8d6d4f01.mdemitted by the bump; @objectstack/console: minor
packages/sdui-parser/objectui-lockstep.jsonre-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-locksteprefuses 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 nopackage.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 fileAnchorAt 9602dc820At d8ec8d6d4Verdict
containers.tsx (CHANGED)tabs item.icon block662-668729-735moved
containers.tsxtabs registration items input721788moved
containers.tsxaccordion item.icon block851-857918-924moved
containers.tsxaccordion registration items input898965moved
ObjectGrid.tsx (CHANGED)effectiveBulkActions / selection block2586-26013187-3202moved
plugin-dashboard/index.tsx (CHANGED)object-metric icon designer input204204same
useBulkExecutor.tsbulk-update / bulk-delete branches284-289284-289same
button.tsxresolveIcon call; icon renders36; 57, 59samesame
button.tsxregistration inputs70-87samesame
resolve-icon.tsresolveIcon; toPascalCase + rename map30-35; 14-24samesame
lazy-icon.tsxgetLazyIcon; + LazyIcon66-80; 66-92samesame
ObjectMetricWidget.tsxicon destructure; forward142; 474samesame
MetricWidget.tsxgetLazyIcon resolve; tinted square312-321; 373-382samesame
MetricCard.tsxthe sibling the record warns NOT to re-anchor to83samesame

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:

writestracked?generatorfeeds
pnpm sdui:manifest (round 1)packages/console/dist/sdui.manifest.jsonno, gitignoredgen-sdui-manifest.sh, browser dump of a built consolethe ADR-0082 D4 declaration-parity ratchet
this roundsdui.manifest.json (repo root) + scripts/sdui-manifest.record.jsonyesgen-sdui-manifest-node.mjs, plain Node against the PUBLISHED @object-ui/* packagesresolveSduiManifest() 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-shaskipped 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-actionsBot 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:dataprotocol:uisize/mteststooling

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

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

@claudeclaudeBot 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)

FileWhy
.objectui-shathe pin itself, written by bump-objectui.sh
.changeset/console-d8ec8d6d4f01.mdemitted by the bump; @objectstack/console: minor
packages/sdui-parser/objectui-lockstep.jsonre-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-locksteprefuses 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 nopackage.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 fileAnchorAt 9602dc820At d8ec8d6d4Verdict
containers.tsx (CHANGED)tabs item.icon block662-668729-735moved
containers.tsxtabs registration items input721788moved
containers.tsxaccordion item.icon block851-857918-924moved
containers.tsxaccordion registration items input898965moved
ObjectGrid.tsx (CHANGED)effectiveBulkActions / selection block2586-26013187-3202moved
plugin-dashboard/index.tsx (CHANGED)object-metric icon designer input204204same
useBulkExecutor.tsbulk-update / bulk-delete branches284-289284-289same
button.tsxresolveIcon call; icon renders36; 57, 59samesame
button.tsxregistration inputs70-87samesame
resolve-icon.tsresolveIcon; toPascalCase + rename map30-35; 14-24samesame
lazy-icon.tsxgetLazyIcon; + LazyIcon66-80; 66-92samesame
ObjectMetricWidget.tsxicon destructure; forward142; 474samesame
MetricWidget.tsxgetLazyIcon resolve; tinted square312-321; 373-382samesame
MetricCard.tsxthe sibling the record warns NOT to re-anchor to83samesame

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:

writestracked?generatorfeeds
pnpm sdui:manifest (round 1)packages/console/dist/sdui.manifest.jsonno, gitignoredgen-sdui-manifest.sh, browser dump of a built consolethe ADR-0082 D4 declaration-parity ratchet
this roundsdui.manifest.json (repo root) + scripts/sdui-manifest.record.jsonyesgen-sdui-manifest-node.mjs, plain Node against the PUBLISHED @object-ui/* packagesresolveSduiManifest() 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-shaskipped 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-actionsBot 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:dataprotocol:uisize/mteststooling

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

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
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

@claudeclaudeBot 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)

FileWhy
.objectui-shathe pin itself, written by bump-objectui.sh
.changeset/console-d8ec8d6d4f01.mdemitted by the bump; @objectstack/console: minor
packages/sdui-parser/objectui-lockstep.jsonre-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-locksteprefuses 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 nopackage.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 fileAnchorAt 9602dc820At d8ec8d6d4Verdict
containers.tsx (CHANGED)tabs item.icon block662-668729-735moved
containers.tsxtabs registration items input721788moved
containers.tsxaccordion item.icon block851-857918-924moved
containers.tsxaccordion registration items input898965moved
ObjectGrid.tsx (CHANGED)effectiveBulkActions / selection block2586-26013187-3202moved
plugin-dashboard/index.tsx (CHANGED)object-metric icon designer input204204same
useBulkExecutor.tsbulk-update / bulk-delete branches284-289284-289same
button.tsxresolveIcon call; icon renders36; 57, 59samesame
button.tsxregistration inputs70-87samesame
resolve-icon.tsresolveIcon; toPascalCase + rename map30-35; 14-24samesame
lazy-icon.tsxgetLazyIcon; + LazyIcon66-80; 66-92samesame
ObjectMetricWidget.tsxicon destructure; forward142; 474samesame
MetricWidget.tsxgetLazyIcon resolve; tinted square312-321; 373-382samesame
MetricCard.tsxthe sibling the record warns NOT to re-anchor to83samesame

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:

writestracked?generatorfeeds
pnpm sdui:manifest (round 1)packages/console/dist/sdui.manifest.jsonno, gitignoredgen-sdui-manifest.sh, browser dump of a built consolethe ADR-0082 D4 declaration-parity ratchet
this roundsdui.manifest.json (repo root) + scripts/sdui-manifest.record.jsonyesgen-sdui-manifest-node.mjs, plain Node against the PUBLISHED @object-ui/* packagesresolveSduiManifest() 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-shaskipped 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-actionsBot 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:dataprotocol:uisize/mteststooling

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

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

@claudeclaudeBot 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)

FileWhy
.objectui-shathe pin itself, written by bump-objectui.sh
.changeset/console-d8ec8d6d4f01.mdemitted by the bump; @objectstack/console: minor
packages/sdui-parser/objectui-lockstep.jsonre-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-locksteprefuses 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 nopackage.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 fileAnchorAt 9602dc820At d8ec8d6d4Verdict
containers.tsx (CHANGED)tabs item.icon block662-668729-735moved
containers.tsxtabs registration items input721788moved
containers.tsxaccordion item.icon block851-857918-924moved
containers.tsxaccordion registration items input898965moved
ObjectGrid.tsx (CHANGED)effectiveBulkActions / selection block2586-26013187-3202moved
plugin-dashboard/index.tsx (CHANGED)object-metric icon designer input204204same
useBulkExecutor.tsbulk-update / bulk-delete branches284-289284-289same
button.tsxresolveIcon call; icon renders36; 57, 59samesame
button.tsxregistration inputs70-87samesame
resolve-icon.tsresolveIcon; toPascalCase + rename map30-35; 14-24samesame
lazy-icon.tsxgetLazyIcon; + LazyIcon66-80; 66-92samesame
ObjectMetricWidget.tsxicon destructure; forward142; 474samesame
MetricWidget.tsxgetLazyIcon resolve; tinted square312-321; 373-382samesame
MetricCard.tsxthe sibling the record warns NOT to re-anchor to83samesame

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:

writestracked?generatorfeeds
pnpm sdui:manifest (round 1)packages/console/dist/sdui.manifest.jsonno, gitignoredgen-sdui-manifest.sh, browser dump of a built consolethe ADR-0082 D4 declaration-parity ratchet
this roundsdui.manifest.json (repo root) + scripts/sdui-manifest.record.jsonyesgen-sdui-manifest-node.mjs, plain Node against the PUBLISHED @object-ui/* packagesresolveSduiManifest() 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-shaskipped 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-actionsBot 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:dataprotocol:uisize/mteststooling

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

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

@claudeclaudeBot 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)

FileWhy
.objectui-shathe pin itself, written by bump-objectui.sh
.changeset/console-d8ec8d6d4f01.mdemitted by the bump; @objectstack/console: minor
packages/sdui-parser/objectui-lockstep.jsonre-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-locksteprefuses 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 nopackage.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 fileAnchorAt 9602dc820At d8ec8d6d4Verdict
containers.tsx (CHANGED)tabs item.icon block662-668729-735moved
containers.tsxtabs registration items input721788moved
containers.tsxaccordion item.icon block851-857918-924moved
containers.tsxaccordion registration items input898965moved
ObjectGrid.tsx (CHANGED)effectiveBulkActions / selection block2586-26013187-3202moved
plugin-dashboard/index.tsx (CHANGED)object-metric icon designer input204204same
useBulkExecutor.tsbulk-update / bulk-delete branches284-289284-289same
button.tsxresolveIcon call; icon renders36; 57, 59samesame
button.tsxregistration inputs70-87samesame
resolve-icon.tsresolveIcon; toPascalCase + rename map30-35; 14-24samesame
lazy-icon.tsxgetLazyIcon; + LazyIcon66-80; 66-92samesame
ObjectMetricWidget.tsxicon destructure; forward142; 474samesame
MetricWidget.tsxgetLazyIcon resolve; tinted square312-321; 373-382samesame
MetricCard.tsxthe sibling the record warns NOT to re-anchor to83samesame

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:

writestracked?generatorfeeds
pnpm sdui:manifest (round 1)packages/console/dist/sdui.manifest.jsonno, gitignoredgen-sdui-manifest.sh, browser dump of a built consolethe ADR-0082 D4 declaration-parity ratchet
this roundsdui.manifest.json (repo root) + scripts/sdui-manifest.record.jsonyesgen-sdui-manifest-node.mjs, plain Node against the PUBLISHED @object-ui/* packagesresolveSduiManifest() 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-shaskipped 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-actionsBot 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:dataprotocol:uisize/mteststooling

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

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
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

@claudeclaudeBot 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)

FileWhy
.objectui-shathe pin itself, written by bump-objectui.sh
.changeset/console-d8ec8d6d4f01.mdemitted by the bump; @objectstack/console: minor
packages/sdui-parser/objectui-lockstep.jsonre-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-locksteprefuses 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 nopackage.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 fileAnchorAt 9602dc820At d8ec8d6d4Verdict
containers.tsx (CHANGED)tabs item.icon block662-668729-735moved
containers.tsxtabs registration items input721788moved
containers.tsxaccordion item.icon block851-857918-924moved
containers.tsxaccordion registration items input898965moved
ObjectGrid.tsx (CHANGED)effectiveBulkActions / selection block2586-26013187-3202moved
plugin-dashboard/index.tsx (CHANGED)object-metric icon designer input204204same
useBulkExecutor.tsbulk-update / bulk-delete branches284-289284-289same
button.tsxresolveIcon call; icon renders36; 57, 59samesame
button.tsxregistration inputs70-87samesame
resolve-icon.tsresolveIcon; toPascalCase + rename map30-35; 14-24samesame
lazy-icon.tsxgetLazyIcon; + LazyIcon66-80; 66-92samesame
ObjectMetricWidget.tsxicon destructure; forward142; 474samesame
MetricWidget.tsxgetLazyIcon resolve; tinted square312-321; 373-382samesame
MetricCard.tsxthe sibling the record warns NOT to re-anchor to83samesame

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:

writestracked?generatorfeeds
pnpm sdui:manifest (round 1)packages/console/dist/sdui.manifest.jsonno, gitignoredgen-sdui-manifest.sh, browser dump of a built consolethe ADR-0082 D4 declaration-parity ratchet
this roundsdui.manifest.json (repo root) + scripts/sdui-manifest.record.jsonyesgen-sdui-manifest-node.mjs, plain Node against the PUBLISHED @object-ui/* packagesresolveSduiManifest() 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-shaskipped 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-actionsBot 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:dataprotocol:uisize/mteststooling

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

@baozhoutao@claude