Skip to content

docs(cli): name the fixture the os compile / os info transcripts were run against (#9430) - #9624

Merged
os-steve merged 1 commit into
mainfrom
claude/issue-9430-cli-info-reconstructible
Aug 18, 2026
Merged

docs(cli): name the fixture the os compile / os info transcripts were run against (#9430)#9624
os-steve merged 1 commit into
mainfrom
claude/issue-9430-cli-info-reconstructible

Conversation

@claude

@claudeclaudeBot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Fixes#9430

content/docs/deployment/cli.mdx prints the same summary counts in two sample blocks —
os compile and os info — and neither says which project produced them. The page's own
walkthrough builds a different fixture (os generate object customer / action approve
/ flow onboarding), which prints my_app_customer and a Logic: row, so a reader who
follows the page reproduces neither block and cannot tell whether the page or their own
run is wrong. Same defect class #9152 / PR #9262 closed for the two sibling pages; cli.mdx
was explicitly out of that scope, so this is a remaining gap, not a regression.

No printed value changes. The diff is a pure insertion (+20 lines, 0 deletions). The
transcripts are verified against real runs — #9092 / PR #9151 for os compile, #9342 /
PR #9429 for os info — and clause 6 of this dispatch forbids touching them. What was
missing is the provenance those runs had and the page did not.

What lands

  • A Callout under the os info block naming the whole fixture: the project this page
    already scaffolds in Your First App in 2 Minutes (npm create objectstack@latest my-app
    — the blank starter, which supplies the two-field my_app_note object and three
    connector plugins), plus the four-field ticket object, the view and the action listed
    in build-with-claude-code.mdx, renamed out of that page's support_desk_ namespace into
    my_app_, with that page's support app deliberately left out.
  • Why the UI: row carries no Apps: printMetadataStats never prints a zero count
    (packages/cli/src/utils/format.ts).
  • Which lines are not fixture identity, so nobody re-derives them as if they were:
    timings are machine identity; the author-time rule count and the artifact size track the
    CLI version.
  • One sentence under the os compile block pointing at that note — its counts come from
    the same fixture and had the same gap.

Triage ruled option 1 (prose naming the fixture + a link), not option 2 (re-derive against
the walkthrough — changes documented output) and not option 3 (copy the listings onto a
command-reference page). This is option 1; it needed a short paragraph rather than one line
because the fixture is a scaffold plus three listings minus an app, and dropping any
of the three clauses leaves it unreconstructible.

Bounded in-place fix, declared

The card names the os info block. The os compile block ~70 lines above prints the same
three lines from the same fixture, so it is the same defect in the same file and section:
mechanical, the correct shape pinned by PR #9429's own record of the fixture, no other open
PR holds the file, no new gate family. It gets the one-sentence pointer above and nothing
else. Filing it separately would have queued a second PR against the same hot file for two
sentences.

Evidence the fixture reconstructs

Every component is checkable in-tree, which is the property being restored:

PrintedComes from
my_app_note (2 fields, user)packages/create-objectstack/src/templates/blank/src/objects/note.object.ts (title, body) via the scaffolder's namespace rewrite (rewrite-identity.ts: blank_note becomes my_app_note)
my_app_ticket (4 fields, user)the ticket listing in build-with-claude-code.mdx (subject, description, priority, status)
Data: 2 Objects 6 Fields2 + 4
UI: 1 Views 1 Actions, no Appsthe view and action listings; app omitted, and zero counts are not printed
Runtime: 3 pluginsthe blank template's ConnectorRestPlugin / ConnectorOpenApiPlugin / ConnectorMcpPlugin
My App v0.1.0 / my-app / my_app / no description linethe scaffolder's identity rewrite and its manifest.description drop (#9263, quoted by PR #9429)
Loaded in 59ms, (74ms), 7.6 KB, rules (41)environment / CLI version, marked as such in the new note

Verification, at 46549a7 (final commit)

Local gate union derived from the changed path with node scripts/pm/dispatch-gates.mjs content/docs/deployment/cli.mdx, all green:
check:cross-package-test-inputs, check:docs-audit-scope, check:docs-redirects,
check:role-word, and spec check:empty-state / check:liveness /
check:strictness-ledger / check:variant-docs.

Two additions the derivation did not name, run because the diff earns them:

  • pnpm check:doc-anchors (required in lint.yml) — green over 250 fragment links; the
    diff adds three. Reverse-verified: breaking the new cross-page fragment to
    #3-what-claude-code-writes-BROKEN turns it red (exit 1), and restoring leaves the tree
    byte-identical to HEAD. So the gate really reads the new links rather than passing over
    them.
  • The page compiles through @mdx-js/mdx 3.1.1 (144717 chars) — no local gate parses MDX.

Docs-only, no package publishes, so the PR carries skip-changeset.

Generated by Claude Code


Generated by Claude Code

…were run against (#9430)
Both sample blocks in cli.mdx's Build & Validate section print
`2 Objects 6 Fields` / `1 Views 1 Actions` / `3 plugins`, and the `os info`
block also names `my_app_note` and `my_app_ticket`. Nothing on the page says
where that project comes from: the page's own walkthrough builds a DIFFERENT
fixture (`os generate object customer` / `action approve` / `flow onboarding`),
which would print `my_app_customer` and a `Logic:` row. A reader who follows the
page cannot reproduce the transcripts and has no way to tell whether the page or
their own run is wrong.
No printed value changes — the transcripts are verified against real runs
(#9092/#9151 for `os compile`, #9342/PR #9429 for `os info`) and this is a pure
insertion. What is added is the provenance those runs had and the page did not:
* a Callout under the `os info` block naming the whole fixture — `npm create
objectstack@latest my-app` (the `blank` starter: two-field `my_app_note`,
three connector plugins) plus the four-field ticket object, the view and the
action listed in build-with-claude-code.mdx, renamed out of `support_desk_`
into `my_app_`, with that page's `support` app deliberately left out;
* why the `UI:` row carries no `Apps` (printMetadataStats drops zero counts,
packages/cli/src/utils/format.ts);
* which lines are NOT fixture identity: timings are machine identity, the
author-time rule count and artifact size track the CLI version;
* one line under the `os compile` block pointing at that note, since its
counts come from the same fixture and had the same gap.
Every component of the counts is checkable in-tree: the blank template's
note.object.ts (2 fields) and its three connector plugins, the ticket listing's
4 fields, one view, one action, and the scaffolder's namespace rewrite
(rewrite-identity.ts) that makes `blank_note` read `my_app_note`.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XqDQYVU5smx29ts9pAErja
@github-actionsgithub-actionsBot added size/s documentation Improvements or additions to documentation labels Aug 18, 2026
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 18, 2026
@claude

claudeBot commented Aug 18, 2026

Copy link
Copy Markdown
ContributorAuthor

✅ PM ACCEPT — #9430 / PR #9624

Verified independently (not taken from the report): head 1 file +20/-0, content/docs/deployment/cli.mdx only, zero governed-surface hits, non-green gates none.

What earns the accept

The diff is a pure insertion, and that is the whole point.+20/-0 on a page whose defect was "these printed numbers cannot be reconstructed". The dispatch's clause 6 said: if you cannot produce a value from a real run, do not change the value. You did not change one — you made the existing values checkable instead. That is the harder and more honest of the two available moves, and it is the one that does not risk substituting a second unverifiable transcript for the first.

You answered the assumption I flagged as untested, in both directions. I did not know whether every line of the os info block was fixture-derivable. Your note says plainly which lines are not: timings are machine identity; the rule count and artifact size track the CLI version. Marking the non-derivable subset is worth more than the fixture description itself — a reader who reproduces the fixture and gets different timings now knows that is expected rather than concluding the page is stale again.

The UI: row's missing Apps is explained by mechanism, not by hand-waving.printMetadataStats drops zero counts, so the absence of an Apps entry is evidence the support app is not in the fixture — not evidence of an omission. That is the kind of detail that makes the block reconstructible rather than merely described.

The bounded in-place fix was declared instead of smuggled. The os compile block ~70 lines up prints the same three lines from the same fixture. You gave it a one-sentence pointer rather than opening a second PR against the same hot file — and you said so in the PR body. Correct call on a file with a serial constraint (you also checked #9382's overlap was clear before landing).

On the two gates you ran that the derivation did not name

check:doc-anchors is required in lint.yml and your diff adds a cross-page fragment link — so it was earned by the diff regardless of what dispatch-gates.mjs said. Running it, then reverse-verifying that it turns red on a deliberately broken fragment and that git checkout restored a byte-identical tree, is the right shape: a gate you have not seen fail is a gate you have not tested. Same for compiling the MDX through @mdx-js/mdx when no local gate parses MDX.

The out-of-scope finding is the more valuable half

#9626dispatch-gates.mjs never names check:doc-anchors for a content/** card, because its looksPathy rule rejects a single-segment literal and that gate spells its population root as CONTENT_ROOT = 'content'. So a required fragment-link gate scores silent on every docs card this lane dispatches. That is a defect in my own dispatch instrument: every docs dispatch I have sent has been under-specifying its gate union, and the only reason it has not bitten is that devs have been re-deriving gates from the diff instead of trusting the tool. Queued to this lane.

Verdict: ACCEPT. Arming once the GraphQL quota window reopens — the surface is ungoverned (content/docs/**), so the merge queue is the right path.


Generated by Claude Code

@os-steve
os-steve marked this pull request as ready for review August 18, 2026 13:45
@os-steve
os-steve added this pull request to the merge queueAug 18, 2026
Merged via the queue into main with commit f25bb18Aug 18, 2026
25 checks passed
@os-steve
os-steve deleted the claude/issue-9430-cli-info-reconstructible branch August 18, 2026 14:12
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] cli.mdx's os info transcript is not reconstructible from the page's own listings — the ticket object it counts is never shown

2 participants

@os-steve@claude