Skip to content

The pre-0.6 documentation pass: PyPI links, two shipped commands, and the two-host claim - #104

Merged
arpanghoshal merged 1 commit into
mainfrom
docs-pre-0-6-pass
Sep 6, 2026
Merged

arpanghoshal merged 1 commit into
mainfrom
docs-pre-0-6-pass

Conversation

@arpanghoshal

Copy link
Copy Markdown
Member

Documentation only — nothing under src/. Five things that would each have been wrong at the tag.

1. The README is the PyPI page, and it would have rendered broken

pyproject.toml sets readme = "README.md", and PyPI resolves relative URLs against pypi.org/project/ctrlrun/. v0.5.0's README linked absolutely and carried no images. The rewrite that gave it a wordmark, a demo GIF and 23 relative links was green on every check this repository has, because all of them are correct on GitHub — so publishing 0.6.0 would have shipped a broken hero image, a broken demo GIF and 23 links that 404.

Every link and asset is absolute now, and test_the_readme_carries_no_relative_link_and_no_relative_image refuses a new one, with a positive control beside it. It costs no link coverage: links.py already resolves github.com/CTRLRun/ctrlrun/blob/<ref>/<path> against the checkout, so a dead target still fails there. Verified: links.py README.md → 0 broken.

2. ctrlrun scan had no changelog entry at all

It merged in #100, after the last changelog edit. It has one now, with ctrlrun mcp-operator, under "Shipped in this release, and not part of the v0.6 milestone" — a heading that keeps them out of the milestone's claims, because v0.6 says the surface did not grow and it did not; these grew it afterwards, each under its own specification. The separate top-level [Unreleased] section is folded in: two undated sections stacked above one release is not a changelog anybody can read at the tag. released() still parses to 0.5.0.

3. A docs page claimed what its own test denies

how-reservation-works.mdx cited T157/T158 for "one winner across two hosts". tests/test_cross_host.py opens with "They are not two hosts", and ROADMAP.md says the two-host case stays unclaimed. Both production pages now state what was actually run — separate OS processes against one Postgres, connection broken by a proxy the tests own — and that a network partition between machines is exercised by nothing here. postgres.mdx's table row no longer says "across hosts" as though it were measured.

4. The hero excluded the outcome the product is about

"Every consequential action happens once, exactly as approved, or not at all" is a two-way disjunction, and a lost reply is neither — it is AMBIGUOUS, which the next section of the same README calls the whole point. It now reads:

A consequential action happens at most once, exactly as approved, and leaves a receipt — and when the outcome is unknown, CTRLRun says so instead of guessing.

The category noun arrives with it: what CTRLRun is was on docs/index.mdx and in pyproject's description and nowhere in the README, so a reader had to infer it from three slogans.

5. Three shipped commands were invisible, and the release was unexplained

scan, mcp-operator and effects are in the CLI section now — scan with the sentence that matters: no score, no percentage, no badge. A "New in 0.6" section says what the durable-runtime release actually changed, which the README never did. And the "It can't" list now says CTRLRun does not detect prompt injection, beside a problem-table row that could be read as claiming it.

Kept in step

docs/index.mdx, docs/IA.md and docs/CLAIMS.md carry the same hero, so the site and the README do not drift; CLAIMS gains rows for the new section, both subcommands and the injection disclaimer. Its citation guard rejected four invented test names while this was written, which is the guard doing its job — the rows now cite what the table already cites for those claims. T180 caught the new "receipts are not signed" line and required it allow-listed with a reason, which it now is.

docs/BUILD-PROMPTS-docs-0.6.md is deliberately left alone: it is a record of prompts that were issued, not a live document.

Checks

  • full suite: 4,111 passed, 45 skipped
  • ruff check, ruff format --check, mypy --strict src/: clean
  • links.py: 180 documents, 0 broken · lint.py: 186 documents, 0 findings
  • readiness and soak renders: no drift
  • src/ untouched

🤖 Generated with Claude Code

… the two-host claim

Everything here is documentation, and none of it touches `src/`. Five things that
would each have been wrong at the tag.

**1. The README is the PyPI page, and it would have rendered broken.** `pyproject`
sets `readme = "README.md"`, and PyPI resolves a relative URL against
`pypi.org/project/ctrlrun/`. v0.5.0's README linked absolutely and carried no
images; the rewrite that gave it a wordmark, a demo GIF and twenty-three relative
links was green on every check this repository had, because all of them are correct
on GitHub. Every link and asset is absolute now, and a test refuses a relative one.
It costs no coverage: `links.py` already treats a `github.com/.../blob/<ref>/<path>`
URL as an internal link wearing an absolute one.

**2. `ctrlrun scan` had no changelog entry at all**, having merged after the last
changelog edit. It has one now, together with `ctrlrun mcp-operator`, under a
heading that keeps them out of the milestone's claims: v0.6 says *the surface did
not grow*, and it did not -- these grew it afterwards. The separate `[Unreleased]`
section is folded in, since two undated sections above one release is not a
changelog anybody can read at the tag.

**3. A docs page claimed what its own test denies.** `how-reservation-works.mdx`
cited `T157`/`T158` for "one winner across two hosts"; `test_cross_host.py` opens
with *"They are **not** two hosts"*, and `ROADMAP.md` says it stays unclaimed. Both
production pages now say what was actually run -- separate OS processes against one
Postgres, connection broken by a proxy the tests own -- and that a network partition
between machines is exercised by nothing here.

**4. The hero excluded the outcome the product is about.** *"happens once, exactly
as approved, or not at all"* is a two-way disjunction, and a lost reply is neither:
it is `AMBIGUOUS`, which the next section of the same README calls the whole point.
The sentence now says at most once, and says what happens when the outcome is
unknown. The category noun arrives with it -- what CTRLRun *is* was on the docs home
and in `pyproject`'s description and nowhere in the README.

**5. Three shipped commands were invisible and one release was unexplained.**
`scan`, `mcp-operator` and `effects` are in the CLI section now, `scan` with the
sentence that matters -- no score, no percentage, no badge. A "New in 0.6" section
says what the durable-runtime release actually changed, which the README never did.
And the "It can't" list now says CTRLRun does not detect prompt injection, which it
did not, beside a problem-table row that could be read as claiming it.

Kept in step: `docs/index.mdx`, `docs/IA.md` and `docs/CLAIMS.md` carry the same
hero; CLAIMS gains rows for the new section, both subcommands and the injection
disclaimer. Its citation guard rejected four invented test names while this was
written, which is the guard working.
@mintlify

mintlify Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated
ctrlrun 🟢 Ready View Preview Sep 6, 2026, 9:26 PM

💡 Tip: Enable Automations to automatically generate PRs for you.

@arpanghoshal
arpanghoshal merged commit d11fb33 into main Sep 6, 2026
11 checks passed
@arpanghoshal
arpanghoshal deleted the docs-pre-0-6-pass branch September 6, 2026 21:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant