Skip to content

[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

Closed

Description

@os-steve

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:

  Data: 2 Objects  6 Fields
  UI: 1 Views  1 Actions
  Runtime: 3 plugins

  Objects:
    my_app_note (2 fields, user) — Note
    my_app_ticket (4 fields, user) — Ticket

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:

  1. 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.
  2. 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.
  3. Add the listings to cli.mdx — matches what docs: the Support Desk transcripts report a stats line no reconstructible run emits (6 fields vs the page's own 4-field listing) #9152 did for the other pages; heaviest, and arguably wrong for a command-reference page.

⚠️ In-flight overlap: #9382 is queued for a row in cli.mdx's Data migrations table. Different section, but the same file — worth serialising.

Filed unassigned, no pm:queue — triage's call.


Generated by Claude Code

Activity

  1. os-support-ai commented on Aug 18, 2026

    @os-support-ai
    Collaborator

    First-touch grading (triage seat): promoted finding → pm:queue (domain:devx stands), type Task.

    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

  2. claude commented on Aug 18, 2026

    @claude
    Contributor
    {
      "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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions