Skip to content

docs: replace the retired runtime env contract on the nine pages outside Deploy - #63

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-60-retired-env-contract
Aug 18, 2026
Merged

docs: replace the retired runtime env contract on the nine pages outside Deploy#63
os-zhuang merged 1 commit into
mainfrom
claude/issue-60-retired-env-contract

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes#60

Nine pages outside deploy/ still documented environment variables the shipped
runtime does not read. reference/environment-variables.mdx was the worst of
them — a reference page is the one a reader treats as the contract — and since
the Deploy rewrite landed it also contradicted a page shipping beside it:
it described the cloud-posture variable as a switch for marketplace features,
while deploy/air-gapped.mdx states it is coupled to the licence mode with
unsupported pairings refused at startup.

How each variable was judged

Every name was checked against the deployment bundle that ships with the
release, and against the runtime and CLI source that reads it. Nothing here is
reconstructed from surrounding prose.

NameVerdictEvidence
OS_ARTIFACT_FILERead by nothing. Zero occurrences in the runtime, the CLI, or the deployment bundleDocumented on 3 pages as the way to select an app
OS_BUSINESS_DB_URLRead by nothing. Zero occurrences anywhereA deployment that set only this had no database configured
OS_CACHE_DIRRead by nothing. Zero occurrences anywhereFound outside the card's list, on operate/backup.mdx
OS_PROJECT_IDNo longer read. Documented as an accepted legacy aliasWas true at the release the changelog records; is not true now
OS_ARTIFACT_PATHRetired — refuses the boot on the runtime image when non-default, naming its replacementDocumented as a supported alternative on 2 pages, including the CLI reference
OS_CLOUD_API_KEYNot a self-hosted deployment variable. It is the service credential the hosted cloud injects into runtimes it operates, and separately the CLI's publishing bearer3 pages presented it as the deployment's cloud credential
OS_DATABASE_DRIVERNOT retired. It is the live driver overrideDocumented, not removed — the card's premise is wrong on this one name

OS_CLOUD_URL keeps its name and loses its description. It is not a
marketplace switch: it decides whether the deployment has a control plane at
all, it is coupled to the licence mode, unset resolves to the public control
plane rather than to "off", and an ordinary licence paired with no control
plane is refused at startup.

What the reference page is now

Rebuilt around the decisions a deployment actually makes — licence and cloud
posture as a coupled pair, the walled-posture decisions that refuse to default,
multi-node, artifact selection — plus a retired-name table so an inherited
configuration file can be read and corrected rather than merely failing.

Variable names stay, because on a reference page the names are the contract.
The values a customer copies do not: those stay in the release's deploy bundle,
where they can be pinned to a version. That is the same boundary the Deploy
rewrite drew, and the reason neither page will rot.

Rows that could not be confirmed against any shipped artifact are not carried
forward on a guess. They are listed as open questions on the issue rather than
restated with a plausible-sounding description.

Pages changed

Seven from the card: reference/environment-variables.mdx, architecture.mdx,
operate/troubleshooting.mdx, operate/production.mdx, configure/runtime.mdx,
build/packages.mdx, resources/changelog.mdx.

Two found by sweeping the whole content tree rather than stopping at the list:
operate/backup.mdx (OS_CACHE_DIR) and reference/cli.mdx
(OS_ARTIFACT_PATH presented as a working option).

build/packages.mdx was the one page where the card's premise did not hold —
its use of the publishing credentials is correct, so the text is kept and gains
a note about the name collision with the deployment contract.

Two sites were judged historical record rather than current instruction, on
resources/changelog.mdx, and were corrected in place rather than deleted: one
restated without a name nothing ever read, one moved to past tense.

Stale translations of all nine pages are deleted in six locales (54 files).

Verification

Built and driven in a real browser at e4efd5c, the branch head.

  • npm run type-check — clean.
  • npm run build — 740 static pages generated, no errors.
  • Chromium over all nine rewritten pages plus both Deploy pages: every page 200,
    headings and tables render, sidebar order matches reference/meta.json
    exactly, and a deliberately bad path still 404s.
  • The locale fallback was measured, not trusted. A deleted zh-Hans
    sibling serves the new English body with localized navigation chrome (17 CJK
    characters, all of them sidebar and link text); the control — a page whose
    translation was kept — still renders 1215 CJK characters of its own
    translated body. Same result for a deleted ja sibling.

One pre-existing finding, not caused by this branch: every default-locale
(unprefixed) page throws a React hydration error in the browser console,
including untouched pages and the Deploy pages. Prefixed-locale routes do not.
Filed separately.

Generated by Claude Code


Generated by Claude Code

Nine pages outside `deploy/` still documented environment variables the
shipped runtime does not read. `reference/environment-variables.mdx` was the
worst of them, because a reference page is the one a reader treats as the
contract — and since the Deploy rewrite landed it also *contradicted* a page
shipping beside it, describing the cloud-posture variable as a switch for
marketplace features while the deployment page states it is coupled to the
licence mode with unsupported pairings refused at startup.
Every variable in the rewrite was checked against the deployment bundle that
ships with the release, and against the runtime and CLI source that reads it.
What the evidence showed:
- `OS_ARTIFACT_FILE`, `OS_BUSINESS_DB_URL`, `OS_CACHE_DIR` and `OS_PROJECT_ID`
are read by nothing at all. A reader who sets one gets the boot they would
have got with nothing set, and no error naming the mistake.
- `OS_ARTIFACT_PATH` is retired on the runtime image and *refuses* a boot that
carries a non-default value, naming its replacement. It was documented as a
supported alternative on two pages.
- `OS_CLOUD_API_KEY` is not a variable a self-hosted deployment sets. It is the
service credential the hosted cloud injects into runtimes it operates, and
the CLI's publishing bearer token. A self-hosted deployment authenticates
with a token minted when it was bound. Three pages presented it as the
deployment's cloud credential; the publishing page, which had it right, gains
a note about the collision.
- `OS_DATABASE_DRIVER` is NOT retired — it is the live driver override — so it
is documented rather than removed.
The reference page is rebuilt around the decisions a deployment actually makes:
licence and cloud posture as a coupled pair, the walled-posture decisions that
refuse to default, multi-node, and artifact selection. It carries a retired-name
table so an inherited configuration file can be read and corrected. Variable
names stay — they are the contract — but the values a customer copies stay in
the release's deploy bundle, where they can be pinned to a version.
Rows that could not be confirmed against any shipped artifact are not carried
forward on a guess; they are reported for triage rather than restated.
Stale translations of every rewritten page are deleted in six locales. Fumadocs
falls back to English, measured here rather than assumed: the deleted siblings
serve the new English body with localized chrome, while a page whose
translation was kept still renders in its own language.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0137TnZzVmkSjXxoSVgPFS6S
@os-zhuang
os-zhuang marked this pull request as ready for review August 18, 2026 06:20
@os-zhuangClaude

Copy link
Copy Markdown
ContributorAuthor

Review: accept. Marked ready — ⛔ not merged, since merging publishes and this repo has no auto-merge.

Verified against branch e4efd5c directly. 63 files, −7922: 9 English pages modified, 54 locale siblings deleted — and every deletion is a translation. No English content was removed (checked with git diff --name-status, not inferred from the total).

It contradicted the card in two places, and both corrections are right

I verified each against the shipped source rather than taking them:

  • OS_DATABASE_DRIVER is not retired.service-cloud/src/boot-env.ts reads it. It was documented rather than deleted.
  • build/packages.mdx was already correct. That OS_CLOUD_API_KEY is the publishing identity, not a self-hosted deployment variable — a name collision, not a stale contract. Text kept, collision noted.

Also confirmed independently: OS_ARTIFACT_FILE has zero occurrences across the runtime's apps/ and packages/ — the "set it and it is silently ignored" claim is measured, not asserted.

⇒ A card is a hypothesis. Two of its seven claims were wrong, and the right outcome was to correct them on the record instead of implementing them as written.

The live contradiction is resolved

The reference page now says what the deployment page says:

Unset is not "off". An unset OS_CLOUD_URL resolves to the public control plane… A deployment meant to talk to nobody must say off out loud.

Retired names were kept, not deleted — and that is better

They moved into a Retired names table, framed as "listed here so that a configuration file you inherited can be read and corrected — not so they can be used", each with what to use instead. Deleting them would have left a reader holding OS_ARTIFACT_FILE with no way to discover it is inert. ⇒ The failure mode this card names is a silent one; the fix has to be findable by someone already suffering it.

Two pages beyond the card's list were included (operate/backup.mdx, reference/cli.mdx) — the list came from one sweep and never claimed completeness.

⭐ How the locale fallback was proved — the transferable bit

Deleting a translation is only safe if the site falls back to English, and 200 OK cannot tell you that — a stale translation returns 200 too. So the check counted CJK characters in the article body:

pagearticle CJK
/zh-Hans/…/environment-variables (sibling deleted)17 — every one located in nav chrome, not prose
/zh-Hans/docs/quickstart (translation kept, control)1215

Same shape for /ja/docs/configure/runtime. ⇒ That distinguishes "fell back to English" from "still serving the old translation". A status-code check would have passed either way.

Build 740/740 static pages, sidebar hrefs match reference/meta.json order exactly, bad path 404s as a control, no internal identifiers in pages or PR body.

Five open questions — all the same shape, all left for the maintainer

OS_KERNEL_CACHE_SIZE, OS_KERNEL_TTL_MS, OS_ENV_CACHE_TTL_MS, OS_ARTIFACT_CACHE_TTL_MS, OS_PLATFORM_SSO, OS_RUNTIME_PORT, OS_ORGANIZATION_ID — each occurs only in the hosted distribution and in no shipped artifact. They were removed rather than have their defaults restated from an ungrounded source.

⚠️ If any turn out to be read by the self-hosted image, the fix belongs in the deploy bundle first and the docs second — a default that lives only in a docs page is how this whole class started.

Two judgement calls I agree with: the changelog entry citing a variable name nothing ever read was restated as a capability rather than given an invented name; and OS_ARTIFACT_PATH keeps its "on the ObjectOS runtime image" qualifier, because dropping it would leave a reader whose boot was refused with no way to find out why.


Generated by Claude Code

@os-zhuang
os-zhuang merged commit 7eaf3a9 into mainAug 18, 2026
1 check passed
os-zhuang pushed a commit that referenced this pull request Aug 18, 2026
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
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant

@os-zhuang