Skip to content

chore(objectui): move the console pin to f96f771140f1, carrying objectstack-ai/objectui#12453 and objectstack-ai/objectui#12519 - #23738

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-23720-console-pin-hop
Oct 16, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-23720-console-pin-hop

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #23720
Clause-②: no

This PR moves the console pin from 1f23d5b070fa to f96f771140f1, objectui main at f96f771140f1ba488245e0d0d3e7420d720bff9a. That commit carries 2a69285 (objectstack-ai/objectui#12453, the Studio read-only posture, the epic's last design child) and 73a3eb2 (objectstack-ai/objectui#12519, navigation edit mode keeps the 240 px rail), and every other commit the card lists as not in the old pin.

It is one bump, through scripts/bump-objectui.sh, and not a rider on another PR.

Tier: no governed surface. node scripts/pm/check-governed-merges.mjs --branch claude/issue-23720-console-pin-hop reads 0 of 4 paths on the register (exit 0). Size: 4 files, +47 / −6 (53 changed lines, under the 3000 human-merge line).

The hop: 31 objectui commits, 267 paths, all on objectui main

  • REST compare 1f23d5b070fa...f96f771140f1: ahead_by 31, behind_by 0, total_commits 31, 267 files.
  • In the sibling checkout (not shallow: git rev-parse --is-shallow-repository answers false), git merge-base --is-ancestor X f96f771140f1 exits 0 for 2a69285 and for 73a3eb2. It also exits 0 for each of the other seven commits the card lists as missing (a27c1cf, b541694, a3d14e7, 5249c24, eea0993, baab2d6, d17952c), for the old pin, and for f96f771140f1 against objectui origin/main. 2a69285 is 13 commits behind the new pin and 73a3eb2 is 14 behind.
  • The negative leg: each of those nine commits against the OLD pin exits 1. Control leg on the same checkout: 1f23d5b070fa~50 against 1f23d5b070fa exits 0.

Why f96f771140f1

Acceptance readings, at the new pin

(a) The built console bundle carries the read-only link, and not the retired key

Source, at objectui f96f771140f1. packages/app-shell/src/views/metadata-admin/i18n.ts declares 'engine.studio.pkg.readonlyLink': 'Read-only · Customize with an overlay' (line 3034, and the zh-CN entry at line 6318). StudioDesignSurface.tsx:526 renders it. git grep engine.studio.designer.hintReadOnly finds nothing under packages or apps at the new pin. At the old pin it finds 5 hits: the two i18n entries, the ObjectFormDesigner.tsx:806 call site and two test lines.

Built bundle. scripts/build-console.sh built objectui at the pin into .cache/objectui-f96f771140f1/, and its dist was copied to packages/console/dist/ (3449 files, 3434 under assets/). A literal-string grep (grep -rlF) over every file:

  • engine.studio.pkg.readonlyLink: 2 assets. In assets/studioBuilder-BUpNsRQw.js it is the link's call site, Z(`engine.studio.pkg.readonlyLink`,n), right after its Layers icon. In assets/i18n-Ba_I5RJO.js it is the table entry, 2 occurrences (en and zh-CN).
  • Read-only · Customize with an overlay: 1 asset, assets/i18n-Ba_I5RJO.js.
  • The control. The retired key engine.studio.designer.hintReadOnly appears in 0 of the 3449 files.
  • Positive control for that zero. engine.studio.designer.toolbarHint is the sibling key the retired one was rendered beside (ObjectFormDesigner.tsx, same i18n table). It appears in the same two assets, studioBuilder-BUpNsRQw.js and i18n-Ba_I5RJO.js, so the grep can see that table and that component.

On the smoke boot below, the served /_console/assets/i18n-Ba_I5RJO.js and /_console/assets/studioBuilder-BUpNsRQw.js are byte-identical to the dist copies (cmp exit 0 each). They give the same readings: 1 English string, 1 key at the call site, 0 retired keys.

(b) A smoke boot serves /_console/.objectui-sha at the new pin

pnpm dev -- --fresh -p 47321 from this worktree, with the pnpm PID recorded:

  • GET /api/v1/health answered 200 (status: ok, version 18.0.0-next.1).
  • GET /_console/ answered 200 (18552 bytes), and its entry assets/index-CYwFWDSL.js answered 200 (283056 bytes).
  • The served /_console/.objectui-sha reads f96f771140f1ba488245e0d0d3e7420d720bff9a (200).

I stopped the server by its listening PID (3900) and the recorded pnpm PID (3798). Every PID in its process tree was gone afterwards, and lsof -ti tcp:47321 found nothing.

No live browser run. (a) is a source and bundle reading. A browser pass on a read-only package was not part of the card's acceptance and was not done.

Artefacts that travel with the pin

  • Console changeset .changeset/console-f96f771140f1.md, from scripts/bump-objectui.sh --no-commit f96f771140f1….
    • @objectstack/console minor, the level the script derived: the highest level objectui declared over the range.
    • The digest walked the range completely: 31 releasing changesets across 31 non-merge commits, 0 breaking (0 declared major, 0 annotated), 0 release-nothing, 0 commits without a changeset.
    • No ADR-0087 marker. The range declares nothing breaking, so the changeset is not breaking and owes no disposition. check-adr-0087-registration --base origin/main reads "this PR adds no declared-breaking changeset (1 non-breaking changeset(s) seen)". This differs from the previous hop, whose range carried five declared-breaking entries.
  • SDUI manifest. node scripts/gen-sdui-manifest-node.mjs over .cache/objectui-f96f771140f1/apps/console wrote 107 components. sdui.manifest.json is byte-identical (sha256 370153544e9b…, unchanged), so no component, input or accept set moved. Only its provenance record scripts/sdui-manifest.record.json moves (objectuiSha and modulesRoot). The unchanged manifest is also why Clause-②: no holds on the one shipped file this repository adds to the console dist.
  • Lockstep record. pnpm gen:sdui-lockstep re-records packages/sdui-parser/objectui-lockstep.json at f96f771140f1. It ran with OBJECTUI_ROOT set to the pin's build worktree, so the shared objectui checkout's HEAD was never moved. Across the hop, objectui's packages/sdui-parser did not change at all (git diff --stat is empty). The grammar blob 0131f27cf86d and the predicate blob 76c18fb95d1f are unchanged, and check:sdui-lockstep passes (214 grammar lines, 25 codes, the predicate). No parser port is owed.

Console Pin Gate steps, run locally

The Console Pin Gate is a main full-battery job that is skipped on PRs. This is its local equivalent:

  1. Client closure: turbo run build --concurrency=2 --filter=@objectstack/client --filter=@objectstack/sdui-parser --filter=@objectstack/spec (34 tasks, 34 successful).

  2. scripts/build-console.sh at the new pin, under the verify lock. It reported:

    • bundle canary import/jobs present;
    • exactly one zod version literal ({major:4,minor:6,patch:5}, 2252 assets/*.js read);
    • "Console bundle carries THIS tree's @objectstack/spec, and only it";
    • dist ready, 64496 KB, from objectui@f96f771140f1.

    That run came before the manifest regeneration, but the regenerated manifest is byte-identical, so the dist ships the same bytes either way.

  3. pnpm check:console-sha ("Console dist matches the objectui pin (objectui@f96f771140f1)") and pnpm check:console-injection (self-test 67 assertions, then the injected-spec reading): both exit 0, inside the gate run below.

Verification, at b1a8a6bcf

  • Derived gates. node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths, from merge base 9bb93706f) derived 69 commands. Each was run with its exit code recorded before any pipe. --ran reports "69 derived, 69 run, 0 NOT-MEASURED, 0 UNRUN".
    • One first exited 3 (prerequisite not met) and was re-run green at the same head: check:dual-build-cjs-loads needed a full turbo run build --concurrency=2 --filter=!@objectstack/docs (75 tasks, 75 successful). It then read 110 entry points across 68 packages.
    • Named here: check-sdui-manifest (sha256 370153544e9b…, 107 components, recorded at the live pin) and its self-test (13 cases), check:sdui-lockstep, check:objectui-changeset, check-adr-0087-registration --base origin/main, check-changeset-no-major --base origin/main ("This diff introduces no major bump"), check-empty-changeset --base origin/main, check:console-sha and check:console-injection.
  • The package this diff touches. pnpm --filter @objectstack/sdui-parser exec vitest run --maxWorkers=2: 14 files, 225 passed. pnpm --filter @objectstack/sdui-parser typecheck (tsc --noEmit): exit 0. The lockstep record is not in that package's files[] and no test of it reads the file. These ran as a regression check, not as owed coverage.
  • Not merged with main before opening. main moved 4 commits (9bb93706f to d0c09e47c) while this ran. None of them touches any of this PR's 4 paths. 29 of the 45 paths they touch are under packages/spec/src, so a merge would make the locally built console dist's spec-injection reading stale and would need a second console build to re-read it. CI reads this PR at its merge ref, and the queue rebuilds it onto main.
  • NOT MEASURED: repo-wide pnpm lint, the Type Check lanes and the full test farm. Reason: they are CI-owned runs, and this diff adds no TypeScript.

Acceptance notes


Generated by Claude Code

scripts/bump-objectui.sh --no-commit f96f771140f1: the pin file and the
derived @objectstack/console changeset (31 releasing objectui changesets,
0 breaking, level minor). The SDUI manifest and lockstep re-records follow.

Claude-Session: https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4t
Co-authored-by: Claude <noreply@anthropic.com>
…step at f96f771140f1

node scripts/gen-sdui-manifest-node.mjs over .cache/objectui-f96f771140f1:
107 components, sdui.manifest.json byte-identical (sha256 370153544e9b),
so only its provenance record moves. pnpm gen:sdui-lockstep with
OBJECTUI_ROOT at the pin's build worktree: objectui's packages/sdui-parser
is unchanged across the hop (grammar blob 0131f27cf86d, predicate blob
76c18fb95d1f), so only the revision fields move.

Claude-Session: https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4t
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation tooling labels Oct 15, 2026
@github-actions

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.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 3 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 3b46855fb97365902e1e81a6484cd41bd363e575 → packageMentionDocs.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 · ACCEPT · PR #23738 (draft, head b1a8a6bcf, Fixes #23720) · domain:devx seat 2 · session_016PVjjuVPte5XEJvaQx1E4t · 2026-10-15T23:13Z

Checked on GitHub and against the sources, not on the report's say-so.

  • Shape:
    • 4 files, +47 / −6, inside the claim's surface (6203566765): .objectui-sha, the derived console changeset, the SDUI manifest record and packages/sdui-parser/objectui-lockstep.json.
    • No packages/spec/src/**, no objectui source, no hand edit to packages/console/dist/.
    • Not governed: check-governed-merges.mjs --pr 23738, run by this seat, read 0 of 4 paths and 53 lines.
    • The body's only closing keyword is Fixes #23720. Clause-②: no is at line start.
  • Target: objectui f96f771140f1, re-read by the seat with REST compare.
    • It is 31 ahead of / 0 behind the old pin 1f23d5b070fa.
    • Of the card's two required commits, 2a69285 is 13 behind it and 73a3eb2 is 14 behind, so it carries both. The other seven commits the card lists as missing are also its ancestors (a27c1cf, b541694, a3d14e7, 5249c24, eea0993, baab2d6, d17952c).
    • The seat read its check-runs: 101, of which 97 are success and 4 skipped; none failed. It was objectui main's tip at dispatch. main has since moved to 3e09c1e8d; those 4 commits ride a later hop, per the card's "Not this card's" section.
  • Acceptance (a), re-read by the seat in objectui source with git grep:
    • At the new pin, engine.studio.pkg.readonlyLink is in 4 files; i18n.ts:3034 maps it to Read-only · Customize with an overlay. The retired engine.studio.designer.hintReadOnly is in 0 files.
    • Control at the old pin: 0 files for the link and 3 files for the retired key.
    • The dev's built-bundle reading agrees: the link is in 2 assets, the retired key in 0 of 3449 files, and the sibling toolbarHint is in the same 2 assets as a positive control.
  • Acceptance (b): the dev's smoke boot served /_console/.objectui-sha = f96f771140f1… (200). The dev also ran the Console Pin Gate's local equivalent: closure build, build-console.sh, check:console-sha and check:console-injection. Accepted as dispatched. The gate itself runs on main and is skipped on PRs.
  • Generated artefacts:
    • sdui.manifest.json is byte-identical (107 components, sha256 370153544e9b…). Only its record moves: objectuiSha and modulesRoot.
    • The lockstep record is re-recorded with no grammar move. The seat confirmed that git diff --stat 1f23d5b070fa f96f771140f1 -- packages/sdui-parser in objectui is empty, so no parser port is owed.
  • Changeset prose, checked by this seat:
    • The frontmatter is minor, the highest level objectui declared over the range; .changeset/pre.json is in pre mode on next.
    • "31 non-merge commits" equals the compare count. The closing range line 1f23d5b070fa...f96f771140f1 equals the .objectui-sha diff.
    • The two carried entries (2a692851a, objectui#12453, read-only posture; 73a3eb2b9, objectui#12519, the 240 px rail) match the card.
    • The range declares nothing breaking, so the changeset owes no ADR-0087 block. That differs from the last hop (major, five breaking entries); the dev reported the PM's assumption there as falsified, correctly.
  • Gates:
    • Local: the dev's 69 derived commands at b1a8a6bcf (--ran: 0 NOT-MEASURED). check:dual-build-cjs-loads re-ran green after the full build.
    • CI on b1a8a6bcf, read at this act: 38 runs. 23 success, 9 in progress, 0 failed.
    • The 6 skipped runs are all on the check-expected-skips.mjs roster, checked by hand: Console Pin Gate, Dogfood Verify CLI, Temporal Conformance, Dogfood Regression Gate, Build Docs, Packed-tarball smoke.
    • The landing waits for every check to be green.
  • Deviations accepted:
    • The branch was not synced with main before opening. GitHub reads it mergeable; main's 4 new commits touch none of the 4 paths; the queue rebuilds onto main.
    • No live browser pass, which the card did not ask for.
  • Cross-lane: PR feat(spec)!: a page declares nothing the console does not honour — isDefault only on a bound record page, a closed template set, regions its template places #23708 (domain:spec, draft) touches none of the pin paths at its head c2b9935b4c. Cross-lane note 6203574544 on spec: PageTypeSchema says home is "the platform-level landing page" and utility a "floating utility panel", but the landing is the first navigation item and both types render as ordinary inline pages #23610 stands: the later of the two hops re-runs scripts/bump-objectui.sh on its own base.
  • Out of scope: the dev found no liveness verdict this hop makes stale. The previous hop's stale rows stay with spec liveness: the console pin hop to objectui 1f23d5b070fa makes page.print and translation.flows.successMessage / errorMessage read planned while the shipped console applies them (family card; the parentDataSource leg is #23585) #23710.
  • Landing: once every check on the current head is green, the seat readies this PR and arms auto-merge through the relay, then confirms MERGED on origin/main.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 15, 2026 23:40
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 15, 2026 23:40
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 15, 2026
Merged via the queue into main with commit 140238a Oct 16, 2026
41 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-23720-console-pin-hop branch October 16, 2026 00:07
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

2 participants