Repository navigation
Commit 140238a
chore(objectui): move the console pin to f96f771, carrying objectstack-ai/objectui#12453 and objectstack-ai/objectui#12519 (#23738)
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...f96f771`: `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 f96f771` 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`
- When the work started (2026-10-15T22:30Z), `f96f771140f1` was objectui
`main`'s tip, the commit the dispatch read.
- At that reading every check-run of objectui's required set read
`completed: success`, 41 of 41 across its merge-queue and push runs:
`Lint` 2, `Type Check` 2, `Test (shard N/16)` 32, `Build & E2E` 2,
`Build Docs` 2, `Changeset Declaration` 1. objectui's `main` ruleset
(`GET /repos/objectstack-ai/objectui/rules/branches/main`) also requires
`Test` and `Governed Surface Queue Guard`, and both read success. The
only run still going was `Test (coverage shard 2/8)`, which is not in
the required set.
- Re-read at 23:05Z, before opening this PR: objectui `main` had moved 4
commits, to `3e09c1e8d`, whose required set was still running (32
success, 11 in progress). The 4 are `7066dae53` (a docs move),
`830eb1f2d` (objectstack-ai/objectui#12522), `f23eb01cb`
(objectstack-ai/objectui#12514) and `3e09c1e8d`
(objectstack-ai/objectui#12510). The card's "Not this card's" section
names those cards as riding a later hop and says this one does not wait
for them, so this PR keeps the pin read at dispatch time and does not
chase the tip.
## 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 f96f771…`.
- `@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
- **Liveness: no verdict this hop makes stale was found.** The method:
the leaf key of each of the 139 non-`live` rows in
`packages/spec/liveness/*.json`, grepped as a word over the range's 3610
added lines of non-test objectui source under `packages` and `apps`. The
only hits were `pageName`, a local route variable, and `bordered`, in a
comment. Neither reads the ledger's `view.list` keys.
- The rows the previous hop made stale (`page.print`,
`translation.flows.successMessage` and `errorMessage`) are still
`planned`, and the open family card #23710 carries them. This PR does
not change them.
- PR #23708 (`domain:spec` seat 2), which plans a later pin move,
touches none of `.objectui-sha`, the manifest pair, the lockstep record
or a console changeset: 29 files read at 23:05Z.
- objectstack-ai/objectui#12453 and objectstack-ai/objectui#12519 are
not cards in this repository. This PR carries their objectui changes
into the shipped console and leaves the objectui cards as they are.
---
_Generated by [Claude
Code](https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4t)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 2906cd8 commit 140238a
4 files changed
Lines changed: 47 additions & 6 deletions
File tree
- .changeset
- packages/sdui-parser
- scripts
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
| 1 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
9 | | - | |
10 | | - | |
| 9 | + | |
| 10 | + | |
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
24 | | - | |
| 24 | + | |
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | | - | |
| 14 | + | |
15 | 15 | | |
16 | | - | |
| 16 | + | |
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
| |||
0 commit comments