Skip to content

chore(console): bump the objectui pin 00d3f09c500c to a472b07167a3 — the shipped console now carries objectui#7477's ListView data.provider: 'object' fold - #15554

Merged
baozhoutao merged 5 commits into
mainfrom
claude/issue-15422-objectui-pin-bump
Sep 5, 2026
Merged

chore(console): bump the objectui pin 00d3f09c500c to a472b07167a3 — the shipped console now carries objectui#7477's ListView data.provider: 'object' fold#15554
baozhoutao merged 5 commits into
mainfrom
claude/issue-15422-objectui-pin-bump

Conversation

@claude

@claude claude Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Fixes #15422

Moves the Console pin .objectui-sha from 00d3f09c500c to a472b07167a3 (objectui origin/main tip as read at bump time, verified reachable from main), so the prebuilt Console SPA this platform ships carries objectui#7477's normalizeListViewSchema fold. That fold is the consumer half #14791 step 3 depends on: while the pin sat at 00d3f09c, a page written in the canonical data={{ provider: 'object', object }} spelling validated green and rendered an empty list — landing step 3 against it would have shipped #14791's rejected option C by accident.

Old pin to new pin

old new
.objectui-sha 00d3f09c500c4a45b5f27aca8af80349412faaf1 a472b07167a39e55491109e864bb5a54027dcfbd

The card's one-line criterion, both ends, with its control

Run in an objectui checkout, exit code captured before any pipe:

git grep -q "provider === 'object'" PIN -- packages/core/src/utils/normalize-list-view.ts
  OLD pin 00d3f09c500c  ->  exit 1     (fold absent)
  NEW pin a472b07167a3  ->  exit 0     (fold present)

control, same file, same refs — git grep -c "normalizeListViewSchema" PIN -- the same file
  OLD pin               ->  exit 0, 1 hit    (the ref and the file are readable at the old pin,
                                              so the exit 1 above is a MEASURED absence)
  NEW pin               ->  exit 0

⚠️ The checkout was git fetch --unshallowed before any of this: the container's objectui clone is 50 commits deep, git cat-file -e 00d3f09c…^{commit} failed there, and every reading below (criterion, range, changeset level) would otherwise have been taken against a truncated history. git merge-base --is-ancestor a472b07167a3 origin/main exits 0 (self-proving: an exit 0 needs a complete path and cannot be manufactured by a missing object).

The commit range and the derived changeset level

The FROM-pin object was confirmed present before the changeset was trusted, so this is a real range read and not the #14178 / #14167 degraded tip-only patch:

git log --oneline 00d3f09c500c..a472b07167a3 | wc -l   ->  29
objectui-changeset-digest: 00d3f09c500c..a472b07167a3 walks completely in /home/user/objectui.
  15 releasing changeset(s), 4 breaking (0 declared major, 4 annotated),
  3 release-nothing, 11 commit(s) without a changeset
  wrote changeset console-a472b07167a3.md (@objectstack/console: minor)

Level minor, derived — not assumed. It is the highest level objectui itself declared over the range (.changeset/*.md files added between the two pins), not a default. The 4 declared-breaking entries carry an ADR-0087 disposition that judges each one against packages/spec's authorable surface individually; none names a key this repo declares (display_field / description_field / lookup_filters 0 occurrences under packages/spec/src; the Kanban trio 0; packages/spec/src imports from @object-ui/* 0 times; the retired responsive vocabulary already carries its own ledger entries here from #11027).

The fold itself is entry 7 of the list:

- **minor** — ListView: fold `data={{ provider: 'object', object }}` onto `objectName`, and read the
  author's view kind from `specType` / `type` (objectui#7477 — step 6 of #2890 …) (objectui `00d2fa682`)

The console actually rebuilt at the new pin (the Console Pin Gate's own question, run locally)

bash scripts/build-console.sh under the shared verify lock — os-verify-lock: VERDICT command-exit 0 · held the lock 552s (9m12s):

✓ Bundle canary 'import/jobs' present — framework client is in the bundle.
✓ Console bundle carries THIS tree's @objectstack/spec, and only it.
✓ @objectstack/console dist ready (51332 KB) from objectui@a472b07167a3

packages/console/dist/.objectui-sha stamps a472b07167a3. That is what ci.yml's Console Pin Gate (#4290) asks — the pinned SHA builds — reproduced locally rather than waited for. (check:prerelease-pins is not this gate: prerelease-pin-watch.yml's path filter is scripts/check-prerelease-pin-watch.mjs, its own workflow and pnpm-workspace.yaml, none of which this diff touches. It is in the derived list below anyway and runs green.)

Proving the unblock, not just the pin — the option-C trap #14791 names

Two independent legs, because "objectui#7477 is merged" is not the reading that decides whether a page renders.

Leg 1 — the fold is in the SHIPPED bundle bytes, not just in objectui main. The rebuilt SPA's @object-ui/core chunk carries the fold verbatim (minified):

m=q(t.data)?t.data:void 0,
h=m?.provider===`object`&&typeof m.object==`string`&&m.object?m.object:void 0,
g=h!==void 0&&!(typeof t.objectName==`string`&&t.objectName),
_=t.viewType, v=Xo(t.specType)??Xo(t.type)
   …later in the same function:  g&&(C.objectName=h), y&&(C.viewType=v??`grid`)

That is normalizeListViewSchema writing objectName from data.object and the author's kind from specType / type. Located by first finding the chunk that carries densityMode (the fold's own function) and then asking that chunk for the provider comparison: framework-CwMzt67l.js has densityMode=3, provider===object=2, specType=1; the four other chunks carrying densityMode have zero of both. ⚠️ A control was needed to get here: the first probe spelled the comparison provider==="object" and returned 0 hits on the fold AND 0 on the pre-existing provider==='value' control — a blind probe, not an absence. The minifier emits backticks.

Leg 2 — a real render of the canonical spelling, at the pinned tree. objectui's own packages/plugin-list/src/__tests__/ListView.objectProviderBinding-7477.test.tsx mounts the REAL react page tier (kind:'react' compile, scope injection, the registered list-view) with data={{ provider: 'object', object }} and asserts the rows arrive — the exact shape #14791 step 3 would move the four in-repo sites onto. Run in the build worktree checked out at the pin:

pnpm exec vitest run packages/plugin-list/src/__tests__/ListView.objectProviderBinding-7477.test.tsx \
                     packages/core/src/utils/__tests__/normalize-list-view.test.ts
 Test Files  2 passed (2)
      Tests  87 passed (87)                      VITEST_EXIT=0

⚠️ NOT MEASURED, stated rather than implied: no browser was driven against a running showcase/CRM app, so this PR does not claim a rendered non-empty list in the real console UI. It claims the two legs above: the fold's bytes are in the SPA this repo ships, and the fold's behaviour passes objectui's own react-page-tier render test at exactly the pinned commit. The four in-repo author sites are also not touched here — they still write objectName=, which keeps working; renaming them is #14791 step 3's job, which this pin unblocks rather than performs.

The pin bump's second half — both provenance records

  • pnpm sdui:manifest (browser route, ADR-0082 D4): dev server + chromium, ✓ wrote 57 public blocks, ratchet ✓ no new DECLARATION divergence vs accepted baseline. The container's chromium is build 1194 and the pin's playwright 1.62.1 wants 1234, so the documented per-agent symlink tree (docs/releases-maintenance.md) was used for that one invocation — nothing under /opt/pw-browsers was touched.
  • node scripts/gen-sdui-manifest-node.mjs --objectui-version 17.6.0 re-recorded scripts/sdui-manifest.record.json at pin a472b07167a3. The manifest itself does not move: 57 components, sha256 49211fee7792…, byte-identical, because both pins ship @object-ui 17.6.0. sdui.manifest.json therefore shows no diff — that is the correct outcome, not a skipped step.
  • pnpm gen:sdui-lockstep re-recorded packages/sdui-parser/objectui-lockstep.json against the new pin. ⚠️ Run with OBJECTUI_ROOT pointed at the build worktree checked out AT THE PIN: --update records the checkout's HEAD, and the sibling checkout's HEAD was a different revision — the first run recorded objectui@ac8d5233d077, which is not what ships. Re-run at the pin it records objectui@a472b07167a3, same grammar blob 0131f27cf86d, same 24 diagnostic codes ⇒ no port is owed.

Verification — every command, exit code captured before any pipe

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived the families from the real change set (4 paths, three-dot semantics, no hand-made diff list), on the final commit 6dc36141e. 58 commands run (53 derived + check-adr-0087-registration --base origin/main, check-changeset-fixed — its roster lives under .changeset, which one of my paths is in — check-empty-changeset --base origin/main, check:pm-dispatch-gates, check:objectui-bump):

55 green. The load-bearing verdict lines:

✓ check-sdui-manifest: sdui.manifest.json is present, intact (sha256 49211fee7792…, 57 components)
    and fresh at objectui pin a472b07167a3….
✓ check-sdui-manifest self-test: 6 cases behave (green passes; absence, tamper, moved pin, emptiness are RED).
✓ check:sdui-lockstep: OK — this copy is byte-identical to objectui@a472b07167a3 over 214 grammar line(s)
    [blob 0131f27cf86d] and agrees on all 24 diagnostic code(s), across 7 non-test source(s).
✓ check:console-sha  ✓ check:console-injection  ✓ check:merge-driver  ✓ check:nul-bytes
✓ check:objectui-changeset  ✓ check:objectui-bump  ✓ check:pm-dispatch-gates (1402+ cases, none edited)
✓ check-adr-0087-registration --base origin/main   ✓ check-changeset-fixed   ✓ check-empty-changeset

1 NOT MEASURED, recorded as such and never as a pass: pnpm check:dual-build-cjs-loads exits 3PREREQUISITE NOT MET — this gate reads built output, and some package has no dist/ … ⛔ This is NOT a pass: nothing was measured. It needs a full pnpm build; CI has one.

2 that went red on the build cache, not on this diff — measured in both directions. scripts/build-console.sh materialises the objectui tree at the pin into .cache/objectui-SHA/ (gitignored), and two repo-wide corpus gates walk it:

with .cache/objectui-a472b07167a3/ present after git worktree remove of it
check-comment-mask-corpus exit 1 — 10205 files, 1 disagrees: .cache/objectui-…/apps/console/src/pages/DocsIndex.tsx over-masks 1517 bytes exit 0 — 5936 files, 0 disagree, 0 unparseable
check:agent-test-spelling exit 1 — 1 violation at .cache/objectui-…/AGENTS.md:188 exit 0 — 0 violations, 447 files, 9 separators judged

Both findings are objectui's files, reached only because a pin bump necessarily creates that worktree; CI's lint job never builds the console, so .cache/ is not there. Filed separately rather than ridden on this PR.

pnpm lint — a PROVEN narrowing, not a skip. Three readings, all three needed:

  1. Surface, read from eslint's own config rather than guessed: every block in eslint.config.mjs is extension-scoped to **/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs} (:971, :1015, :1054, :1103, :1172, :1212).
  2. Count, read from --format json: pnpm exec eslint --no-inline-config --format json over all four changed paths reports 4 files, 0 errors, 0 lint results — each one "File ignored because no matching configuration was supplied." This diff contains zero lintable files.
  3. Invariance for untouched files: the config carries the measurement in its own words at :326-329 — "this repo runs one eslint.config.mjs, which never enables type-aware linting (no parserOptions.project, no typed @typescript-eslint rules) for ANY file" — so nothing in this diff can move the verdict on a file it does not contain.

Scope

.objectui-sha, the derived changeset, and the two provenance records the pin gates require. No packages/spec schema, no authorable metadata key, no protocol surface, and no author-site rename (that is #14791 step 3). packages/console/CHANGELOG.md and its package.json version rows are untouched by hand — changesets regenerate them, and the bot's release PR #15334 owns that surface.


Rework — the eight pin citations, re-measured at a472b0716

CI red on the first head: Type Check · source gates → "Check spec pin citations still name the pin this repo builds against" (pnpm --filter @objectstack/spec check:objectui-pin-citations, run 33919484147, job 101174258347). Reproduced on branch head 6dc36141e before touching anything:

✗ 8 spec source(s) assert an objectui pin this repo does NOT build against.
  .objectui-sha = a472b07167a39e55491109e864bb5a54027dcfbd
    packages/spec/src/data/api-methods-batch-conformance.test.ts:64 cites `00d3f09c5`
    packages/spec/src/ui/component.test.ts:281 / :370 / :2783 cite `00d3f09c5`
    packages/spec/src/ui/component.zod.ts:677 / :1736 / :1943 / :2578 cite `00d3f09c5`

exit 1.

The gate's own instruction, followed rather than routed around: the sha is not the record, the objectui file:line anchors are. Every anchor in all eight records was re-READ at a472b0716 (git -C ../objectui show a472b0716:PATH), and anchors and sha were updated together.

Per-citation table

# spec site objectui anchor(s) at 00d3f09c5 at a472b0716 read point
1 data/api-methods-batch-conformance.test.ts:64 plugin-grid/src/ObjectGrid.tsx:3790-3805 :3544-3559 anchor was WRONG when written — corrected, see below
1 (same record, 2nd anchor) plugin-grid/src/hooks/useBulkExecutor.ts:284-289 :284-289 unchanged — file byte-identical, re-READ, still ends on label = 'bulk delete'
2 ui/component.test.ts:281 (accordion items[].icon) components/src/renderers/layout/containers.tsx:919-925, :966 same unchanged — file byte-identical, both re-READ
3 ui/component.test.ts:370 (tabs items[].icon) containers.tsx:730-736, :789 same unchanged — file byte-identical, both re-READ
4 ui/component.test.ts:2783 (button + metric) form/button.tsx:43, :72, :74; action/resolve-icon.ts:129-132, :117-120, :100-105, :90-92 same unchanged — both files byte-identical, all re-READ
4 (same block, metric test's anchor at :2856) plugin-dashboard/src/index.tsx:161 :204 anchor was WRONG when written — corrected, see below
5 ui/component.zod.ts:677 (tabs icon) containers.tsx:730-736, :789 same unchanged — re-READ
6 ui/component.zod.ts:1736 (accordion icon) containers.tsx:919-925, :966 same unchanged — re-READ
7 ui/component.zod.ts:1943 (button icon) button.tsx:43, :72, :74; resolve-icon.ts:129-132, :117-120, :100-105, :90-92; lib/lazy-icon.tsx:66-92 same unchanged — re-READ
7 (same block, registration anchors) button.tsx:70-87 (inputs), :88-92 (defaultProps) :85-102, :103-107 anchors were WRONG when written — corrected, see below
8 ui/component.zod.ts:2578 (metric tile icon) plugin-dashboard/src/index.tsx:194, :204; ObjectMetricWidget.tsx:142, :474; MetricWidget.tsx:312-321, :373-382; MetricCard.tsx:83; lazy-icon.tsx:66-80 same unchanged — all five files byte-identical, every anchor re-READ

Zero read points died, and none moved because of the pin. Only one anchor file changed across the hop at all: ObjectGrid.tsx (7 insertions, 4 deletions, all at :1204-1213, where objectName moved onto the shared resolveRecordSourceObjectName). Every other anchor file — useBulkExecutor.ts, containers.tsx, resolve-icon.ts, button.tsx, lazy-icon.tsx, plugin-dashboard/src/index.tsx, ObjectMetricWidget.tsx, MetricWidget.tsx, MetricCard.tsx — is byte-identical at 00d3f09c5 and a472b0716, verified by git hash-object. Each was still re-READ rather than carried on that identity.

Three anchors were WRONG since they were written

This is the #10274 class the gate's header names, and it is why a sha-only rewrite is forbidden. All three sit in files that did not change, so a line-number refresh could never have surfaced them:

  1. ObjectGrid.tsx:3790-3805 named runBulkActionAggregate and says nothing about selection. The block the record means — effectiveBulkActions / hasBulkActions / the selectionMode ladder, the code that actually backs "auto-enables multi-select only when a bulk action exists" — was 3541-3556 at 00d3f09c5 and is 3544-3559 at a472b0716. Both spans hash to 6133933199230670e29d8c7f51c558d86a0af1d2, identical to the 67dadd602:3436-3451 the record cites as its predecessor, which is how the correct block was identified. Arithmetic on the wrong anchor would have produced a fresh-looking 3793-3808 still describing the wrong function.
  2. button.tsx:70-87 / :88-92 for the registration's input list and defaultProps. ComponentRegistry.register('button', …) starts at :81; the inputs array is :85-102 (label, variant, size, className — the record's claim holds, and it still publishes no icon) and defaultProps is :103-107.
  3. plugin-dashboard/src/index.tsx:161 in the metric test. That line is a sentence inside the registry shell's docblock. The object-metric registration begins at :194 and its icon input is at :204 — which the sibling record in component.zod.ts:2586 already had right, so the two halves of the same record disagreed. (:132 is a same-named input on the metric-card registration — the wrong re-anchor the zod record's ⚠️ note warns against.)

Each correction is recorded in the comment beside it, stating that the anchor was wrong when written rather than shifted.

Verification

Exit codes captured before any pipe; verdict lines quoted from the gates themselves.

check exit verdict
check:objectui-pin-citations before (head 6dc36141e) 1 ✗ 8 spec source(s) assert an objectui pin this repo does NOT build against.
check:objectui-pin-citations after (head 3db0527b7) 0 ✅ 8 asserting objectui pin citation(s) match .objectui-sha (a472b0716), 16 historical citation(s) recorded and not checked, across 1178 spec source(s).
vitest run on both touched test files 0 Test Files 2 passed (2) · Tests 251 passed (251)
pnpm --filter @objectstack/spec typecheck 0 check:test-typecheck: OK — @objectstack/spec's test layer compiles under packages/spec/tsconfig.test.json; 54 file(s) / 261 error(s) / 145 pinned signature(s) (unchanged; the test layer IS compiled, so the two edited test files are covered)
pnpm check:nul-bytes 0 check-nul-bytes: OK (scanned 7561 text file(s) … no raw ASCII control bytes)
dispatch-gates --changed --commands family (84 commands) 81 green, 3 NOT MEASURED (below)

Both the pin gate and check:nul-bytes were re-run on the final commit 3db0527b7, after the commit, not before it.

3 NOT MEASURED, each by its own prerequisite text — none is a finding:

  • pnpm --filter @objectstack/spec check:react-declaration-parity — exit 1, but its own text is MANIFEST is not set — there is no registry side to compare against. This gate did NOT run. It needs a browser manifest dump (pnpm sdui:manifest), the on-demand gate this PR's scripts/sdui-manifest.record.json already records.
  • pnpm check:dual-build-cjs-loads — exit 3, PREREQUISITE NOT MET — this gate reads built output, and some package has no dist/ (103 packages). Needs a whole-monorepo pnpm build; CI does it.
  • pnpm check:type-check-debt — exit 3, --re-measure cannot run: 33 workspace dependenc(ies) … have no built type entry point on disk. Same reason.

Six further gates first returned a prerequisite failure for the same reason and were re-run after turbo run build --filter=@objectstack/spec --filter=@objectstack/formula --filter=@objectstack/lint; all six then passed: check:api-surface, check:browser-reachable-entries, check:dual-source-exports, check:entry-nameability, check:exported-any, check:doc-formula-expressions.

The derivation does not name this gate. node scripts/pm/dispatch-gates.mjs --changed --commands --repo objectstack-ai/objectstack on this change set emits 84 commands and check:objectui-pin-citations is not among them — which is how the red reached CI in the first place. It was run by hand as the first item above. The derivation gap itself is the PM's finding, filed separately, not this PR's scope.

Scope of the rework

Citation comments only, in three files, +87 / -70. No schema, no .describe(), no assertion, and no authorable key changed — git diff on the rework commit touches nothing but comment bodies. No test assertion depends on any of the corrected anchors: the assertions are safeParse accept/reject pins and .description substring checks, none of which reads a line number.

🤖 Generated with Claude Code

https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk


Generated by Claude Code


Generated by Claude Code

Moves `.objectui-sha` past objectui#7477's `normalizeListViewSchema` fold, so
the shipped Console SPA folds `data={{ provider: 'object', object }}` onto
`objectName` and reads the author's view kind from `specType` / `type`. That
fold is the consumer half #14791 step 3 depends on: with the old pin, a page
written in the canonical spelling validates green and renders an empty list.

The range walks completely (the objectui checkout was deepened first, so the
FROM-pin object is present and the #14178 degraded tip-only `patch` shape
cannot apply): 29 non-merge commits, 18 changesets added, 15 releasing, 4
declared-breaking, level `minor` derived from objectui's own declarations.

The ADR-0087 disposition on the generated changeset judges each of the four
declared-breaking entries against `packages/spec`'s authorable surface one at
a time; none of them names a key this repo declares.

`packages/sdui-parser/objectui-lockstep.json` is re-recorded at the new pin
(byte-identical grammar region, 24 diagnostic codes, no port owed).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
`scripts/gen-sdui-manifest-node.mjs --objectui-version 17.6.0` re-enumerated
the published registry the new pin ships and re-recorded the provenance:
`check-sdui-manifest` refuses a record whose `objectuiSha` lags `.objectui-sha`.

The manifest itself does not move — 57 components, sha256 49211fee7792…,
byte-identical, because both pins ship @object-ui 17.6.0. Only the pin the
record was taken against changes.

The browser route was run too (`pnpm sdui:manifest`): 57 public blocks dumped
from objectui@a472b07167a3 through a real chromium, and ADR-0082 D4's
declaration-parity ratchet reports no new divergence against the accepted
baseline.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
@github-actions github-actions Bot added the size/s label Sep 4, 2026
@github-actions

github-actions Bot commented Sep 4, 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 61 of 219 client-bound route-ledger rows — the other 158 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 158: 0 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 — 130 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 ba426b0f091b8d5901acf10bb8e649b514349f49packageMentionDocs.

Which tree this was computed on

This run read content/docs from e44fadd6ce5d392ba5d153aac4b4a0460afc7d66 — the merge of head 3db0527b7c6b0f54d89f62ef0d3e08be7158792f into base ba426b0f091b8d5901acf10bb8e649b514349f49, 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 e44fadd6ce5d392ba5d153aac4b4a0460afc7d66 && git checkout e44fadd6ce5d392ba5d153aac4b4a0460afc7d66
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin ba426b0f091b8d5901acf10bb8e649b514349f49 3db0527b7c6b0f54d89f62ef0d3e08be7158792f && git checkout -B drift-repro ba426b0f091b8d5901acf10bb8e649b514349f49 && git merge --no-ff 3db0527b7c6b0f54d89f62ef0d3e08be7158792f

node scripts/docs-audit/affected-docs.mjs --json ba426b0f091b8d5901acf10bb8e649b514349f49

⚠️ 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 ba426b0f091b8d5901acf10bb8e649b514349f49 → pass the list as
args.docs, on the commit named under Which tree this was computed on.

@claude

claude Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

ACCEPT — PM seat domain:devx @ objectstack (#6023), session session_012zGPuVVX3deAx9LdjK8jCk.

Reviewed against the three-dot diff origin/main...claude/issue-15422-objectui-pin-bump (merge base 8644d1d33, head 6dc36141e): 4 files, +48/−5, matching the PR file list — .objectui-sha 00d3f09c…a472b071… (objectui origin/main tip, ancestor check exit 0), the generated changeset (@objectstack/console minor, derived from objectui's own 15 releasing changesets over 29 commits with 4 BREAKING rows called out and the 11 undeclared commits listed by subject — the digest walked the full range after an --unshallow, so the #14178 tip-only-patch failure mode did not fire), the re-recorded objectui-lockstep.json (re-run with OBJECTUI_ROOT at the pin, not the checkout's HEAD — same grammar blob, 24 codes) and sdui-manifest.record.json (57 components, manifest bytes unchanged — both pins ship @object-ui 17.6.0). Nothing in packages/console's CHANGELOG / package.json hand-edited (the bot's #15334 owns those rows). The card's criterion: old pin exit 1 with a live control, new pin exit 0. The option-C trap: the rebuilt SPA's framework chunk carries the fold (located by the fold's own densityMode function, with a control that caught a blind probe spelling), and objectui's own ListView.objectProviderBinding-7477 test passes at the pin (87 tests); a browser-driven render is stated NOT MEASURED. Console build under the verify lock: bundle carries this tree's spec only, dist/.objectui-sha stamped. Derived family 53 (+5 by name) — 55 green, check:dual-build-cjs-loads NOT MEASURED (unbuilt dist), and 2 reds measured to the BUILD CACHE, not this diff (filed as #15557). Lint: a proven narrowing (no lintable file in the diff). Hot-file scan: no other open PR touches the pin, the record or the lockstep.

Fixes #15422 closes the card on merge and unblocks domain:spec's #14791 step 3 (the dev left the note there). #15557 is graded on the card; #15540 (packages/spec/liveness/field.json prose) is left for triage to route. Flipping ready and arming auto-merge now.


Generated by Claude Code

@claude

claude Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

REWORK — PM seat domain:devx @ objectstack (#6023), session session_012zGPuVVX3deAx9LdjK8jCk.

This PR has been armed but red since 21:08Z, and one of its two reds is its own:

  1. Type Check · source gates → step "Check spec pin citations still name the pin this repo builds against" (pnpm --filter @objectstack/spec check:objectui-pin-citations, run 33919484147, job 101174258347): ✗ 8 spec source(s) assert an objectui pin this repo does NOT build against..objectui-sha = a472b07167a39e55491109e864bb5a54027dcfbd, while packages/spec/src/data/api-methods-batch-conformance.test.ts:64, packages/spec/src/ui/component.test.ts:281 / :370 / :2783 and packages/spec/src/ui/component.zod.ts:677 / :1736 / :1943 / :2578 cite 00d3f09c5. The gate's own instruction, which the fix must follow: ⛔ do NOT replace the sha — the objectui file:line anchors beside each citation are the record; RE-MEASURE each at the new pin (git -C ../objectui show a472b0716:<path>), re-derive every cited line, update anchors and sha together, and say in the PR body what moved; a read point that moved or died is reported, not re-pointed; a citation that is a dated record of a past measurement goes to the other spelling (`.objectui-sha` pin `00d3f09c5`), which the gate does not check. The sibling TypeScript Type Check red is this lane's aggregate.
  2. Test Core (6/6) — the plugin-auth timeout shared by three unrelated PRs ([finding] plugin-auth durability-swallow-repair.test.ts:673 times out at 10000 ms on the PR-CI Test Core (6/6) shard — three unrelated PRs red on it in one hour while merge-group runs of the same shard passed #15603); not this PR's, and NOT re-run here until (1) is fixed, since the fix pushes anyway.

The derived family for a .objectui-sha change set did not name check:objectui-pin-citations — the same derivation-gap class as #15501 / #15553; a finding for that gap follows separately.

Dispatching the rework on the same branch claude/issue-15422-objectui-pin-bump (new commits, no force-push). Auto-merge stays armed; it fires on the green head.


Generated by Claude Code

…15422)

The pin bump moved `.objectui-sha` to `a472b07167a39e55491109e864bb5a54027dcfbd`
while eight read-point records in `packages/spec/src` still asserted
`00d3f09c5`. Per `check:objectui-pin-citations`' own instruction, each record
was RE-MEASURED at the new pin rather than sha-replaced: every objectui
`file:line` anchor was re-READ at `a472b0716` and the anchors and the sha were
updated together.

No read point died. Three anchors were found WRONG SINCE THEY WERE WRITTEN --
the exact #10274 class the gate exists to surface, and invisible to a
line-number refresh because all three sit in files that are byte-identical
across the hop:

  - `ObjectGrid.tsx:3790-3805` named `runBulkActionAggregate`, not the
    selection gating the record cites. The real block was `3541-3556` at
    `00d3f09c5` and is `3544-3559` here.
  - `button.tsx:70-87` / `:88-92` for the registration's input list and
    `defaultProps`: really `:85-102` / `:103-107`.
  - `plugin-dashboard/src/index.tsx:161` for the `object-metric` icon input: a
    docblock sentence in the registry shell, not the input. Really `:204`,
    which the sibling record in `component.zod.ts` already had right.

Comments only -- no schema, no behaviour, no assertion changed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
@claude

claude Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

rework-report — issue #15422, PR #15554, head 3db0527b7 (branch claude/issue-15422-objectui-pin-bump, new commit, no force-push).

The PR's own red is fixed. check:objectui-pin-citations was reproduced on head 6dc36141e first, then made green by RE-MEASURING all eight records at a472b0716 — never by replacing the sha.

CI red on the first head: Type Check · source gates → "Check spec pin citations still name the pin this repo builds against" (pnpm --filter @objectstack/spec check:objectui-pin-citations, run 33919484147, job 101174258347). Reproduced on branch head 6dc36141e before touching anything:

✗ 8 spec source(s) assert an objectui pin this repo does NOT build against.
  .objectui-sha = a472b07167a39e55491109e864bb5a54027dcfbd
    packages/spec/src/data/api-methods-batch-conformance.test.ts:64 cites `00d3f09c5`
    packages/spec/src/ui/component.test.ts:281 / :370 / :2783 cite `00d3f09c5`
    packages/spec/src/ui/component.zod.ts:677 / :1736 / :1943 / :2578 cite `00d3f09c5`

exit 1.

The gate's own instruction, followed rather than routed around: the sha is not the record, the objectui file:line anchors are. Every anchor in all eight records was re-READ at a472b0716 (git -C ../objectui show a472b0716:PATH), and anchors and sha were updated together.

Per-citation table

# spec site objectui anchor(s) at 00d3f09c5 at a472b0716 read point
1 data/api-methods-batch-conformance.test.ts:64 plugin-grid/src/ObjectGrid.tsx:3790-3805 :3544-3559 anchor was WRONG when written — corrected, see below
1 (same record, 2nd anchor) plugin-grid/src/hooks/useBulkExecutor.ts:284-289 :284-289 unchanged — file byte-identical, re-READ, still ends on label = 'bulk delete'
2 ui/component.test.ts:281 (accordion items[].icon) components/src/renderers/layout/containers.tsx:919-925, :966 same unchanged — file byte-identical, both re-READ
3 ui/component.test.ts:370 (tabs items[].icon) containers.tsx:730-736, :789 same unchanged — file byte-identical, both re-READ
4 ui/component.test.ts:2783 (button + metric) form/button.tsx:43, :72, :74; action/resolve-icon.ts:129-132, :117-120, :100-105, :90-92 same unchanged — both files byte-identical, all re-READ
4 (same block, metric test's anchor at :2856) plugin-dashboard/src/index.tsx:161 :204 anchor was WRONG when written — corrected, see below
5 ui/component.zod.ts:677 (tabs icon) containers.tsx:730-736, :789 same unchanged — re-READ
6 ui/component.zod.ts:1736 (accordion icon) containers.tsx:919-925, :966 same unchanged — re-READ
7 ui/component.zod.ts:1943 (button icon) button.tsx:43, :72, :74; resolve-icon.ts:129-132, :117-120, :100-105, :90-92; lib/lazy-icon.tsx:66-92 same unchanged — re-READ
7 (same block, registration anchors) button.tsx:70-87 (inputs), :88-92 (defaultProps) :85-102, :103-107 anchors were WRONG when written — corrected, see below
8 ui/component.zod.ts:2578 (metric tile icon) plugin-dashboard/src/index.tsx:194, :204; ObjectMetricWidget.tsx:142, :474; MetricWidget.tsx:312-321, :373-382; MetricCard.tsx:83; lazy-icon.tsx:66-80 same unchanged — all five files byte-identical, every anchor re-READ

Zero read points died, and none moved because of the pin. Only one anchor file changed across the hop at all: ObjectGrid.tsx (7 insertions, 4 deletions, all at :1204-1213, where objectName moved onto the shared resolveRecordSourceObjectName). Every other anchor file — useBulkExecutor.ts, containers.tsx, resolve-icon.ts, button.tsx, lazy-icon.tsx, plugin-dashboard/src/index.tsx, ObjectMetricWidget.tsx, MetricWidget.tsx, MetricCard.tsx — is byte-identical at 00d3f09c5 and a472b0716, verified by git hash-object. Each was still re-READ rather than carried on that identity.

Three anchors were WRONG since they were written

This is the #10274 class the gate's header names, and it is why a sha-only rewrite is forbidden. All three sit in files that did not change, so a line-number refresh could never have surfaced them:

  1. ObjectGrid.tsx:3790-3805 named runBulkActionAggregate and says nothing about selection. The block the record means — effectiveBulkActions / hasBulkActions / the selectionMode ladder, the code that actually backs "auto-enables multi-select only when a bulk action exists" — was 3541-3556 at 00d3f09c5 and is 3544-3559 at a472b0716. Both spans hash to 6133933199230670e29d8c7f51c558d86a0af1d2, identical to the 67dadd602:3436-3451 the record cites as its predecessor, which is how the correct block was identified. Arithmetic on the wrong anchor would have produced a fresh-looking 3793-3808 still describing the wrong function.
  2. button.tsx:70-87 / :88-92 for the registration's input list and defaultProps. ComponentRegistry.register('button', …) starts at :81; the inputs array is :85-102 (label, variant, size, className — the record's claim holds, and it still publishes no icon) and defaultProps is :103-107.
  3. plugin-dashboard/src/index.tsx:161 in the metric test. That line is a sentence inside the registry shell's docblock. The object-metric registration begins at :194 and its icon input is at :204 — which the sibling record in component.zod.ts:2586 already had right, so the two halves of the same record disagreed. (:132 is a same-named input on the metric-card registration — the wrong re-anchor the zod record's ⚠️ note warns against.)

Each correction is recorded in the comment beside it, stating that the anchor was wrong when written rather than shifted.

Verification

Exit codes captured before any pipe; verdict lines quoted from the gates themselves.

check exit verdict
check:objectui-pin-citations before (head 6dc36141e) 1 ✗ 8 spec source(s) assert an objectui pin this repo does NOT build against.
check:objectui-pin-citations after (head 3db0527b7) 0 ✅ 8 asserting objectui pin citation(s) match .objectui-sha (a472b0716), 16 historical citation(s) recorded and not checked, across 1178 spec source(s).
vitest run on both touched test files 0 Test Files 2 passed (2) · Tests 251 passed (251)
pnpm --filter @objectstack/spec typecheck 0 check:test-typecheck: OK — @objectstack/spec's test layer compiles under packages/spec/tsconfig.test.json; 54 file(s) / 261 error(s) / 145 pinned signature(s) (unchanged; the test layer IS compiled, so the two edited test files are covered)
pnpm check:nul-bytes 0 check-nul-bytes: OK (scanned 7561 text file(s) … no raw ASCII control bytes)
dispatch-gates --changed --commands family (84 commands) 81 green, 3 NOT MEASURED (below)

Both the pin gate and check:nul-bytes were re-run on the final commit 3db0527b7, after the commit, not before it.

3 NOT MEASURED, each by its own prerequisite text — none is a finding:

  • pnpm --filter @objectstack/spec check:react-declaration-parity — exit 1, but its own text is MANIFEST is not set — there is no registry side to compare against. This gate did NOT run. It needs a browser manifest dump (pnpm sdui:manifest), the on-demand gate this PR's scripts/sdui-manifest.record.json already records.
  • pnpm check:dual-build-cjs-loads — exit 3, PREREQUISITE NOT MET — this gate reads built output, and some package has no dist/ (103 packages). Needs a whole-monorepo pnpm build; CI does it.
  • pnpm check:type-check-debt — exit 3, --re-measure cannot run: 33 workspace dependenc(ies) … have no built type entry point on disk. Same reason.

Six further gates first returned a prerequisite failure for the same reason and were re-run after turbo run build --filter=@objectstack/spec --filter=@objectstack/formula --filter=@objectstack/lint; all six then passed: check:api-surface, check:browser-reachable-entries, check:dual-source-exports, check:entry-nameability, check:exported-any, check:doc-formula-expressions.

The derivation does not name this gate. node scripts/pm/dispatch-gates.mjs --changed --commands --repo objectstack-ai/objectstack on this change set emits 84 commands and check:objectui-pin-citations is not among them — which is how the red reached CI in the first place. It was run by hand as the first item above. The derivation gap itself is the PM's finding, filed separately, not this PR's scope.

Scope of the rework

Citation comments only, in three files, +87 / -70. No schema, no .describe(), no assertion, and no authorable key changed — git diff on the rework commit touches nothing but comment bodies. No test assertion depends on any of the corrected anchors: the assertions are safeParse accept/reject pins and .description substring checks, none of which reads a line number.


Generated by Claude Code

@claude

claude Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor Author

REWORK VERIFIED — PM seat domain:devx @ objectstack (#6023), session session_012zGPuVVX3deAx9LdjK8jCk.

Reviewed against the three-dot diff origin/main...claude/issue-15422-objectui-pin-bump (head 3db0527b7 = merge of main + one rework commit): the packages/spec part is +/− COMMENT lines only (0 non-comment lines changed across api-methods-batch-conformance.test.ts, component.test.ts, component.zod.ts); no schema, .describe(), assertion or authorable key moved. The eight citations now read .objectui-sha = a472b0716 with anchors re-derived at that pin and the date of the re-read; three anchors that were wrong since written (in files byte-identical across the hop) are corrected with the reason recorded beside each — filed as a domain:spec finding (see the issue filed alongside this note).

Dev's verification quoted: red reproduced on 6dc36141e (✗ 8 spec source(s) assert an objectui pin this repo does NOT build against.) → green on 3db0527b7: OK 8 asserting objectui pin citation(s) match .objectui-sha (a472b0716), 16 historical citation(s) recorded and not checked, across 1178 spec source(s).; the two edited test files Tests 251 passed (251); pnpm --filter @objectstack/spec typecheck exit 0 with check:test-typecheck: OK at recorded numbers; derived family 84 commands, 81 green, 3 NOT MEASURED by their own prerequisite text (manifest / unbuilt closure), six more green after a targeted build; check:objectui-pin-citations confirmed ABSENT from the derived family for a .objectui-sha change set (#15604).

CI on 3db0527b7 is running; auto-merge stays armed and fires on the green head. If Test Core (6/6) reds again on the #15603 flake, this PR's one re-run is still unspent.


Generated by Claude Code

@baozhoutao
baozhoutao added this pull request to the merge queue Sep 5, 2026
Merged via the queue into main with commit 236f2df Sep 5, 2026
38 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-15422-objectui-pin-bump branch September 5, 2026 00:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

2 participants