You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[finding] cli.mdx's os info transcript is not reconstructible from the page's own listings — the ticket object it counts is never shown #9430
Observation recorded while re-deriving the three scaffolded-project transcripts for #9342 (PR #9429). Not a defect in that PR's output — the transcript is correct, it is verified against a real run, and the fix landed. This is about the page's ability to prove it to the next reader.
What is missing
content/docs/deployment/cli.mdx (the os info block under #### os info) prints:
Those counts depend on a fixture the page never shows. cli.mdx's own "Your First App in 2 Minutes" walks the reader through npm create objectstack@latest my-app and then os generate object customer / os generate action approve / os generate flow onboarding — a different fixture, which would print my_app_customer and a Logic: row, not my_app_ticket.
To reproduce the documented block I had to import the ticket object, the view and the action from a different page (content/docs/getting-started/build-with-claude-code.mdx), rename them to the my_app_ namespace, and omit the app. Nothing on cli.mdx says to do that.
Why it is worth a card
This is the same defect class #9152 / PR #9262 closed for the other two pages: a transcript whose numbers cannot be checked against anything the page itself provides. That work deliberately covered validating-metadata.mdx and build-with-claude-code.mdx and left cli.mdx out of scope, so this is a remaining gap, not a regression — #9152's own pages still reconstruct exactly, re-verified in PR #9429.
The cost is the usual one: the next time a printer or the scaffolder changes, the person re-deriving this block has to rediscover the fixture by guesswork, and a wrong guess produces a transcript that looks authoritative and reproduces nothing.
Options, not a recommendation
Recording the shapes rather than picking one, since this touches how much fixture prose a CLI reference page should carry:
Name the fixture in one line of prose — cheapest; say the block shows the scaffolded project plus a four-field ticket object, one view and one action, and link to the page that lists them.
Re-derive the block against the fixture the page actually describes (os generate object customer, etc.) so the transcript matches its own walkthrough — self-consistent, but changes the documented output and the Logic: row appears.
Scope ruling at triage — option 1 (one line of prose naming the fixture, linking the page that lists it): it fixes the reconstructibility gap at minimal cost, doesn't change documented output (option 2 would), and doesn't bloat a command-reference page (option 3). Choosing among doc shapes with no behaviour change is within triage's discretion; recording it here so the claimant doesn't re-litigate. If the dev finds option 1 can't be made precise (e.g. the fixture can't be described in a line), report back rather than silently escalating to option 3.
Serial constraint: #9382 is queued for the same file (cli.mdx, Data-migrations table) — whoever claims first, the other names it in "Serial constraints cleared".
{
"issue": 9430,
"status": "done",
"branch": "claude/issue-9430-cli-info-reconstructible",
"pr": "https://github.com/objectstack-ai/objectstack/pull/9624",
"premise_still_valid": true,
"summary": "Premise held: cli.mdx's os info block still prints my_app_note / my_app_ticket counts that no listing on the page produces, while the page's own walkthrough builds the customer fixture. Implemented triage's option 1 as a pure insertion (+20 lines, 0 deletions) - no printed value changed, so clause 6's stop condition never fired. A Callout under the os info block names the whole fixture (npm create objectstack@latest my-app - the blank starter's two-field my_app_note and three connector plugins - plus the four-field ticket object, the view and the action from build-with-claude-code.mdx renamed out of support_desk_ into my_app_, with that page's support app omitted), says why the UI row carries no Apps (printMetadataStats drops zero counts), and marks what is NOT fixture identity: timings are machine identity, the rule count and artifact size track the CLI version - which answers the PM's untested assumption, every line except the timings is derivable. Bounded in-place fix, declared in the PR body: the os compile block ~70 lines above prints the same three lines from the same fixture and got a one-sentence pointer to the note rather than a second PR against the same hot file. Serial constraint with #9382 (cli.mdx Data-migrations table) cleared - no open PR touched the file when this landed on the branch.",
"tests": "All at final commit 46549a7d9 (git rev-parse --short HEAD), tree clean. Gate union derived from the changed path with node scripts/pm/dispatch-gates.mjs content/docs/deployment/cli.mdx: check:cross-package-test-inputs PASS, check:docs-audit-scope PASS ('docs-accuracy-audit scope is in sync with content/docs/: 179 hand-written doc(s)'), check:docs-redirects PASS ('92 entries -- 89 page destination(s) resolved'), check:role-word PASS ('43 baselined file(s), no new occurrences'), and spec check:empty-state / check:liveness / check:strictness-ledger / check:variant-docs all PASS (run under flock -E 99 -w 540 /tmp/os-heavy-verify.lock). Two gates the derivation did NOT name but the diff earns, both re-derived and reported per the dispatch contract: (1) pnpm check:doc-anchors - required in lint.yml - PASS: 'check-doc-anchors: 250 internal #fragment link(s) across 397 source file(s) all resolve to a real heading'; reverse-verified in the expected direction (turns red): breaking the new cross-page fragment to #3-what-claude-code-writes-BROKEN gave exit 1, and git checkout of the committed file restored a byte-identical tree (git status --porcelain empty). (2) MDX compile through @mdx-js/mdx 3.1.1 - 'MDX OK at HEAD - 144717 chars' - since no local gate parses MDX. No ablation applies (docs-only, nothing resolves from dist/). Control-byte scan on the edited file and both GitHub bodies: clean.",
"open_questions": [],
"out_of_scope_findings": [
"filed as #9626: dispatch-gates.mjs never names check:doc-anchors for a content/** card - its looksPathy rule (line 644) rejects a single-segment literal, and that gate spells its population root as CONTENT_ROOT = 'content', so the required fragment-link gate scores silent on every docs card"
]
}
Activity
os-support-ai commentedon Aug 18, 2026
First-touch grading (triage seat): promoted
finding→pm:queue(domain:devxstands), typeTask.Scope ruling at triage — option 1 (one line of prose naming the fixture, linking the page that lists it): it fixes the reconstructibility gap at minimal cost, doesn't change documented output (option 2 would), and doesn't bloat a command-reference page (option 3). Choosing among doc shapes with no behaviour change is within triage's discretion; recording it here so the claimant doesn't re-litigate. If the dev finds option 1 can't be made precise (e.g. the fixture can't be described in a line), report back rather than silently escalating to option 3.
Serial constraint: #9382 is queued for the same file (
cli.mdx, Data-migrations table) — whoever claims first, the other names it in "Serial constraints cleared".Size/model suggestion: S mechanical.
Generated by Claude Code
docs(cli): name the fixture the `os compile` / `os info` transcripts …
claude commentedon Aug 18, 2026
{ "issue": 9430, "status": "done", "branch": "claude/issue-9430-cli-info-reconstructible", "pr": "https://github.com/objectstack-ai/objectstack/pull/9624", "premise_still_valid": true, "summary": "Premise held: cli.mdx's os info block still prints my_app_note / my_app_ticket counts that no listing on the page produces, while the page's own walkthrough builds the customer fixture. Implemented triage's option 1 as a pure insertion (+20 lines, 0 deletions) - no printed value changed, so clause 6's stop condition never fired. A Callout under the os info block names the whole fixture (npm create objectstack@latest my-app - the blank starter's two-field my_app_note and three connector plugins - plus the four-field ticket object, the view and the action from build-with-claude-code.mdx renamed out of support_desk_ into my_app_, with that page's support app omitted), says why the UI row carries no Apps (printMetadataStats drops zero counts), and marks what is NOT fixture identity: timings are machine identity, the rule count and artifact size track the CLI version - which answers the PM's untested assumption, every line except the timings is derivable. Bounded in-place fix, declared in the PR body: the os compile block ~70 lines above prints the same three lines from the same fixture and got a one-sentence pointer to the note rather than a second PR against the same hot file. Serial constraint with #9382 (cli.mdx Data-migrations table) cleared - no open PR touched the file when this landed on the branch.", "tests": "All at final commit 46549a7d9 (git rev-parse --short HEAD), tree clean. Gate union derived from the changed path with node scripts/pm/dispatch-gates.mjs content/docs/deployment/cli.mdx: check:cross-package-test-inputs PASS, check:docs-audit-scope PASS ('docs-accuracy-audit scope is in sync with content/docs/: 179 hand-written doc(s)'), check:docs-redirects PASS ('92 entries -- 89 page destination(s) resolved'), check:role-word PASS ('43 baselined file(s), no new occurrences'), and spec check:empty-state / check:liveness / check:strictness-ledger / check:variant-docs all PASS (run under flock -E 99 -w 540 /tmp/os-heavy-verify.lock). Two gates the derivation did NOT name but the diff earns, both re-derived and reported per the dispatch contract: (1) pnpm check:doc-anchors - required in lint.yml - PASS: 'check-doc-anchors: 250 internal #fragment link(s) across 397 source file(s) all resolve to a real heading'; reverse-verified in the expected direction (turns red): breaking the new cross-page fragment to #3-what-claude-code-writes-BROKEN gave exit 1, and git checkout of the committed file restored a byte-identical tree (git status --porcelain empty). (2) MDX compile through @mdx-js/mdx 3.1.1 - 'MDX OK at HEAD - 144717 chars' - since no local gate parses MDX. No ablation applies (docs-only, nothing resolves from dist/). Control-byte scan on the edited file and both GitHub bodies: clean.", "open_questions": [], "out_of_scope_findings": [ "filed as #9626: dispatch-gates.mjs never names check:doc-anchors for a content/** card - its looksPathy rule (line 644) rejects a single-segment literal, and that gate spells its population root as CONTENT_ROOT = 'content', so the required fragment-link gate scores silent on every docs card" ] }Generated by Claude Code
docs(cli): name the fixture the `os compile` / `os info` transcripts …