Uh oh!
There was an error while loading. Please reload this page.
docs: retire the multi-Environment runtime model from six pages outside Deploy - #86
Merged
Merged
Conversation
The hosted many-Environments-per-process model that #64/#69 removed from architecture.mdx was still the model six other English pages taught. Each row got its own decision rather than a search-and-replace. - faq.mdx: the multi-tenancy answer promised per-Environment database, identity and audit isolation the single OS_DATABASE_URL contract does not give. Rewritten against the walled tenancy posture. Also drops the "kernel cache" framing from the serverless answer, replaces the dead "kernel cache miss rate" metric, and points the monitor at /api/v1/health + /api/v1/ready like the shipped deploy pages. - glossary.mdx: Kernel, Environment, Tenant and Project rewritten. The first three carried the retired model as load-bearing definitions. - why.mdx: the fit-scenario row named a mechanism (per-project kernel + LRU cache) that does not exist. Row removed; the positioning question is escalated rather than decided here. - observability.mdx: kernel_cache_misses_total is emitted by nothing on objectstack@origin/main and OS_KERNEL_CACHE_SIZE is in no section of the environment contract, so the alert is deleted rather than reworded. - troubleshooting.mdx, ai-builder.mdx: wording. English only; locale siblings go stale and are re-derived by the translation pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CJPxtTxoxTUnjNdTbiEaRa
os-zhuang
marked this pull request as ready for review
August 18, 2026 13:07
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Aug 18, 2026
Closed
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 freeto 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.
Fixes#70
Six English pages outside Deploy still taught the hosted many-Environments-per-process
model. Each row got its own decision, verified against
objectstack@origin/mainandagainst the pages that shipped today, not a search-and-replace.
The target state, and where it is pinned
architecture.mdx(rewritten by #82, landed today) is the page these six now agree with:a deployment serves one app, from one database, and its kernel is built during startup —
"there is no cache sizing to get right", "nothing per-request resolves which app to serve".
reference/environment-variables.mdxcarries the tenancy contract: oneOS_DATABASE_URL,and a walled posture (
OS_TENANCY_POSTURE) that puts up the per-organization isolationwall as a licensed capability, on a shared database, where "metadata is scoped to the
deployment, not to an organization".
Upstream confirms the split the docs should draw. In
packages/runtime/src/http-dispatcher.ts(resolveRequestScope), multi-kernel routing runsonly when the host registers a
KernelResolver, and the comment says where that lives:"strategy lives in the cloud distribution … No resolver registered → single-environment:
every request serves from
defaultKernelwith no environment context."reference/environment-variables.mdxalready calls a self-hosted box "a single-environmentruntime" in the
OS_ENVIRONMENT_IDrow. So many-Environments-per-process is the hosted cloudshape, which
faq.mdxalready says in its "Do I need an account / cloud service?" answer —that answer was left as it stands.
Row by row
resources/faq.mdxreference/environment-variables.mdx§Multi-organization deployments;architecture.mdxlines 52-57resources/glossary.mdxarchitecture.mdxlines 86-91, 140;environment-variables.mdxOS_ENVIRONMENT_IDrowwhy.mdxoperate/observability.mdxpackages/observability/src/semconv.tsonobjectstack@origin/mainoperate/troubleshooting.mdxarchitecture.mdx; the same list's ownOS_AUTH_SECRETbulletbuild/ai-builder.mdxarchitecture.mdxlines 19-21faq.mdx— the card's sharpest claim, confirmedThe FAQ promised "each Environment has its own database, identity, and audit log". The card
asked whether the FAQ might be right and the other pages wrong. It is not: the evidence is
one-sided. A deployment gets one
OS_DATABASE_URL; the env reference describes severalorganizations on "a shared database";
architecture.mdxdescribes a walled deployment where"several organizations share it" and share its app. The answer now describes the wall, says
what it separates (data and memberships) and what it does not (schema), and names deployment
separation as the stronger isolation.
observability.mdx— the metric does not existkernel_cache_misses_totalis emitted by nothing:git grep kernel_cacheandgit grep cache_missoverobjectstack@origin/mainboth return zero hits. The canonicalregistry,
packages/observability/src/semconv.ts— which exists, in its own words, "so hostscan wire alerts/dashboards against a stable namespace" — lists 13 metric names, and no kernel
cache metric is among them. The nearest name is
cache_lookups_total{adapter,result}from@objectstack/service-cache, which is the optional application cache capability, not a kernelLRU. Confirming the card:
OS_KERNEL_CACHE_SIZEhas 0 occurrences inreference/environment-variables.mdxagainst 4 forOS_ARTIFACT_URLas a control.The alert is therefore deleted rather than reworded — there is no metric to point a corrected
alert at, and inventing one is out of bounds. The
Artifact/kernel cache missessignal row isreplaced with readiness, which is the shipped mechanism for the cold-start question it was
asking (
architecture.mdxmeasures startup as "time to a 200 from/api/v1/ready").why.mdx— removed, not re-decidedTriage's clause on the card: do not decide the positioning claim here; flag it if simple
deletion feels lossy. It does feel lossy — a walled multi-organization deployment is a real,
shipped, licensed capability, so the scenario survives even though the mechanism the row
named ("Per-project kernel + LRU cache designed for this") does not exist. Correcting the row
would have been the deciding action the clause forbids; leaving a nonexistent mechanism on the
pitch page was not an option. So the row is removed — the reversible, non-deciding move — and
the positioning question is filed for the decision inbox. Re-adding a corrected row afterwards
is one line.
Folded in, and why
/healthadjacency the card named.faq.mdxtold the reader to point a monitor at/healthwhiledeploy/docker.mdx:121anddeploy/kubernetes.mdx:38name/api/v1/healthfor liveness and
/api/v1/readyfor readiness. Folded in, not split: it is in a filealready being edited, it is the same defect class (page disagrees with the deploy pages that
shipped), and the correct shape is pinned by two shipped pages rather than needing a
decision. Note that
/healthis not a dead route — it is registered inpackages/runtime/src/http-dispatcher.ts:512and the route ledger calls it a "liveness probefor orchestrators". The defect is that it is liveness-only, so a monitor wired to it alone
never sees the readiness 503 that a stopped data driver produces.
Three further edits inside the six declared files, same defect class, each mechanically pinned:
faq.mdx"serverless / Lambda" answer said "the kernel cache … depend[s] on warm in-processstate" — same retired vocabulary, now the kernel built at startup.
faq.mdx"What metrics should I monitor?" listed "kernel cache miss rate", a metric nothingemits; replaced with readiness.
glossary.mdxEnvironment and Tenant carried the identical load-bearing false claim("its own database" / "data is scoped per Environment"). Project changed only because the
Environment rewrite removed the "v4.x / v5.0" sentence it referred back to; its version claims
were removed, not restated, since
@objectstack/specis at 17.0.0 and noOS_PROJECT*variable exists upstream.
Observed, deliberately not fixed
auth_failures_totalis also a phantom metric — the alert directly above the one deletedhere. Zero hits across
objectstack@origin/main, and absent fromSEMCONV. Left alone onpurpose: unlike the kernel alert, the correct shape is not pinned — with no auth metric in
the registry at all, the fix is either deleting a genuinely useful alert or asking the runtime
to emit one, which is a product call. Filed separately rather than decided in a docs PR.
quickstart.mdxlabels/healtha "Liveness probe" — the same defect folded in above, butoutside this card's declared file surface. Filed.
glossary.mdxcarries two separate### Consoleentries, each saying "Distinct from Console".Pre-existing, unrelated to this card, and adjacent to queued work on Console naming. Filed.
operate/troubleshooting.mdxsettings cascade (Environment -> Tenant -> User -> Default) wasnot touched: its "Environment" means the env-var override, matching
configure/system-settings.mdx, not the retired concept.Verification
Both turbo tasks run with
--force, becauseturbo.jsondeclares noinputscoveringcontent/docs/**and the cache is shared across sibling worktrees — aFULL TURBOreplaywould prove nothing here. Both logged
cache bypass, force executing, onacc5b6a:pnpm turbo run type-check --force— 1 successful, 0 cached, 9.763spnpm turbo run build --force— 1 successful, 0 cached, 1m7.67sAll three translation checks, invoked exactly as
translations.ymlinvokes them:--actor os-zhuang --files changed.txt) — exit 0: "touches 0 translationartifact(s) and 6 other file(s)". Still inert pending
TRANSLATION_BOT_LOGIN.locales (18 stale per locale); reported, not blocking, per AGENTS.md.
finding(s) reported)". None attributable to this diff, which changes no locale file.
Rendered HTML was read out of
.next/server/app/en/docs/**for all six pages — not just thediff — and every changed passage was confirmed in the built output, including that the removed
why.mdxrow is gone from the fit table and that the alert block dropped only the kernel alert.English only. No locale sibling is touched; no page is retired or renamed, so no locale sibling
is deleted either.
Generated by Claude Code