Uh oh!
There was an error while loading. Please reload this page.
docs(deploy): rewrite the Deploy section for the commercial runtime - #62
Conversation
The four Deploy pages documented a licence-free, build-it-yourself path that cannot work: a `git clone` + `docker build` section for a repository that holds only the docs site, a moving-tag publishing table, and zero mentions of licensing on a product whose walled postures refuse to boot without a licence. `air-gapped.mdx` was reverse-wrong — it told readers to leave the cloud-posture setting unset "to run fully offline", when unset resolves to the public control plane. Rewritten from the deployment artifacts that ship with the release: - The image is pinned by digest, never a tag, with the reasoning. - Licence is on the happy path, including which shape needs which licence mode. - Air-gap is a licence mode, not a firewall setting. Unset is not "off". - Unsupported combinations are described as refused at startup, with the supported matrix stated in full. - Multi-node states what becomes mandatory: cluster driver plus one shared secret key, or the runtime refuses to start. - Supply-chain verification (signature, SBOM, provenance) is in the production path. The pages carry the decision shape and point at the release's deploy bundle for values a customer copies, so there is no prose copy of a template here to drift. Stale translations of all four pages are deleted in six locales; Fumadocs falls back to English, so a missing translation renders correct content while a stale one renders the retired story. AGENTS.md's locale conventions are corrected in the same pass: they described `en` + `cn` with `.cn.mdx` siblings, while the site defines seven BCP 47 tags and uses `zh-Hans`. A `.cn.mdx` file never renders and raises no error. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0137TnZzVmkSjXxoSVgPFS6S
os-zhuang
commented
Aug 18, 2026
Review: accept. Marked ready.Verified against branch The four required properties
The line count above measures matching lines; the author counted occurrences (40/57/35/86). Both are right — no discrepancy. The content boundary heldAll four pages point at the release's deploy bundle rather than reproducing it. The one ⇒ That distinction is the whole point of this rewrite. The templates ship with the release and are covered by tests there; prose copies here have nothing pinning them, which is precisely how the previous four pages drifted into documenting a product that no longer exists. Browser verification was real, and it verified the right thingsThe repo's own rule is that UI changes get exercised in a browser. Done — headless Chromium against a production build, and notably it measured the things that could silently be wrong:
The hydration error was handled correctlyA React #418 console error fires on every page — and it was measured on untouched pages ( Five open questions go to the maintainer unanswered — deliberatelyEach is a rule the author could not confirm from a shipped artifact and therefore did not write. ⛔ I am not filling them in, and neither should a follow-up PR without an artifact to point at. The most consequential: An air-gap licence expires — signature and expiry resolve locally at every boot — and no artifact documents a renewal path. An expiring licence with no documented renewal is a support call with a deadline attached. Also open: whether Kubernetes is a supported shape at all (no chart, no manifests in the bundle — only Compose, so the page now describes «properties any orchestrator must preserve» and claims no support); how an air-gapped site is supposed to get the image across the boundary (the bundle documents a registry login a disconnected site cannot perform); and whether air-gapped in-product AI is supported. The old ⇒ Removing an unverifiable instruction is the correct trade here. This card exists because plausible-but-unverified deployment prose was published once already, and readers followed it. Follow-up already filed#60 — seven pages outside Deploy still document the retired runtime env contract, and No changeset applies — this repo has no changeset gate. Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Two current pages named the same boot shape differently, and the deploy bundle ships one environment template per shape — so a reader who has seen both pages could not tell whether "Config-authored" and "Shipped runtime" were one shape or two, while deploy/index.mdx warns against adapting one template into another. The card guessed deploy/index.mdx's "Shipped runtime" was canonical because it is the newer page. It is not the newer page, and the corpus does not use that name anywhere else: - Three pages carry this table, not two. configure/runtime.mdx:24 also names row one "Config-authored", so the corpus stands 2-1. - The commit order inverts the guess. deploy/index.mdx's table landed in #62 at 13:14; "Config-authored" was written into architecture.mdx and configure/runtime.mdx by #63 at 14:49 — after it, by a pass whose scope was explicitly "outside Deploy" and which reconciled contradictions with the Deploy rewrite. #69 then rewrote architecture.mdx at 17:40 and kept the name. "Shipped runtime" is the oldest of the three writes. - #63 checked its rows "against the deployment bundle that ships with the release, and against the runtime and CLI source that reads it" — the template-mapping authority, and it sits with "Config-authored". - "Artifact-pinned" is the framework's own term (packages/runtime/src/ artifact-reference.ts, packages/cli/src/commands/serve.ts). The paradigm is a past-participle describing where the app came from; "Shipped runtime" is a noun phrase naming the runtime, and is the odd one out even inside its own table. - "the shipped runtime" is already an established generic phrase for the product runtime — three uses upstream, plus environment-variables.mdx:158 ("Nothing in the shipped runtime reads OS_ARTIFACT_FILE"). Promoting it to a proper noun would make the boot-contract reference page use the phrase in two senses at once. Row three differed in substance too, and the evidence settles it rather than contradicting: air-gapped.mdx and the OS_COMPOSED_ARTIFACT_URL entry both state the two claims jointly — the composed shape is the hosted multi-organization shape AND is air-gap-licensed only, enforced at startup. deploy/index.mdx already carried both; architecture.mdx carried only the licence half, so it gains the purpose half and the link to where the refusal is stated. No headings are renamed, so no anchor moves: /docs/architecture#boot-modes still resolves. Fixes#71
Fixes#59
The four Deploy pages taught a licence-free, build-it-yourself path that cannot work.
docker.mdxtold readers to clone this repository and rundocker buildagainst a Dockerfile that does not exist here, and published a moving-tag table for an image that is not distributed that way. Across all four pages, licensing appeared zero times — on a product whose walled postures refuse to boot without a licence. Andair-gapped.mdxwas reverse-wrong: it told readers to leave the cloud-posture setting unset "to run fully offline", when unset resolves to the public control plane.Rewritten from the deployment artifacts that ship with the release, rather than reconciled with the old story. Previously published images are not referenced anywhere.
What the pages now carry
Content boundary
The pages carry the decision shape and point at the release's deploy bundle for anything a customer copies verbatim. There is no prose copy of an environment template here, so there is nothing to drift — that is how the previous pages got into this state. The exact registry reference, digest and verification commands come with the release, which is what versions them.
kubernetes.mdxopens by saying plainly that no chart or manifests ship, and reframes as the properties any orchestrator must preserve — migration ordering, probe endpoints, identical secret material, deployment-wide licence posture.Locales
The six stale translations of each rewritten page are deleted (24 files). Fumadocs falls back to English when a translation is missing, so deleting yields correct English, while leaving them would keep rendering the retired story. Verified in the browser:
/zh-Hans/docs/deploy/air-gappednow serves the new English page.AGENTS.md
Also in scope on this card: the Locale conventions section described
en+cnwith.cn.mdxsiblings, while the site defines seven BCP 47 tags and useszh-Hans. A.cn.mdxfile never renders and raises no error, which is the worst failure mode a translation can have — so the correction says that explicitly. Same pass, same defect class: the "Where things live" table pointed atapps/docs/lib/homepage-i18n.ts, which no longer exists, and the translation workflow now says a rewrite must delete the siblings it invalidates.Verification
All at commit
c5ba923, the head of this branch.pnpm run type-checkinapps/docs— clean.pnpm run build—Compiled successfully, 740/740 static pages generated, no MDX errors.next start: all four pages render with the expected headings; the Deploy sidebar order matchesmeta.jsonexactly (index, docker, kubernetes, air-gapped) on every page;/zh-Hans/docs/deploy/air-gappedfalls back to the new English content; every outbound link target answers 200; an unknown Deploy path still 404s (control).One console error appears on every page, including untouched ones — a pre-existing site-wide React hydration warning, filed separately as #61 rather than absorbed here.
Out of scope, filed
reference/environment-variables.mdxworst among them.Generated by Claude Code