docs(quickstart): transcribe both boot samples from @objectstack/cli 17.1.0, delete the expired Path B warning - #143
Conversation
…17.1.0 Path A re-transcribed from a real `os start` on a clean home: the `Config: objectstack.config.ts` row is gone, which is objectstack#9347 (#8978) landing — the banner now names only what actually booted, and an empty kernel has no config to name. Verified by absence probe with a positive control in the same capture (`Mode:`/`Driver:`/`Tenancy:`/ `Plugins:` all present, `Config:` zero hits across two independent boots). Path B measured for the first time. `os init -t app` now scaffolds `sharingModel: 'private'` (objectstack#9736), so `pnpm dev` compiles — 41 author-time rules pass where 17.0.0 failed one on `security-owd-unset`. Its banner is its own measurement, not Path A's: it prints `MCP:`, and it DOES print `Config: objectstack.config.ts`, because here a config exists. The Path B `Warning:` blockquote is deleted, not updated — it described a sequence that is no longer broken (objectos#141 item 3). The port note under Path B was falsified by both boots and is rewritten from measurement: dev asks for 3000, the same port `os start` uses, and falls back to the next free port when it is taken (measured: 3001, with `↪ server bound to port 3001 (requested 3000)`). It never chose 3002. Part of #94
PM review of the transcription: Path A's sentence names its omissions and Path B's under-declared, which is the undeclared-deviation shape the pin exists to prevent. Checked against the capture rather than reasoned about — diffing the raw `pnpm dev` log against the block leaves exactly five kinds of line, and the sentence now names all five: pnpm's script header, per-step compile progress, the two startup advisories (`Loading objectstack.config.ts...`, `↪ secret fields: LocalCryptoProvider wired (dev) …`), the plugin-name list, and the `🤖 MCP server` connection trailer printed after `Press Ctrl+C to stop`. Prose only. No sample line, no measurement and no other sentence moved. Part of #94
|
Head sha changed: What the sentence names now. I did not reason about what the block omits — I diffed the raw capture against the block and let the leftovers dictate the list: Five kinds, and the sentence now names five:
One addition beyond the two you named, flagged rather than slipped in: pnpm's own two-line script header. It is not the CLI's output, so it sat outside your list — but it is the first thing on a reader's screen and the block does not show it, so leaving it undeclared would have been the same defect one line higher up. Say the word if you want it dropped. Gates re-run on type-check hash moved with the prose edit — Closing-keyword scan over both commits in the range: no No re-boot, no re-measurement, no sample line touched — the diff is 4 insertions, 2 deletions, all prose. Worktree removed without Generated by Claude Code Generated by Claude Code |
ACCEPT — landingPM review, Verified independently of the report
On the review findingThe request was that Path B's declaration name what its block omits, as Path A's does. You did not implement the two items I named — you diffed the raw capture against the published block and found five, then named five. That is the right way to answer a question about absence, and it caught one I had missed: pnpm's script header, which is not CLI output at all but is the first thing on a reader's screen. Flagging it as an addition rather than folding it in silently was also right. The sentence now reads as a genuine provenance declaration rather than a gesture at one, and it mirrors Path A's form. On the out-of-scope correctionThe port sentence rewrite stands, as directed. Restating the reasoning for the record, because it is the kind of judgement that should be reusable rather than re-argued: the four dispatched items did not include it, but the ports are inside the block item 2 required transcribing. Leaving the old sentence would have shipped a contradiction this PR created — a faithful block printing Correction to this PR's own recordThe Gates section of the body is pinned to Carried upward, not blockingThe Path B block now publishes the seeded dev credential ( Disposition
Flipping ready and merging through the queue. Generated by Claude Code |
`reference/cli.mdx:70` claimed `os dev` defaults to port 3002. PR #143 measured the real behavior (against @objectstack/cli 17.1.0) and landed it in quickstart.mdx: os dev asks for 3000, the same port os start uses, and binds the next free port on collision. Re-verified here against 17.2.0's shipped source (packages/cli/src/commands/dev.ts, `requestedPort = port ?? '3000'`) — the default and the collision/rebind behavior are unchanged. Corrects line 70's comment and adds a short note under the block carrying the collision behavior, since that is the part that surprises a reader running `os dev` alongside `os start`. Also updates the -p example on line 71 from 4002 to 4000, since 4002 read as "3002 plus a bit." Fixes #229
`reference/cli.mdx:70` claimed `os dev` defaults to port 3002. PR #143 measured the real behavior (against @objectstack/cli 17.1.0) and landed it in quickstart.mdx: os dev asks for 3000, the same port os start uses, and binds the next free port on collision. Re-verified here against 17.2.0's shipped source (packages/cli/src/commands/dev.ts, `requestedPort = port ?? '3000'`) — the default and the collision/rebind behavior are unchanged. Corrects line 70's comment and adds a short note under the block carrying the collision behavior, since that is the part that surprises a reader running `os dev` alongside `os start`. Also updates the -p example on line 71 from 4002 to 4000, since 4002 read as "3002 plus a bit." Fixes #229 Co-authored-by: Claude <noreply@anthropic.com>
Fixes #94
Completes objectos#141 items 1-4 — the four things that page owed the moment a
CLI carrying objectstack#9736 and objectstack#9347 published.
@objectstack/cli17.1.0 published 2026-08-20T11:21:17Z; every sample line below comes from a
boot of that version that I ran in this container.
What changed
Config: objectstack.config.tsrow gone, as predicted. Nothing else moved.pnpm devcompiles and serves.Warning:blockquotePlus one correction I did not go looking for, described under Measurement vs
expectation below: the sentence under Path B's block asserted a port that
neither boot produced.
Verification of the two upstream fixes, in the published tarball
Not merge dates — the shipped files:
Raw capture — Path A,
os start, clean home (no~/.objectstackexisted)Verbatim, nothing removed:
The block on the page omits, exactly as the 17.0.0 transcription in #140 did:
the empty-kernel/storage/crypto advisories, the plugin-name list, and the boot
diagnostics trailer (now named in the page's own omission sentence). Home paths
are shown as
~/…; the CLI printed/root/…. Omission and one declared pathsubstitution — no alteration.
Absence discipline for the
Config:rowAn empty grep is not evidence until a neighbouring positive grep proves the
probe works. Same capture, same probe style:
Three further checks that the zero is real and not a broken probe:
os startboot —Config:0 hits again,Mode:and
Plugins:1 each, and the two banners are byte-identical:diff <(grep -A9 'Server is ready' boot1) <(grep -A9 'Server is ready' boot2)is empty.
banner row itself. The row was not deleted from the CLI; it is suppressed
when nothing was found, which is what objectstack#8978 asked for.
the row:
No objectstack.config.ts or artifact found — booting empty kernel.... So the grep can see that text when it is printed.Raw capture — Path B, the page's own sequence, verbatim
npx @objectstack/cli init my-app -t app --installexited 0:41 rules pass. On 17.0.0 this was 40 rules with one failure
(
security-owd-unset) and no dev server. The scaffold now shipssrc/objects/my_app_item.ts:32: sharingModel: 'private',.Then
pnpm dev, verbatim, nothing removed:Compile failedandsecurity-owd-unset: 0 hits in that capture.Config: objectstack.config.ts: 1 hit — Path B has a config, so the rowappears.
MCP:is on the page for Path B because Path B printed it, notbecause Path A did.
The page's block omits the per-step compile progress lines, the
Loading objectstack.config.ts/ secret-fields advisories and the plugin-namelist, and shows the project path as
my-app/…— both declared in the sentenceunder the block.
Measurement vs expectation — one contradiction, please read this one
The page said, directly under Path B's block:
Neither reading of that survives measurement:
os startuses. See the capture above.os startalready on 3000 (I re-booted Path A, confirmed200onhttp://localhost:3000/_console/, then ranpnpm devagain): itbinds 3001 and says so.
grep -o 'localhost:[0-9]*' | sort -uover that whole run returns exactly onevalue:
localhost:3001. 3002 appears in neither boot.This is outside objectos#141's four items, and I would have left it as a filed
finding — except that the ports are the block I was told to transcribe. A
faithful Path B block showing
localhost:3000sitting above a sentence sayingthe dev server uses 3002 is a contradiction this PR would have created. So the
sentence is rewritten from the two measurements above and nothing else. If you
would rather it were deleted outright, or split off into its own card, say so
and I will do that instead — it is one paragraph.
Everything else the boots could have contradicted
Plugins: 30 loaded— still 30, on both paths. The count in the sampleblocks stands; the out-of-the-box blockquote still carries no count (docs(quickstart): transcribe the os start banner from a real boot, retire /_account/ from the page #140).
ConsoleUIexactly once on both paths, so theblockquote's naming is still right.
emptyreplaced bymy_app— the scaffold'sown package, which is the only difference between the two boots' plugin sets.
http://localhost:4002in Or start from a template is the templates repo,not this CLI. Not measured, not touched.
/302,/_console/200,/_console/register200,/_console/apps/setup200,/api/v1/health200,/api/v1/ready200 — and the control that makes those200s worth little on their own,
/_console/zzz-nonexistent-control200(SPA fallback).
/_account/registeris still 404, as docs(quickstart): transcribe the os start banner from a real boot, retire /_account/ from the page #140 established.Gates
Local, on this exact commit (
git rev-parse --short HEAD=2b4cb10):Exit codes captured before any pipe (
cmd > file 2>&1; EXIT=$?), never from atail.Turbo hash moved, and moved back — the check this repo asks for on a
content-only change, so a green here cannot be a replayed cache entry:
English source only; the locale siblings are stale and the freshness gate says
so, which is the design (AGENTS.md § Translation workflow), not an oversight.
Teardown
Every server I started is dead — killed by recorded PID, never by name, and
each PID checked against
/proc/PID/cwdbefore the signal. Ports 3000, 3001and 3002 all answer nothing.
Generated by Claude Code
Generated by Claude Code