Skip to content

Rebuild the homepage as a three-slide deck, and lead with the extra zero - #131

Merged
arpanghoshal merged 6 commits into
mainfrom
docs/homepage-minimal
Sep 9, 2026
Merged

Rebuild the homepage as a three-slide deck, and lead with the extra zero#131
arpanghoshal merged 6 commits into
mainfrom
docs/homepage-minimal

Conversation

@arpanghoshal

Copy link
Copy Markdown
Member

Five commits, all copy and presentation. No src/ change.

The page

Seven sections became three slides, one viewport each, grouped as: hero plus the failure chain; the demo CTA plus the three pillars; integration, commercial and footer. The slides are plain markup inside a scroll-snap container, so with no JavaScript the page still reads, indexes and snaps a slide at a time; snippets/deck-nav.jsx adds the dots, the keyboard and a fit pass, and reads the theme's navbar height rather than assuming one.

Fit applies one scale to the whole deck, not one per slide. Scaling each slide against its own content put neighbours at different left edges, which reads as a bug when you arrow between them. Slide 3 was then trimmed until nothing needs scaling at all: at 1440x900 the shared scale is exactly 1 and all three slides start at the same x.

No arrow buttons on screen. The dots are the only visible control, so they carry real labels and take focus. Below 800px wide or 620px tall the deck reverts to an ordinary scrolling page. Navbar wordmark 28px to 40px.

The story

The lead was the lost-reply chain, which needs the reader to already hold a distributed-systems model. It is now the failure people actually fear, and the divergence is on the page rather than taken on trust: the ticket says refund $500, the agent asks for $5,000, one extra zero. With CTRLRun policy denies those arguments and the call never leaves. It is the demo's existing blocked scenario, so "Walk through this refusal" deep-links to the refusal the chain describes.

AMBIGUOUS is demoted, not dropped - pillar 02, unknown outcome in the code panel, and named in the demo CTA. Everywhere it is documented as library semantics (docs/concepts/, the cookbook, the specs) is untouched.

The section caption says what CTRLRun does rather than what it cannot do. Em dashes are out of the site copy; the four left in docs.mdx are ctrlrun demo output a test asserts byte for byte, plus two build comments.

Two things to know

The README stays in euros. It quotes ctrlrun demo, the demo prints euros, and docs/assets/demo.gif is a recording of that output. Dollars in the prose above a euro transcript and GIF would make the README contradict its own evidence. Its story is aligned instead, and its policy claim follows the demo's real bands: 500 is autonomous, 5,000 is not, so it says the extra zero meets a human rather than claiming a denial the demo would not produce. Putting the README in dollars means changing the CLI and re-recording the GIF.

adopt.ctrlrun.dev is already deployed (it lives outside this repo), both pages, dollars throughout.

tests/test_readme_assets.py pinned the old first-H2 title and now pins the new one; its point is that the README opens on a story rather than a feature table, which still holds. Docs tests pass (92). Checked light and dark, 1440x900 and 414x896.

The homepage embedded the full 48-domain ScenarioExplorer and also linked
to /try, which renders the same component. The refund story's CTA said
"in the demo" while pointing off-page, past the demo sitting below it.

Drop the inline explorer. The try section becomes a compact card whose
primary button is the refund deep link the failure story sets up
(/try?domain=Payments&action=Refund payment&situation=uncertain), with a
second link for picking your own domain and a third for the real wheel in
the browser. Hero and footer "Try CTRLRun" now go to /try.

Also tighten the how-it-works and integration copy, and add a direct
contact link to the commercial section and the footer.
The page carried seven sections and said the same thing three times: a
boundary strip (propose / check / act), a four-step how-it-works, and a
try card that re-explained the demo the failure story had just set up.

Follow the adopt.ctrlrun.dev deck, which says it in two moves. The
boundary strip and the refund comparison collapse into one section: the
same failure as two chains, without controls and with CTRLRun, ending at
$1,000 and $500 once. The try CTAs move onto the end of that chain, where
the reader already has the case in mind, so the standalone try card goes.
The four how-it-works steps become the deck's three pillars — set limits,
check actions, know what happened — with the deck's wording.

Hero keeps one line, the deck's promise, instead of a lede plus an intro.
Integration and commercial each lose a paragraph. Seven sections to five,
820 words to 555.

CSS: drop .cr-boundary, .cr-boundary-node, .cr-control and .cr-try-card
with their responsive rules, all now unused; add .cr-chain and .cr-pillar.
The classes try.mdx shares — .cr-failure, .cr-comparison, .cr-how-steps,
.cr-how-close, .cr-flow-arrow — stay.
The lost-response chain asks the reader to already hold a
distributed-systems mental model: a call succeeded, its reply vanished,
the retry double-pays. That is CTRLRun's most distinctive guarantee and
its least legible one on a first visit.

The chain now shows the failure people actually fear. The agent invents a
$50,000 payout, the tool is in its list, and without controls the call
goes through. With CTRLRun policy denies those arguments and the call
never leaves the process. It is the demo's existing `blocked` scenario, so
"Walk through this refusal" deep-links to the same refusal the chain
describes, and the eyebrow is that scenario's own kernel line: the tool
was in its list, that is not permission.

The caption states the limit rather than letting the story imply more than
it should. CTRLRun cannot tell that the agent made it up; it can tell the
action is not one this agent may take.

The AMBIGUOUS case is not dropped, only demoted: it stays as pillar 02's
outcome checks, as `unknown outcome` in the outcomes list, and it is now
named in the demo CTA alongside the edited approval and the duplicate.
The homepage chain changed story last commit; the README and the rest of
the site still led with the lost reply. Three changes, in order of size.

README: "The refund that happened twice" becomes "The refund nobody
approved". It opens where a reader already is, an agent inventing a
€50,000 payout that policy refuses, notes that an approval for €2,000
authorises nothing when €5,000 is executed, and only then turns to the
half people do not expect, the correct €500 refund whose reply is lost.
Both halves are what `ctrlrun demo` actually prints, and the recorded GIF
shows both, so the narrative and the evidence still agree. The ambiguity
guarantee is not softened anywhere it is documented: concepts, cookbook
and the specs are untouched.

Chain labels are symmetric now, "Without CTRLRun" and "With CTRLRun", on
the homepage and in both decks.

The section caption said what CTRLRun cannot do. It now says what it does:
it checks the action rather than the reasoning, reads the arguments about
to leave the process, and answers whether they may go.

Em dashes are out of the site copy: index.mdx, try.mdx, docs.mdx and the
two page snippets. The four left in docs.mdx are two lines of `ctrlrun
demo` output a test asserts byte for byte, and two build comments that
never render.

tests/test_readme_assets.py pinned the old first-H2 title; it pins the new
one. The assertion's point is that the README opens on a story rather than
a feature table, and it still does.
The page was one continuous scroll. It is now three slides, one viewport
each, grouped as: hero plus the failure chain; the demo CTA plus the three
pillars; integration, commercial and the footer.

Mechanics. The slides are plain markup in index.mdx inside a scroll-snap
container, so with no JavaScript the page still reads, indexes, and snaps
one slide at a time. snippets/deck-nav.jsx adds the position dots, the
keyboard (arrows, page keys, space, Home, End) and the fit pass. It reads
the theme's navbar height rather than assuming one, since the deck has to
start below whatever chrome the docs theme renders.

Fit is one scale for the whole deck, not one per slide. Scaling each slide
against its own content puts neighbouring slides at different left edges,
and arrowing between them reads as a mistake; a shared scale cannot drift.
Slide 3 was the tall one, so its code block, outcome list and internal
gaps came down until nothing needs scaling at all: at 1440x900 the shared
scale is exactly 1 and all three slides start at the same x.

No arrow buttons on screen. The dots are the only visible control, so they
carry real labels and take focus rather than being decorative.

Below 800px wide or 620px tall the deck is not the right shape, so it
reverts to an ordinary scrolling page with the slides as sections and the
dots hidden.

Also: the navbar wordmark goes from 28px to 40px, 32px on small screens.
"The agent invents a $50,000 payout" never said what the right number was,
so the reader had to take the wrongness on trust. The chain now shows the
divergence: the ticket says refund $500, the agent asks for $5,000. One
extra zero is the error people recognise, and it is the believable one --
two extra zeros reads as contrived, and a chain nobody believes stops
working.

End cells show the loss rather than the gross, so the two rows compare
like for like: "$4,500 too much" against "$0 wrongly paid".

Currency: ctrlrun.dev and adopt.ctrlrun.dev are dollars throughout. The
automotive use case keeps its own scale, $8,000 asked as $80,000, because
a dealer incentive is not a consumer refund; the shape is the same.

The README stays in euros, and that is not an oversight. It quotes
`ctrlrun demo` byte for byte, the demo prints euros from
src/ctrlrun/cli/demo.py, and docs/assets/demo.gif is a recording of that
output. Prose in dollars above a transcript and a GIF in euros would make
the README contradict its own evidence. Its story is aligned instead: 500
asked, 5,000 called, one extra zero. Under the demo's own policy 500 is
autonomous and 5,000 is not, so the sentence says the extra zero meets a
human rather than claiming a denial the demo would not produce.
@mintlify

mintlify Bot commented Sep 9, 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 9, 2026, 12:53 AM

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

@arpanghoshal
arpanghoshal merged commit 87d6e21 into main Sep 9, 2026
11 checks passed
@arpanghoshal
arpanghoshal deleted the docs/homepage-minimal branch September 9, 2026 01:02
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