Re-quote studio serve, and split §6 so the flip does not promise a pip install - #115
Merged
Conversation
astro-mine-cli#38 corrected what `astro-mine studio serve` prints, and two guide pages quote that output. Both carried notes saying the quote was stale and pointing at the issue; merging the fix inverted them, so they are stale in the other direction until this lands. `guide/reference/cli.md` quotes the new output verbatim, including the exit status, and the surrounding prose now makes the point the example exists to make: a degraded verb owes you what is missing **and how to get it**, and naming the distribution is not enough on its own. The message failed that test twice in different ways -- an install hint that resolved to nothing (astro-mine-cli#19), then a true conclusion sitting on a false premise -- and both are worth keeping as the reason the current wording looks the way it does. `guide/tutorials/07` no longer says the tutorial is blocked. It is not: the surface exists and the last line of the message is a route in rather than a dead end. The `RM-DIST-03` reference goes with it -- the item closed on 2026-08-08, and telling a reader their unblock is coming in a finished roadmap item is the defect astro-mine-cli#38 fixed, restated. The `status-ok` marker comes out too; nothing on the page needs excusing now. Note for the record that the docs gate did **not** catch this, and could not: both quotes live in fenced blocks, which `scripts/check_docs.py` exempts on purpose so documentation can quote a program faithfully instead of being forced to misquote it. Verbatim output is only correct while it is verbatim, and keeping it so is a job for whoever changes the program. Both blocks were compared byte-for-byte against the command's real stderr before committing.
19 tasks
`VERSIONING.md` §6 bundled "repositories become public" with "publish the wheels to a public index" and "publish @astro-mine/* to npm" under one heading, and opened with "per current intent, no earlier than the end of Phase 2". Three problems, and the flip is the act that would have published all three. **The conflation.** Making the source public does not oblige us to publish distributions, and nothing prepares Trusted Publishing or npm releases. A reader landing on §6 the day after the flip would reasonably conclude both had happened. §6 now separates 6.1 visibility -- what the flip does, and what it unlocks: secret scanning and push protection (which the API refuses outright while private, not deferred by choice), free Actions minutes, and the external half of M1.2 -- from 6.2 publication, which the flip does not trigger and this document does not schedule. **The timing clause.** Retired. The flip is not gated on a phase boundary, on Actions capacity, or on publishing anything. The one hard precondition is the full-history secret scan, because the flip publishes every commit at once and a secret found afterwards is a disclosure rather than a rotation. **The stale bullet.** §6 listed the artifact-name migration as "deliberately gated here". Its reasoning -- a re-publish is cheaper while no outside consumer holds the old names -- is exactly why the migration ran *before* the flip rather than at it. That is now §6.3, recorded as done rather than pending, since the rule is enforced at `HubClient.publish` and there is nothing left to gate. Five downstream claims contradicted the rewritten section and are corrected with it, because leaving them is the defect this wave exists to close: `ui.md` and `roadmap/README.md` both had npm/PyPI publication "gated on the public flip"; `roadmap/README.md` also still listed the migration as deferred; `getting-started.md` and tutorial 01 told a reader to install from source "until the public flip", which promises something the flip will not deliver; and `personas.md` said the console's packages are private until the flip. The gate is clean and its 37 tests pass. It would not have caught any of this -- these are semantic contradictions between documents, not broken links or status-vocabulary violations, which is the class docs#112 flagged as the harder one and did not build a check for.
studio serve now that its message tells you how to run itstudio serve, and split §6 so the flip does not promise a pip install
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The other half of astro-mine-cli#38 (merged as astro-mine-cli#39). Two guide pages quote
astro-mine studio serve's output and carried notes flagging it as stale; merging the CLI fix inverted them, so they were stale in the other direction until this lands.guide/reference/cli.md— quotes the new output verbatim, including$ echo $?→1, and the surrounding prose now makes the point the example exists to make.guide/tutorials/07— no longer says the tutorial is blocked, because it isn't; drops theRM-DIST-03reference and thestatus-okmarker.What the reference page now says
The old text explained the message by listing what was wrong with its predecessors. The new text explains the rule instead —
cli.md§9: a degraded verb owes you what is missing and how to get it, and naming the distribution is not enough on its own.That framing earns its keep because this message has failed the rule twice, in different ways, and both are why the current wording looks as it does:
pip install astro-mine-studio[serve], a distribution the consolidation retired — an install hint that resolves to nothing is worse than none, because pip's "no matching distribution" reads as a broken environment rather than a stale message;astro-mine-apishipped — while "there is nothing to install" stayed true for a different reason, so the false half rode along under a true conclusion.The tutorial was not "blocked", and that mattered
It said "This tutorial is blocked today" and that the unblock "comes back with
RM-DIST-03". RM-DIST-03 closed on 2026-08-08. Telling a reader their unblock is arriving in a finished roadmap item is precisely the defect astro-mine-cli#38 fixed, restated one page over — so it goes rather than getting a fresher number.The gate did not catch this, and could not
Worth stating plainly, since docs#114 landed the gate three commits ago: both quotes sit in fenced blocks, which
scripts/check_docs.pyexempts on purpose. That exemption is correct — documentation must be able to quote a program faithfully rather than being forced to misquote it to satisfy a linter — but it means verbatim output stays correct only as long as someone re-quotes it when the program changes. That is a job for whoever changes the program, not for the linter.So I checked it the only way that actually works, mechanically rather than by eye:
Both blocks compared line-by-line against the command's real stderr, captured from
astro-mine-cliat mergedmain(4b6a6ca).Test plan
python3 scripts/check_docs.py— clean, 69 files, 4 checkspython3 -m unittest discover -s scripts -t scripts— 37 passedstderr(above)guide/andarchitecture/for residualnot stood up/RM-DIST-03/status-ok— the only remainingRM-DIST-03isapi.md:128, which correctly says the item "is now met in full"One thing I found and did not touch
guide/tutorials/07opens by telling the reader to runcd ui && pnpm install && pnpm run build:harness. Thatui/tree no longer exists — the per-componentui/trees were deleted with their repositories inRM-DIST-05, and the front end was rebuilt asastro-mine-ui. So the tutorial's build step points at nothing, independent of anything in this PR.That is a larger correction than re-quoting an error message and it needs a decision about what the tutorial should now say, so I have left it alone rather than fold it in. Happy to file it.
Added: split
VERSIONING.md§6 (second commit)Folded in because it is pre-flip and the flip is imminent. §6 bundled "repositories become public" with "publish the wheels to a public index" and "publish
@astro-mine/*to npm" under one heading, and opened with "per current intent, no earlier than the end of Phase 2".That is a normative document forbidding what we are about to do — and the flip is precisely the act that publishes the sentence.
Timing clause retired. The flip is not gated on a phase boundary, on Actions, or on publishing anything. The one hard precondition was the full-history secret scan — now complete and clean (.github#9: gitleaks over 205 commits across every ref in all seven repos, one finding, a false positive).
Five downstream claims contradicted the rewrite
Corrected in the same commit, because leaving them is the defect this wave exists to close:
architecture/ui.mdroadmap/README.mdguide/getting-started.mdguide/tutorials/01guide/reference/personas.mdThe last three matter most: they promise a reader that the flip delivers a
pip install, which it will not.The gate would not have caught any of this, and that is worth stating on the PR that follows the one which added it. These are semantic contradictions between documents — the class docs#112 explicitly named as the harder one and did not build a check for.
python3 scripts/check_docs.pyis clean and its 37 tests pass, which is necessary and not sufficient.