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

Open
claude[bot] wants to merge 3 commits into
mainfrom
claude/issue-15422-objectui-pin-bump
Open

chore(console): bump the objectui pin 00d3f09c500c to a472b07167a3 — the shipped console now carries objectui#7477's ListView data.provider: 'object' fold#15554
claude[bot] wants to merge 3 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.

🤖 Generated with Claude Code

https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk


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

⚠️ 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. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)).

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
  • 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 — 2 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 cf6b67164e37b92cf1fb6b172aa8f44e1fdce666packageMentionDocs.

@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

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

Labels

documentation Improvements or additions to documentation size/s tooling

Projects

None yet

1 participant