Skip to content

Commit 8a990d8

Browse files
docs: build the Console with pnpm console:build, not the retired objectui pin scripts (#26052)
<!-- claude-projects-attribution: {"github_login":"os-elon-musk"} --> _Requested by **Elon** · [project thread](https://claude.ai/code/project/chan_01WedDzV26nniwxv7jC88B9D?thread=cmsg_01WedDzV26nniwxv7jC88B9D5QXEJEkGv9hHj99t49Ab4t)_ Part of #26035 (slice 2: ungoverned docs). ## What changed The retired pin flow (`pnpm objectui:build`, `.objectui-sha`, `scripts/build-console.sh`, the `os dev` stamp-vs-pin refusal) is replaced by the in-workspace flow in five files. Re-measured on main `39ca5878` with `git grep -nE "objectui:(build|refresh|bump|clean)|build-console\.sh|\.objectui-sha"` over the slice surface: 22 hits in 6 files before, 0 in the 5 edited files after. | File | Change | |:--|:--| | `README.md` | "Hack on the framework" runs `pnpm console:build`; the paragraph says what it does (builds `ui/apps/console`, copies to `packages/console/dist`, nothing cloned or pinned, `pnpm build` builds the Console but does not copy it). Timing row re-measured (below). | | `content/docs/getting-started/examples.mdx` | Callout names `pnpm console:build`. | | `docs/screenshots/render-readme-demo.mjs` | Prerequisite comment names `pnpm console:build`. | | `docs/qa/platform-checklist/RUNNER.md` | Cold-tree trap, one-tree-at-a-time trap (the `OBJECTUI_DEPS_BUILD_CMD` override is gone; the fix is `pnpm console:build --concurrency=2`), the `stale-console-bundle` counter, and the run record (the `objectuiPin` env field is dropped: the console builds from the `framework` SHA). Trap names unchanged, so `check:platform-checklist` vocabulary holds. | | `docs/qa/studio-benchmark/SCENARIO.md` | The console row and the "record both SHAs" step: one SHA now, plus `pnpm console:build` before booting. | ## Verified, not recalled - `pnpm console:build` = `turbo run build:dist --filter=@objectstack/console`; `@objectstack/console#build:dist` depends on `@object-ui/console#build` (`turbo.json`), and `packages/console/build-dist.sh` copies `ui/apps/console/dist` to `packages/console/dist`. - Ran on a fresh worktree after `pnpm install` only: `NODE_OPTIONS=--max-old-space-size=6144 pnpm console:build --concurrency=2` → 72 tasks, 0 cached, 12 m 16 s, exit 0, `✓ @objectstack/console dist ready (80724 KB) from ui/apps/console`. Re-run: 72/72 cached, ~1 s. These are the README row's numbers. ## Left alone, and why - **ADR-0082 L198** is not edited. It sits in the "Where the line lives" list under the maintainer's 2026-08-07 decision, so it is part of a decision record, and `docs/adr/**` is governed surface: editing it would make this PR Tier H. The neighbouring L197 (`scripts/bump-objectui.sh`) is equally stale. Both belong with the governed slice. - **README `pnpm build` row** (6 m 54 s, 72 tasks) predates the ui/ import; `pnpm build` now builds the ui tree too, so that row is likely low. Not re-measured here (out of this slice's prescription surface); flagged for whoever next refreshes the table. - The pin-specific drift guard in `packages/cli/src/utils/console.ts` is slice 3. ## Gates `node scripts/pm/dispatch-gates.mjs --ran`: 42 derived, 42 run, 0 NOT-MEASURED, all exit 0 (`check:skill-examples` after building `@objectstack/client-react...`). No `docs:check-links` script exists on main. `skip-changeset`: repo-root docs, and `content/docs` ships only in the private `@objectstack/docs` app. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01JrWb13NvNX4Nnw76uBX95H Co-authored-by: Claude <noreply@anthropic.com>
1 parent b2971aa commit 8a990d8

5 files changed

Lines changed: 34 additions & 34 deletions

File tree

‎README.md‎

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -248,17 +248,18 @@ git clone https://github.com/objectstack-ai/objectstack.git
248248
cd objectstack
249249
pnpm install # Node 22+, pnpm 10 (corepack enable)
250250
pnpm build # build all packages
251-
pnpm objectui:build # build the Console SPA (not part of pnpm build)
251+
pnpm console:build # put the Console SPA in packages/console/dist
252252
pnpm dev # showcase example: REST + Console on :3000
253253
```
254254

255-
`pnpm objectui:build` builds [objectui](https://github.com/objectstack-ai/objectui)
256-
at the commit pinned in `.objectui-sha` into `packages/console/dist`
257-
(gitignored). It builds from a `../objectui` checkout if one sits next to this
258-
repo, otherwise from a shallow clone of objectui into `.cache/`; either way it
259-
installs objectui's dependencies, so it needs network. Skip it and `pnpm dev`
260-
still serves the REST API, without the Console. Rerun it when `.objectui-sha`
261-
moves.
255+
`pnpm console:build` builds the Console from its source in this workspace
256+
(`ui/apps/console`, against this tree's own spec and client) and copies the
257+
result into `packages/console/dist` (gitignored), which is where `pnpm dev`
258+
serves it from. Nothing is cloned or pinned. `pnpm build` builds the Console
259+
too but does not copy it, so after `pnpm build` this step is a copy. Skip it
260+
and `pnpm dev` still serves the REST API, without the Console. Rerun it after
261+
pulling changes under `ui/`: `packages/console/dist` is never refreshed on its
262+
own.
262263

263264
A first run is slow, not stuck. Measured once on a fresh clone of `main`
264265
(4-vCPU container, Node 22.22, pnpm 10.31):
@@ -267,7 +268,7 @@ A first run is slow, not stuck. Measured once on a fresh clone of `main`
267268
|:---|---:|:---|
268269
| `pnpm install` | 16 s | |
269270
| `pnpm build` | 6 m 54 s | 72 turbo tasks |
270-
| `pnpm objectui:build` | 10 m 36 s | clones objectui and builds the Console |
271+
| `pnpm console:build` | 12 m 16 s | 72 turbo tasks: the Console and what it depends on, run before any `pnpm build` (`--concurrency=2`); a cache hit plus a copy, about 1 s, once `pnpm build` has run |
271272
| `pnpm test` | 54 m 03 s | the full suite: 135 turbo tasks |
272273

273274
For your own change, test what it reaches instead of the full suite:

‎content/docs/getting-started/examples.mdx‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ Each script starts one example's dev server. `pnpm dev` is an alias for `pnpm de
6464
`pnpm install` alone leaves the workspace unbuilt. This is the same sequence
6565
`README.md` documents.
6666

67-
`pnpm build` still does not produce the Console SPA at `/_console/` — that is built
68-
separately by `pnpm objectui:build`.
67+
`pnpm build` still does not put the Console SPA served at `/_console/` in place —
68+
`pnpm console:build` does, copying it into `packages/console/dist`.
6969
</Callout>
7070

7171
---

‎docs/qa/platform-checklist/RUNNER.md‎

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -429,8 +429,8 @@ contradicts it, and correct it here when it does.
429429
them.
430430

431431
- **A cold tree cannot boot the app from the console-build recipe alone.**
432-
`pnpm objectui:build` runs `scripts/build-console.sh`, which builds the **console**, not
433-
the framework CLI. On a fresh tree `packages/cli` has no `dist`, and the bare binary
432+
`pnpm console:build` builds the **console** and the packages it depends on, not the
433+
framework CLI. On a fresh tree `packages/cli` has no `dist`, and the bare binary
434434
then answers `Error: command dev not found` (exit 2) — a message that names neither the
435435
cause nor the fix. **Check:** `node scripts/check-dev-prereqs.mjs`; it reports every
436436
package whose declared `dist/` entry point is missing, and exits non-zero. **Fix:
@@ -619,22 +619,22 @@ contradicts it, and correct it here when it does.
619619
passed at `bfc1539fe0`.
620620

621621
- **One container builds one tree at a time: never run `pnpm build` and
622-
`pnpm objectui:build` together, and give the heavy steps a concurrency the shell's memory
623-
can hold.** `pnpm objectui:build` (`scripts/build-console.sh`) runs `turbo run build` in
624-
THIS checkout as well — `@objectstack/spec` when its dist is absent or incomplete,
625-
`@objectstack/client`, and every `@objectstack/*` package the objectui pin overrides,
626-
declarations included — so a `pnpm build` beside it writes the same `packages/spec/dist`
627-
from a second turbo process nothing serialises, and the spec's DTS pass races (the 18.0
628-
sweep, #24579 §6). The shell's cgroup is capped near 13.4 GiB (`memory.limit_in_bytes`
629-
read `14343688192` on the cgroup `/proc/self/cgroup` names, at `bfc1539fe0`), and the
630-
console's dependency build is `turbo run build --filter=@object-ui/console^...` at turbo's
631-
default concurrency unless overridden. The 18.0 sweep's runner held both under that cap
622+
`pnpm console:build` together, and give the heavy steps a concurrency the shell's memory
623+
can hold.** `pnpm console:build` (`turbo run build:dist --filter=@objectstack/console`)
624+
runs `turbo run build` for `@object-ui/console` and everything it depends on in THIS
625+
checkout — `@objectstack/spec` and `@objectstack/client` among them, declarations
626+
included — so a `pnpm build` beside it writes the same `packages/spec/dist` from a second
627+
turbo process nothing serialises, and the spec's DTS pass races (the 18.0 sweep, #24579 §6,
628+
met it with the retired pin script, which built the same packages). The shell's cgroup is
629+
capped near 13.4 GiB (`memory.limit_in_bytes` read `14343688192` on the cgroup
630+
`/proc/self/cgroup` names, at `bfc1539fe0`), and the console build runs at turbo's default
631+
concurrency unless overridden. The 18.0 sweep's runner held both under that cap
632632
only at `--concurrency=2`, and the Tier 1 vitest pins only at `--maxWorkers=1`, and was
633633
killed with exit **137** otherwise (#24579 §6; QA run #24598's environment fingerprint
634634
records the settings that held; the OOM itself is not re-run here). **Fix:**
635-
`pnpm build --concurrency=2` first; then
636-
`OBJECTUI_DEPS_BUILD_CMD='pnpm exec turbo run build --concurrency=2 --filter=@object-ui/console^...' pnpm objectui:build`
637-
(the override the script's header documents); vitest one package at a time with
635+
`pnpm build --concurrency=2` first (it builds the console too); then
636+
`pnpm console:build --concurrency=2` (pnpm appends it to the turbo command), which after that
637+
build is a cache hit plus a copy; vitest one package at a time with
638638
`--maxWorkers=1`. ⛔ An exit 137 is the container's memory limit, not a failing test or a
639639
broken build — re-run narrower before reading anything into it.
640640

@@ -686,7 +686,7 @@ contradicts it, and correct it here when it does.
686686
| trap | what it fakes | counter |
687687
|---|---|---|
688688
| `hydration-race` | empty nav/list right after navigation | screenshot first; settle; then read DOM |
689-
| `stale-console-bundle` | UI bug already fixed upstream in objectui | check against objectui HMR console / fresh build (skill §2). `os dev` refuses to mount a console whose stamp ≠ the `.objectui-sha` pin, so a 404 `/_console/` reads "rebuild with `pnpm objectui:build`", never "console broken" |
689+
| `stale-console-bundle` | UI bug already fixed upstream in objectui | check against objectui HMR console / fresh build (skill §2). `packages/console/dist` is a gitignored copy that `pnpm build` never refreshes, so a console older than the tree, or a 404 `/_console/`, reads "rebuild with `pnpm console:build`", never "console broken" |
690690
| `stale-dist` | src edits with no runtime effect | rebuild package + restart before judging |
691691
| `automation-input` | dead buttons / empty submits caused by the driver | ref-targeted clicks; native setter + input/change events |
692692
| `shared-browser-tab` | drifting origin, foreign drafts | pin absolute origin; own port/DB (skill §0) |
@@ -736,8 +736,7 @@ The in-environment JSON scratch (RUNNER shape, never committed):
736736
"scope": "since:v17 + P0", // the filter that selected items
737737
"app": "showcase",
738738
"env": {
739-
"framework": "<commit sha>",
740-
"objectuiPin": "<.objectui-sha>", // stale-bundle honesty: record what the console was
739+
"framework": "<commit sha>", // also the console's source: it builds from ui/ in this tree
741740
"port": 3456, "db": "file:/tmp/<run>/data.db"
742741
},
743742
"runner": "<agent/session identifier>",

‎docs/qa/studio-benchmark/SCENARIO.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ Scoring rules live in [SCORING.md](./SCORING.md); the sheet a run fills in is
1313
|---|---|
1414
| app | `examples/app-showcase`, a **fresh** boot — empty database, nothing left from an earlier run |
1515
| boot | `OS_PORT=PORT pnpm -C ABS/examples/app-showcase exec objectstack dev --ui --seed-admin -p PORT -d file:/tmp/RUN/data.db` (the dogfood-verification §0 line; `OS_PORT` exported, not only `-p`) |
16-
| console | the vendored build at the `.objectui-sha` pin (`pnpm objectui:build`), served at `/_console/` — **never** an objectui HEAD dev server: the benchmark measures what users get |
16+
| console | the build of the same tree's `ui/apps/console` (`pnpm console:build`, into `packages/console/dist`), served at `/_console/` — **never** a console dev server: the benchmark measures what users get |
1717
| author | the seeded platform admin `admin@objectos.ai` / `admin123`, signed in through the form |
1818
| end user | a second identity minted by admin create (`POST /api/v1/auth/admin/create-user`, then `change-password`), or by invite + sign-up — a stock showcase refuses self-registration |
1919
| browser | Chromium at 1440×900 |
2020

21-
Record both SHAs before step 1: `git rev-parse HEAD` of the objectstack tree you booted, and the
22-
contents of `.objectui-sha` (cross-check `packages/console/dist/.objectui-sha` — `os dev` refuses
23-
to mount a console whose stamp differs).
21+
Record the SHA before step 1: `git rev-parse HEAD` of the objectstack tree you booted. The console
22+
builds from that same tree, so it has no SHA of its own; run `pnpm console:build` on that HEAD
23+
before booting, because `pnpm build` does not refresh `packages/console/dist`.
2424

2525
## The rules of the run
2626

‎docs/screenshots/render-readme-demo.mjs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
// node docs/screenshots/render-readme-demo.mjs --out <dir> # preview: GIF + every frame into <dir>, touch nothing committed
99
//
1010
// Prerequisites are the ones `pnpm dev` itself has, and it checks them itself:
11-
// a built workspace (`pnpm build`) and a built Console (`pnpm objectui:build`).
11+
// a built workspace (`pnpm build`) and a built Console (`pnpm console:build`).
1212
// Plus `ffmpeg` on PATH, which assembles the GIF.
1313
//
1414
// ## What it records — three beats and a closing frame

0 commit comments

Comments
 (0)