Skip to content

docs: re-derive the os compile / os validate transcripts from real runs - #9151

Merged
os-steve merged 1 commit into
mainfrom
claude/issue-9092-cli-transcript-drift
Aug 16, 2026
Merged

docs: re-derive the os compile / os validate transcripts from real runs#9151
os-steve merged 1 commit into
mainfrom
claude/issue-9092-cli-transcript-drift

Conversation

@os-steve

Copy link
Copy Markdown
Collaborator

Fixes#9092

#4409 collapsed the per-concern authoring checks into one registry, so the three
authoring commands print one step for the whole table. Two sample transcripts still
reproduced the pre-#4409 step list. Both blocks are re-derived from real runs, not
hand-edited — retired steps are replaced by what a run actually emits, never deleted,
because a transcript is a reproduction of program output and deleting lines manufactures
output just as surely as leaving stale ones does.

How the transcripts were produced

CLI built from this branch, then run against two real projects:

blockprojectcommand
cli.mdx · os compilethe blank starter scaffolded from packages/create-objectstack/src/templates/blanknode packages/cli/bin/run.js compile
build-with-claude-code.mdx · os validatea Support Desk rebuilt from this page's own step-3 listings (object + action + views + a Support-nav app)node packages/cli/bin/run.js validate

The failing run is reproducible rather than remembered: the fixture carries the page's own
bare-reference predicate, visible: 'status != "resolved"', on resolve_ticket. Flipping
that one string to record.status != "resolved" && record.status != "closed" turns the
same fixture into the clean run — so both blocks on that page come from one project in two
states, which is exactly what the page narrates.

Cross-checked against the sources afterwards, never derived from them: validate.ts has
five printStep calls and compile.ts has twelve, several conditional. Grepping
printStep would have produced a transcript no run emits — the same defect this card
exists to fix, reached from the opposite direction.

What changed

cli.mdx · os compile — five retired step lines replaced by the two a run prints:

 → Validating protocol compliance...
- → Validating expressions (ADR-0032)...- → Checking dashboard widget bindings (ADR-0021)...- → Checking dashboard action references (ADR-0049)...- → Checking SDUI styling (ADR-0065)...- → Checking security posture (ADR-0090 D7)...+ → Running author-time rules (41)...+ → Checking capability providers (#3366)...
→ Collecting package docs (ADR-0046)...

build-with-claude-code.mdx · failing os validate — four defects, one more than the
card listed:

  1. → Validating expressions (ADR-0032)...→ Running author-time rules (41)...
  2. ✗ Expression validation failed (1 issue)✗ Author-time rules failed (1 issue)
  3. the rule: expression-invalid at ... trailer was missing entirely — added
  4. ✗ EEXIT: 1 is not emitted at all and was removed. Not in the card. Verified both
    piped and under a real TTY; isExitSignal in packages/cli/src/utils/format.ts:131
    is what swallows it, and migrate/meta.ts:533 carries a comment about suppressing
    exactly this line. The ✗ Author-time rules failed header already carries the failure
    signal, and the run still exits 1.

build-with-claude-code.mdx · clean os validate — the blank line validate.ts:297
prints unconditionally between the manifest line and the stats.

Two measurements that correct the card

The source: line is correct and was kept. The card predicted findings now carry "a
hint line and a trailer ... rather than a source: line". Measured: source:is
this rule's hint, so it survives verbatim; what was missing is the rule: ... at ...
trailer underneath it. Had the card's reading been applied literally, a correct line
would have been deleted.

The missing blank line exists on one page, not two. The card and the dispatch both
scope it to "both pages". On cli.mdx both candidate blocks already have it —
os compile prints ✓ Build complete then a blank line then Data:, and os info
already has the blank line after Type: app. Only build-with-claude-code.mdx was
missing it. The instruction stands; one of its two targets did not exist.

Sweep of the other os * output examples on cli.mdx

Every transcript-shaped block on the page was enumerated and checked, not just the one the
card named. os info was re-run and its structure matches a real run line for line
no drift, no change needed. The os migrate plan, database-in-use, and os login --json
blocks carry no step list and are unaffected by the registry collapse. So os compile was
the only block on the page with real drift.

What was deliberately NOT changed, and why

The stats lines and timings. Every line I changed is a project-independent fact about
the CLI, provable from any run. The stats lines are fixture identity, and this page's
Support Desk cannot be reconstructed exactly — the page labels its own code listing "a
representative result" and shows 4 fields, while the transcript says 6. Pasting my
reconstruction's 1 Objects 4 Fields would have substituted my fixture's identity for
the page's and, worse, broken agreement with
content/docs/deployment/validating-metadata.mdx, which says 1 Objects 6 Fields, is
out of scope here, and was corrected by #9034 earlier today. Reverse-engineering two extra
fields to hit "6" would have been manufacturing. So the numbers are left, and the
discrepancy is filed rather than guessed at — see below.

Block boundaries. The failing block remains an excerpt starting at the first step line
(the Loading configuration / Config: / Load time: preamble was already elided before
this PR). Expanding it would have meant importing a Load time: value from elsewhere or
publishing my machine's, so the pre-existing boundary was kept.

The cross-reference this repairs

validating-metadata.mdx sends readers here "for the bare-reference example verbatim".
That word was load-bearing and false. The finding block now matches a real run, so it is
true again. The corrected block does not break the cross-reference in the other direction:
validating-metadata.mdx shows the same header vocabulary, the same registry step, the
same 41 count, and already has the blank line.

Volatility note (raised, not acted on)

Running author-time rules (41) encodes a live count that will go stale again — the same
class of defect as #9034. There is a way to make the block not encode it, but every option
changes the card's shape, so per the dispatch this is flagged rather than acted on
unilaterally.

Verification

Gate union re-run after the final commit, at 689551a31:

check:cross-package-test-inputs PASS
check:docs-audit-scope PASS
check:docs-redirects PASS
check:role-word PASS
check:nul-bytes PASS

The list was re-derived from the actual changed paths via
node scripts/pm/dispatch-gates.mjs, which named the same five as the dispatch — no
additions. Docs-only; no published package changes, hence skip-changeset.


Generated by Claude Code

…ns (#9092)
The three authoring commands collapsed their per-concern authoring checks into
one rule registry (#4409), so they now print a single step for the whole table.
Two sample transcripts still reproduced the pre-#4409 step list.
Both blocks are re-derived from real runs of the CLI built at this commit, not
hand-edited: retired steps are replaced by the steps a run actually emits rather
than deleted, since a transcript is a reproduction of program output.
cli.mdx, `os compile`: five retired step lines replaced by the two the registry
prints (`Running author-time rules (41)`, `Checking capability providers`).
build-with-claude-code.mdx, failing `os validate`: the retired expression step,
the `Expression validation failed` header (now `Author-time rules failed`), the
missing `rule: ... at ...` trailer, and a `EEXIT: 1` line the CLI no longer
emits at all -- `isExitSignal` in packages/cli/src/utils/format.ts swallows it.
build-with-claude-code.mdx, clean `os validate`: the blank line validate.ts
prints unconditionally between the manifest line and the stats.
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 16, 2026
@os-steveos-steve added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 16, 2026 — with Claude
@os-steve
os-steve marked this pull request as ready for review August 16, 2026 15:37
@os-steve
os-steve added this pull request to the merge queueAug 16, 2026
Merged via the queue into main with commit 852a710Aug 16, 2026
25 checks passed
@os-steve
os-steve deleted the claude/issue-9092-cli-transcript-drift branch August 16, 2026 15:46
os-steve added a commit that referenced this pull request Aug 17, 2026
…9152)
Both pages printed `Data: 1 Objects 6 Fields`, a line no run can emit: the
object count comes from a project whose starter object was deleted and the
field count from one where it was kept.
Measured against the CLI built at origin/main, scaffolding `support-desk` from
the `blank` template exactly as step 1 describes and applying the page's own
listings:
Data: 2 Objects 6 Fields
UI: 1 Apps 1 Views 1 Actions
Runtime: 3 plugins
`6 Fields` was right all along -- 2 from the scaffolded `note` object plus 4
from the page's ticket. `1 Objects` was the wrong number. Deleting the starter
object instead yields `1 Objects 4 Fields`; both variants were run.
Also makes the run reconstructible from the page: adds the Support-nav app
listing the prose already promises but never showed, and names the starter
`note` object the counts depend on. Timings are machine identity, not fixture
identity, and are left as #9151 left them.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XqDQYVU5smx29ts9pAErja
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Aug 17, 2026
…bjectstack-ai#9152) (objectstack-ai#9262)
Both pages printed `Data: 1 Objects 6 Fields`, a line no run can emit: the
object count comes from a project whose starter object was deleted and the
field count from one where it was kept.
Measured against the CLI built at origin/main, scaffolding `support-desk` from
the `blank` template exactly as step 1 describes and applying the page's own
listings:
Data: 2 Objects 6 Fields
UI: 1 Apps 1 Views 1 Actions
Runtime: 3 plugins
`6 Fields` was right all along -- 2 from the scaffolded `note` object plus 4
from the page's ticket. `1 Objects` was the wrong number. Deleting the starter
object instead yields `1 Objects 4 Fields`; both variants were run.
Also makes the run reconstructible from the page: adds the Support-nav app
listing the prose already promises but never showed, and names the starter
`note` object the counts depend on. Timings are machine identity, not fixture
identity, and are left as objectstack-ai#9151 left them.
Claude-Session: https://claude.ai/code/session_01XqDQYVU5smx29ts9pAErja
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
os-steve added a commit that referenced this pull request Aug 18, 2026
…scription drop (#9342)
#9263 makes `create-objectstack` drop the blank template's own
`manifest.description` at scaffold time, so no scaffolded project prints
"Minimal ObjectStack environment — a clean slate for building." any more. Three
pages still quoted it inside a scaffolded-project transcript.
Re-derived from real runs against the CLI built at origin/main (b2d9e04), not
hand-edited:
* `os validate`, Support Desk — scaffolded `support-desk` from the `blank`
template and applied build-with-claude-code.mdx's own listings (ticket
object, resolve action, ticket views, Support app). Confirms #9152's work
still reconstructs: the page's listings alone reproduce
`2 Objects 6 Fields` / `1 Apps 1 Views 1 Actions` / `3 plugins`, and
`Running author-time rules (41)`.
* `os info`, my-app — scaffolded `my-app` from the same template with the
ticket object, one view and one action (no app), reproducing
`1 Views 1 Actions` and both object rows verbatim.
Both printers guard on presence (`validate.ts:294`, `info.ts:64`), so the row
does not become empty or `undefined` — it disappears entirely, and the
surrounding rows are byte-identical to the run. Verified mechanically: each
edited block now matches its run line for line, modulo the config path and the
timings, which are machine identity and are left as #9151/#9262 left them.
`cli.mdx`'s manifest-configuration example still shows a `description:` key.
That is a hand-authored config, not a scaffolded-project transcript, and
`description` remains an authorable manifest field — only the scaffolder's
carry-over went away.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XqDQYVU5smx29ts9pAErja
os-steve pushed a commit that referenced this pull request Aug 18, 2026
…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
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.

docs: two sample transcripts still print the pre-#4409 per-concern step list that the author-time rule registry collapsed into one line

2 participants

@os-steve@claude