How the whole fleet fits together
One name, eight landscapes, one control plane
Every deployed workload has one four-part name: Landscape · Platform · Service · Module (LPSM).
A landscape fixes how a deployment behaves: its secrets, its data, its lifetime and its network edge. There are eight.
Primordial, the control plane, decides what should run. The serving clusters run it. If Primordial stops, traffic and login keep working; only deploys pause.
01 · Big picture
Five layers, one direction of control
Physically Git repositories on GitHub.com, plus an OCI registry where CI pushes the built images and charts.
fleet/registry/, each <platform>.carbon repo (example: argon.carbon) and each service repo (example: argon.zinc).fleet/platforms/. Example: Kargo edits platforms/argon/landscapes/pichu/zinc.yaml.Indigo frame = a human-edited folder; orange frame = a machine-edited folder. A human never edits platforms/.
Physically One virtual machine running k3s, a one-node Kubernetes cluster. When the VM boots, cloud-init decrypts its first secrets with SOPS and starts everything else.
primordial, and no user traffic reaches it.Source: concepts/seed-cluster.md (single-node k3s on one VM, SOPS via cloud-init) and ARCHITECTURE.md §3 (Infisical runs on Primordial; safe to be down for hours).
Physically Managed Kubernetes clusters at cloud providers: DigitalOcean, AWS and Oracle Cloud. fleet-operator creates each cluster through the provider's API.
<landscape>·<mark>. Example: raichu·opal. The mark (opal, ruby, emerald) tells you the provider."copper" is an example second service. Source: ARCHITECTURE.md §2 (cluster = landscape × mark; gems share a dataset) and §3 (provider load balancer, TLS at the Gateway).
Physically 3 kinds of machine: your laptop, a throwaway CI machine, and ENTEI (one shared Kubernetes cluster that hosts virtual clusters).
pls env up --profile <name>. Garden builds the whole instance. See section 08.Source: environments.md (profiles and hosts); ARCHITECTURE.md §3 (ENTEI hosts the vclusters and is never a serving landscape).
Physically Paid services from other companies, outside every cluster the fleet runs.
Control flows one way: Git → Primordial → clusters and vendors. Nothing below writes back up, except the machine-written fleet/platforms/ files.
*.carbon) ▼Pick a box above
Each box opens a plain description: what it does, where it runs, and which repo or node owns it.
Sources: ARCHITECTURE.md §1–§3, §8–§9; environments.md §1.
02 · LPSM, the one name
Four slots name every workload
In one line LPSM is a coordinate, not a machine. Four slots — Landscape · Platform · Service · Module — name every deployed workload in the fleet.
raichu, lapras, castform…<p>.carbon repo. Example: argon.<p>.<svc>. Example: argon.zinc.maindb), a cache.Sources: ARCHITECTURE.md §2 (LPSM, the closed roster of landscapes). Colours follow the legend used by the name builder in tab 3.
Physically DNS names. A serving workload is reached at <module>.<service>.<platform>.<landscape>.cluster.atomi.cloud — the coordinate reversed: module first, landscape last.
Press ▶ Play: each coordinate slot flies to its place in the hostname — in reverse order.
*.<l>.cluster.atomi.cloud points at the load-balancer IPs of that landscape's healthy clusters (the ones with traffic: true passing the 5-second health poll).mew and celebi get an explicit record per service, answered by the healthy host landscapes named in the envelope.<module>.<service>.<platform>.<instance>.<landscape>.<zone>. The zone comes from operator policy, never from the app.Sources: ARCHITECTURE.md §2 (hostname forms), §4 (wildcards, v-landscape records); concepts/environments.md §1.1 (instance surface name).
In one line One coordinate, four naming systems. The same LPSM value decides the public hostname, the secret address, the Helm name and outside resource names — nothing is named by hand.
Error records (the Problem custom resource) are named {service}.{module}.{landscape}.{version} today, which leaves out platform. A proposal to name them in full LPSM order is waiting on your answer in the error-records agenda item.
Sources: ARCHITECTURE.md §2, §7 (secret address), §9 (external names); goals/instance-segment-naming.md; goals/helm-wrapper.md (fullname rule).
Physically The instance is a naming add-on, not a fifth slot. It is added only where a physical name must be unique: one developer, one CI run, one preview.
Press the buttons above to compare the two roles.
otter-beats-potato; the same manifest re-requested while live simply joins that preview.Sources: ARCHITECTURE.md §2 (instance is a Garden projection, not a fifth slot); concepts/environments.md §1.1 (cleanup selection), §3 (petname).
03 · The eight landscapes
A landscape is a rule set, not a place
Physically A landscape is a row of settings, not a machine. It fixes four rules for everything deployed in it; the machines come from clusters, and several clusters can share one landscape.
Source: concepts/environments.md §0 (the landscape matrix requirement: a landscape row is configuration).
In one line Eight kinds: primordial, serving, and six Garden profiles. Serving is one rule set behind four host landscapes (pichu, pikachu, raichu, ampharos) plus the two DNS-only names mew and celebi.
Sources: environments.md §1 (the eight), §1.3 (one paragraph each). The picker above shows each one's rules.
In one line Six profiles, one deployment graph. The same Garden machinery runs all six; only the settings change — including which build modes each profile allows.
sync = hot reload from source.
All six Garden profiles side by side build modes · data · secrets · edge
| Landscape | Runs on | Build modes | Data | Secrets | Edge |
|---|---|---|---|---|---|
| lapras | laptop k3d, kept | sync · build-local · target-pull | local CNPG, Dragonfly, MinIO, Mailpit, local Logto | read-only lapras seed; no writes | Boron direct to approved services |
| ditto | fresh cluster per test run | build-local · target-pull | deterministic fixtures | read-only ditto seed + demo credentials | loopback-only local kgateway |
| rotom | laptop k3d, offline, kept | sync only | signed offline bundle only | fake local store; zero keys | loopback-only local kgateway |
| absol | fresh cluster per run, offline | build-local from bundle | same bundle as rotom | fake local store; zero keys | loopback-only local kgateway |
| eevee | vcluster on ENTEI, one per person | sync · build-local · target-pull | local dependencies on host volumes | read-only eevee seed | ENTEI shared edge, real HTTPS |
| castform | vcluster on ENTEI, one per preview | target-pull only | forks of Neon, Upstash, Tigris | read-only castform seed + short-lived doors | ENTEI shared edge |
Build modes: sync = hot reload from source; build-local = build the image on this machine; target-pull = pull the exact image CI built (by digest).
Source: environments.md §1.2 (posture table). Watch one come up piece by piece in section 08 · Garden in motion.
Physically ENTEI is one registered cluster with role anonymous-vcluster-host and traffic: false. It is not a landscape; it hosts the eevee and castform virtual clusters.
- ENTEI is one registered cluster with role
anonymous-vcluster-hostandtraffic: false. - It hosts the eevee and castform virtual clusters (vclusters). It runs no application, no shared Logto and no shared database.
- It shares only the public gateway (kgateway), cert-manager, DNS/TLS for hosted names, and the exposure materializer.
- If ENTEI dies, eevee and castform go down together. Serving is not affected.
Source: environments.md §1.1 (the ENTEI boundary). Try the button above the picture.
04 · How each landscape starts
Three ways in: bootstrap, Git, or pls
Physically One bootstrap, ever. The seed-cluster bootstrap creates Primordial — a single VM running a one-node k3s cluster — and its root of trust is the SOPS root key.
Sources: concepts/seed-cluster.md (single-node k3s on one VM, SOPS via cloud-init); ARCHITECTURE.md §10 (the L0 seed sequence).
Physically A serving landscape starts with one pull request to fleet/registry/. A new platform or service starts with no fleet pull request at all — creating its GitHub repo is the registration.
fleet/registry/. The cluster controller provisions it; the platform opts in by listing the landscape in its platform.yaml.<p>.carbon repo. SCM discovery does the rest — no fleet pull request.<p>.<svc> repo. The materializer writes the row stubs and the machine roster; no fleet pull request.traffic: true|false on the cluster. Off leaves DNS in about 5 seconds; the cluster keeps running.Source: ARCHITECTURE.md §11 (ops traces), §8 (name-is-registration).
Physically pls is a command-line tool on your machine. It is shipped by the garden-k3d-profiles node and runs Garden, the one deployment graph behind all six development profiles.
pls env up --profile <p>, with a build mode: --sync, --build-local, or --target-pull --artifact <digest>.pls env down --profile <p> stops it; pls env reset --profile <p> deletes the edge objects, then the cluster.pls env doctor --profile <p> is read-only: it checks without changing anything.Source: goals/garden-k3d-profiles.md (the pls command surface).
In one line Pick a landscape, see its exact start sequence — the commands that run and the order they run in.
Sources: environments.md §1.3, §3; goals/garden-k3d-profiles.md (pls commands); goals/garden-vcluster-profiles.md (eevee, castform); goals/ci-k3d-lanes.md (nsc lanes); ARCHITECTURE.md §10–§11.
05 · Planes
Primordial decides, clusters serve
In one line A plane is a group of machines with one job. Four of them: control, serving, development, edge. Control flows one way: from Primordial outward, never back.
The execution plane is the machinery that builds diene itself (the ratchet: nodes, rounds, reviews). Its identifiers never appear in shipped docs. See section 13.
Sources: ARCHITECTURE.md §3 (the physical fleet), §4 (DNS and edge docs).
Nothing on a live request path depends on Primordial. Primordial composes desired state. If it is down for hours, deploys pause; traffic, failover and login keep working.
Physically One request path, and Primordial is not on it. A user's request touches DNS, a cloud load balancer, the cluster gateway, and pods — never Primordial.
Press ▶ Play and watch one request cross four machines — none of them Primordial.
Sources: ARCHITECTURE.md §1 (axiom 7), §3, §4 (failure rungs).
In one line Every dependency is three layers. An app holds the contract; the data plane serves requests; the provisioning plane creates and resizes — and never sits on the traffic path.
| Layer | What it is | Where it lives |
|---|---|---|
| Contract | Endpoint, credentials, behaviour. Same for every realization. | the app's config + secret names |
| Provisioning plane | Creates and resizes the dependency. Never on the traffic path. | Primordial (vendor APIs) |
| Data plane | The only layer that requests actually traverse. | vendor or in-cluster engine |
Source: ARCHITECTURE.md §7 (T4-LAYERS, three layers of dependency design).
In one line delivery says where a dependency is realized — at a vendor, in every cluster of the landscape, or inside one Garden instance.
| delivery | Meaning | Used for |
|---|---|---|
| external | A vendor's data plane, reconciled from Primordial | Neon (Postgres), Upstash (KV), Tigris / R2 / S3 (storage) |
| replicated | Fanned out to every eligible cluster of the landscape | Dragonfly cache only (one instance per claim) |
| local | Applied directly inside one Garden instance | CNPG, MinIO, Dragonfly KV + cache, Mailpit |
Source: ARCHITECTURE.md §7 (delivery is module-level and explicit on every type).
Sources: ARCHITECTURE.md §1 (axiom 7), §3, §4, §7 (T4-LAYERS, delivery); environments.md §1.2; rules/AUTHORING-RULES.md (execution plane).
06 · Charts
The 2-chart law, used twice = 4 charts per platform
Physically Two Helm charts inside every service repo. One repo, one version number, two charts: the app chart and the primordial chart.
fleet/platforms/<p>/landscapes/<l>/<svc>.yaml. The pair contains everything the service needs in isolation.Sources: ARCHITECTURE.md §1 (axiom 5, the 2-chart law), §8 (repos, release trace).
Physically Four chart kinds per platform. The 2-chart law is applied twice: once for the platform's carbon home repo, once per service repo.
Sources: ARCHITECTURE.md §1 (axioms 3 and 5), §8; goals/charts/carbon.md (app + primordial halves).
Physically One Helm chart in a folder of the fleet repo: fleet/registry/charts/diene-platform, the compiler chart.
Platform custom resource, the Kargo Project with one pipeline per service, and the platform ApplicationSet.machinery-stable. Every other chart in the fleet is published as OCI.main with auto-sync off: a human reviews the rendered diff before anything syncs. Real platforms ride machinery-stable.Sources: ARCHITECTURE.md §8 (three sources, compiler-chart versioning); goals/fleet.md (tag mechanics).
Physically Argo Applications are Kubernetes objects on Primordial — one per chart destination. Counting them is counting multiplications.
Counts follow ARCHITECTURE.md §8: g1 = one primordial Application per service × landscape; g2 = one app Application per service × landscape × cluster. Carbon is an ordinary chart-only service, so it counts as one more service here.
Sources: ARCHITECTURE.md §8 (g1/g2), §1 (axiom 3).
Physically A row file is one small YAML file — one per service per landscape in fleet/platforms/<p>/landscapes/<l>/<svc>.yaml. Kargo edits it to promote.
values.<landscape>.<cluster>.yaml.values: block is a short-lived ops knob (scale now, flip a flag). It is folded back into the chart at the next release; a probe flags overrides older than 7 days.Where config values come from, in order last one wins
values.yaml: the chart's base.values.<landscape>.yaml: the landscape overlay.values.<cluster>.yaml: the cluster overlay, usually one identity value.- The row file's optional
values:block: a short-lived ops override, folded back into the chart at the next release. A probe flags overrides older than 7 days.
Landscape and cluster are two independent stacked dimensions, never one combined file.
Sources: ARCHITECTURE.md §1 (axiom 5), §8 (row values, Kargo per-service promotion); goals/helm-wrapper.md (overlays).
07 · Deploy, animated
Tap a repo, watch its charts land
platform.yaml.In one line Tap a repo and count how many charts it ships, how many Applications ArgoCD makes, and where each one lands, including the databases its PlatformDependency creates.
Tap a repo (in the picture or here) Landscapes listed in argon.carbon's platform.yamlTap argon.carbon to start.
In one line The same deploy in time order: platform argon is registered, then zinc 1.4.3 travels from a merge to Ready pods on all 5 clusters.
3D · argon's first deploy, step by step · drag to turn, pinch to zoomTop: GitHub. Middle: Primordial (one VM running a k3s cluster). Front: the 5 host clusters (example names). Right: services outside Primordial. 2 replicas per cluster is an example.
Sources: ARCHITECTURE.md §8 (repos, discovery, three sources, g1/g2, Kargo per-service promotion, release trace), §9 (controllers), secrets-chain.md (Platform CR write path).
08 · Garden in motion
pls env up, piece by piece
pls drives it.In one line Three questions pick the profile: whose machine (yours, a throwaway, or the shared ENTEI host) · what data (local copies or a fork of real data) · how long (kept, one run, or leased).
- Writing code on your laptop, with internet — everyday work, hot reloadlapras
- No internet at all — plane, train, outage; keep working offlinerotom
- A CI test run — integration tests that must repeat exactly, onlineditto
- An offline CI run — hermetic tests with captured evidenceabsol
- Need a real HTTPS URL — share your dev stack, work from any machine, let your agent use iteevee
- See one change against real data — review a preview before it shipscastform
lapras
- Where
- Your laptop — k3d cluster in Docker, one per developer per repository
- Network
- Full network; you reach services through Boron, a private outbound tunnel. No public route
- Real data?
- No — local copies only (CNPG, Dragonfly, MinIO, Mailpit, local Logto)
- Lifetime
- Kept:
downkeeps the cluster;resetdeletes it - Cost
- not stated
- Startup time
- not stated
ditto
- Where
- A fresh throwaway cluster per run — k3d on a laptop, or the built-in k3s of a one-shot nsc CI machine
- Network
- Loopback only; egress denied by default; never Boron, never public DNS
- Real data?
- No — deterministic versioned fixtures, same every run
- Lifetime
- One run, never reused;
nsc destroy --forcealways runs in CI - Cost
- not stated
- Startup time
- not stated
rotom
- Where
- Your laptop — k3d cluster, kept; offline
- Network
- Zero network, proven before the cluster exists; loopback-only local kgateway
- Real data?
- No — everything loads from a signed offline bundle
- Lifetime
- Kept across down/up
- Cost
- not stated
- Startup time
- not stated
absol
- Where
- A fresh throwaway cluster per run (laptop or one nsc CI machine); offline
- Network
- Denied before the cluster is created; loopback-only local kgateway
- Real data?
- No — the same signed bundle and fixtures as rotom
- Lifetime
- One run; deleted unconditionally after evidence capture
- Cost
- not stated
- Startup time
- not stated
eevee
- Where
- Your own virtual cluster on ENTEI, the fleet's one shared development host
- Network
- ENTEI shared edge: real public HTTPS on your claimed hostnames; no inbound callbacks
- Real data?
- No — local dependencies on host-backed volumes; no fork door
- Lifetime
- Renewable lease, days or weeks; 4 slots in the fleet, at most one per person
- Cost
- not stated (capacity per allocation: 6 CPU · 16 Gi · 120 pods)
- Startup time
- not stated
castform
- Where
- One virtual cluster on ENTEI per immutable pinned set; named by a petname like
otter-beats-potato - Network
- ENTEI shared edge; a production-source preview stays dark until its safety check is signed
- Real data?
- Yes — forks (copies) of real Neon, Upstash and Tigris data. The only development landscape with real data
- Lifetime
- Leased: explicit close, with a 7-day renewable TTL as backstop
- Cost
- not stated
- Startup time
- not stated end-to-end. The data forks alone: Neon branch under 1 s, Tigris instant, Upstash restore in minutes
Money cost is not stated anywhere in the design docs for these six; "not stated" means exactly that. Watch any profile come up piece by piece in the animation below. Preview forks in detail: section 09.
Sources: concepts/environments.md §1–§1.3; goals/garden-k3d-profiles.md (profile table, pls commands); goals/garden-vcluster-profiles.md (eevee, castform); goals/dependency-operator.md (fork timings); ARCHITECTURE.md §3 (ENTEI).
Physically A k3d cluster inside Docker on your laptop — one per developer per repository, kept across down/up. Connected: it may use the internet.
pls env up --profile lapras --sync (hot reload), or --build-local / --target-pull --artifact <digest>. One-time per machine: pls setup.pls env down keeps the cluster; pls env reset deletes the edge objects first, then the cluster.Source: concepts/environments.md §1.2–§1.3 (lapras row and page); goals/garden-k3d-profiles.md (profile table, substrate, pls commands); goals/charts/boron.md (private outbound tunnel, lapras only).
Physically A brand-new throwaway cluster per test run — k3d on a laptop, or the built-in k3s of a one-shot nsc CI machine that is destroyed afterwards.
nsc create --ephemeral), then the driver runs pls env up --profile ditto --target-pull --artifact <digest> (or --build-local).nsc destroy --force runs in an unconditional cleanup step; all credentials die with the run.Source: concepts/environments.md §1.2–§1.3 (ditto row and page); goals/garden-k3d-profiles.md (substrate nsc-k3s, profile table); goals/ci-k3d-lanes.md (nsc lifecycle).
Physically A k3d cluster on your laptop, sealed: zero network is proven before the cluster exists, and everything it needs arrives in a signed offline bundle.
pls env up --profile rotom. Sync (hot reload) is the only build mode; nothing is ever pulled.down/up.Source: concepts/environments.md §1.2–§1.3 (rotom row and page; local Mercury fed by a callback injector); goals/garden-k3d-profiles.md (sync only, fake-local secrets, offline closure).
Physically A fresh throwaway cluster per run, offline — on a laptop or one nsc CI machine. The network is denied before the cluster is created; images are built only from the signed bundle.
pls env up --profile absol --build-local --artifact <digest>. The image must come from the verified offline closure.Source: concepts/environments.md §1.2–§1.3 (absol row and page); goals/garden-k3d-profiles.md (build-local from closure, run-once lifecycle).
Physically Your own virtual cluster (vcluster) on ENTEI, the fleet's one shared development host. Each allocation: 6 CPU · 16 Gi · 120 pods; 4 slots in the fleet; at most one active per person.
pls env up --profile eevee. The allocator authenticates you (fleet single sign-on) or your agent (a rotating token) and creates or reuses your one vcluster.Source: concepts/environments.md §1.2–§1.3 (eevee row and page); goals/garden-vcluster-profiles.md (profile table, TTL policy); ARCHITECTURE.md §3 (ENTEI shares only the gateway, cert-manager and exposure machinery).
Physically One virtual cluster on ENTEI per immutable pinned set — a manifest that fixes every service's exact version. Named by a petname like otter-beats-potato.
pls env up --profile castform submits a mint request: forkSource (staging or production), the default channel, and a pin per service. Newer commits later mean a new preview, never an update.Source: concepts/environments.md §1.2–§1.3 and §3 (castform row, preview rulings); goals/garden-vcluster-profiles.md (profile table); fork mechanics: section 09.
Sources: environments.md §1.1–§1.4; goals/garden-k3d-profiles.md, goals/garden-vcluster-profiles.md, goals/ci-k3d-lanes.md; ARCHITECTURE.md §3, §4 (ENTEI traffic path).
09 · How a preview fork works
castform copies real data, then throws it away
- Dragonfly (cache or KV), MinIO, R2 and S3: the fork is refused with a
ForkUnsupportedcondition. Nothing is faked. - Local CNPG has no fork mechanic. A local module that needs real data uses a remote Neon branch instead.
Sources: environments.md §3 (preview model, R-P1…R-P9), §1.2 (castform row); goals/dependency-operator.md (fork mechanics table, broker-only creation); goals/fork-reaper.md (release steps); ARCHITECTURE.md §5 (forked identity safety).
10 · Multi-region
Login is global, data is local
- Home-sharding: each user has one home landscape per platform, stored as a claim in that platform's identity.
- Production has two home landscapes today: raichu (Singapore) and ampharos (US).
- Each landscape has its own Logto issuer and its own dataset. There is no cross-region database.
- Caches stay regional with a time limit (TTL).
In one line One home landscape per user per platform — a claim stored in that platform's identity. Everything the user owns lives there: login, API traffic and data.
home_landscape. The app checks the claim on every sign-in and sign-up: present means go straight home.Sources: ARCHITECTURE.md §1 (axiom 1), §2 (host landscapes, clusters), §5 (home claim); concepts/environments.md §1.
In one line Sign-in works from anywhere because the app already knows its home landscape's login address — it is baked into the app at build. The data never leaves the home landscape.
Sources: ARCHITECTURE.md §2, §5 (one issuer per landscape, client flow, token lifetimes); concepts/lib-contracts.md §3 (issuer baked at build); concepts/authorization-pattern.md (home-landscape claim).
In one line No home yet → the picker: the app fetches the landscape selector doc, pings each region, the user picks a home, then login and onboarding write the home claim.
home_landscape into the user's custom_data through the login service's Management API; a token script then stamps the claim onto every issued token.Sources: concepts/deferred-login.md (handoff × onboarding); concepts/lib-contracts.md §4 (the landscape list trigger); ARCHITECTURE.md §4 (the landscape list), §5 (client flow); concepts/authorization-pattern.md (home-landscape claim).
In one line Clients hold ONE hostname — their home landscape's. Changing homes is a data move plus a claim rewrite, never a routing trick.
Sources: ARCHITECTURE.md §4 (dormant rescue, failure rungs), §7 (vendor posture: RPO/RTO, cross-vendor backups), §11 (remove landscape · re-home users first); the failure drill lives in section 14.
In one line One strongly-consistent global database was checked and rejected on evidence. Home-sharding stands: login global, data local.
Sources: ARCHITECTURE.md §2 (multi-region model, rejected alternative), §7 (cache doctrine); concepts/environments.md §0.6 (non-goals).
In one line mew and celebi are DNS-only names over host landscapes. Callers who cannot hold a hostname — OIDC browsers, webhook senders — get one stable address that survives region changes.
{name, hosts}: which host landscapes may serve the name. A v-landscape owns no clusters, no apps, no data. mew is production; celebi is staging.serve: true.Sources: ARCHITECTURE.md §2 (virtual landscapes), §4 (geoproximity, explicit records, the 5-second poll), §6 (webhook name example).
Sources for this section: ARCHITECTURE.md §1, §2, §4, §5, §6, §7, §11; concepts/deferred-login.md; concepts/authorization-pattern.md; concepts/lib-contracts.md §3–§4; concepts/environments.md §0.6.
11 · Mercury
Mercury: webhooks in, signed delivery out
- Mercury is the fleet's webhook product. Providers call one stable name; Mercury checks the signature, stores the event, then delivers it to the right service — signed, retried, replayable.
- It is an ordinary service: one repo, one image, the usual two charts — and the fleet's one deliberate multi-tenant exception.
- Delivery is at-least-once. Consumers must treat every delivery as possibly repeated; ordering is never promised.
Physically A Bun web service in a pod, deployed like any other service — one repo, one image, the standard app chart + primordial chart pair — running on its own registered platform. Not a Cloudflare Worker, and nothing of it runs on Primordial.
mercury.carbon, service repo mercury.webhook). It owns its rows, its virtual landscape and its own promotion stages, exactly like any platform.hooks.webhook.mercury.mew.cluster.atomi.cloud. mew is production, celebi is staging. Route 53 geoproximity answers with the nearest healthy landscape. See section 10.Sources: goals/mercury.md (kind, purpose, landscape ruling), concepts/ARCHITECTURE.md §6, concepts/environments.md §6 (shared-service table).
In one line land → verify → dedup → persist + enqueue → ack 200 → deliver — fixed, landscape-local, and durable before anything is acknowledged.
WebhookRoute fragments ride each receiver service's own primordial chart (zinc ships one). The platform's WebhookEngine rides carbon's. The controller merges fragments; Mercury alone compiles the per-landscape candidate config into Upstash.200 from exactly one candidate = "mine". 421 from every other = "not mine". Anything else — zero, several, half-answered — is refused loudly. A retry re-probes the whole current set, never one remembered endpoint.Sources: goals/mercury.md §3–§4 (pipeline, dedup, delivery, retry), concepts/ARCHITECTURE.md §6 (candidate addressing, DNS), concepts/environments.md §6 Mercury row.
Physically Mercury's management API is a Logto API resource. Machine callers get tokens from that landscape's own Logto (its machine-to-machine door); Mercury checks them against that same Logto. Mercury itself issues no machine tokens.
internal/<platform> tenants, registered through Git (the custom-resource door). External customers are external/<slug> tenants using the same management API with signup. Both sit under the landscape's Logto.Sources: concepts/environments.md §7 (the shared-service Logto authorization rule, Mercury plane table, audience format), goals/mercury.md (common-service contract), concepts/ARCHITECTURE.md §6.
Physically A fresh local copy of Mercury on your machine — one pod in your Garden cluster, fed by a local injector. The only landscapes without any Mercury are ditto and eevee, where inbound webhooks are simply off.
Sources: concepts/environments.md §1.2 (posture table) and §6 (Mercury cells); goals/garden-k3d-profiles.md (the ruled local-Mercury decision, profile posture); goals/host-pool.md (castform containment). How each landscape starts: section 08.
In one line At-least-once, unordered, durable before acknowledged — and the rules around it are fixed, not knobs.
200. A failure before the durable write returns 5xx so the provider retries; a hiccup after persistence must never become a provider-facing 4xx.- Seven verification adapters in v1: Stripe-style HMAC, Airwallex, Apple, Play Store, Telegram, Discord, Logto. After the last route for a provider is deleted, a grace period keeps its verification config and alerts instead of silently rejecting a live provider.
- Provider operations stay reconciled: an Apple backfill job runs as a singleton; Play Store realtime notifications pin 31-day retention and an explicit dead letter, with drift continuously corrected.
- v1 has no payload transformation and no separate durable-subscription product: registered routes plus bounded delivery obligations are the whole surface.
- Custom domains are routing only: two CNAMEs (traffic + DNS-01), identity never derives from them.
Sources: goals/mercury.md §4.2–§4.3 and Rules in force; concepts/ARCHITECTURE.md §6. What breaks when pieces fail: section 14.
12 · Runtimes and runners
Five languages, one runner per job
Physically Programming languages plus the shared libraries each one gets. Every template and every lib/<lang>-* library in the graph belongs to one of five runtimes.
| Runtime | Templates | Libraries (lib/<lang>-*) |
|---|---|---|
| Bun (TypeScript) | bun-base, bun-lib, bun-cli, bun-consumer, nextjs-frontend | result, interfaces, core-utils, config, otel, problems, auth-engine, api-engine, frontend-utils, standard-config, e2e |
| .NET | dotnet-base, dotnet-lib, dotnet-api | result, interfaces, core-utils, config, otel, problems, auth-engine, api-engine, server-engine, standard-config, e2e |
| Go | go-base, go-lib, go-consumer, operator-template | errors-problems, interfaces, core-utils, config, otel, auth-engine, api-engine, standard-config, e2e |
| Dart / Flutter | dart-lib, flutter-base, flutter-e4 | result, problems, interfaces, core-utils, config, auth-engine, api-engine, e2e |
| Next.js (web) | nextjs-frontend, frontend-standalone-chart | uses the Bun libraries |
lib/bun-result — the Result and Option library every Bun service uses.result → interfaces → core-utils, so the shared ideas behave the same everywhere.Sources: ARCHITECTURE.md §3, §3.1, §8, §10; the build graph (templates and lib/<lang>-* units, 2026-11-07); concepts/lib-contracts.md.
In one line Pick a language, see its templates, its libraries, and who builds it.
nscloud-ubuntu-26.04-amd64-16x32, fallback nscloud-ubuntu-24.04-amd64-16x32 — never both.Sources: the runtimes table above; goals/ci-k3d-lanes.md (runner labels); ARCHITECTURE.md §8 (one semver per repo).
Physically Six runners, one job each. A runner is the program or service that executes one kind of work — never two kinds.
plsRuns the one deployment graph for all six development profiles. Owns up, down, reset.
Run Primordial and serving only. Argo syncs Git to clusters; Kargo promotes one service's release stage by stage.
CI. Runner label nscloud-ubuntu-26.04-amd64-16x32. Fallback: nscloud-ubuntu-24.04-amd64-16x32.
ditto and absol tests each get one throwaway nsc machine with built-in k3s, then nsc destroy --force.
The per-repo command surface: build, test, chart tasks. Files are .yaml.
Only two kinds: web frontends (Next.js) and erbium's error portal. Released as tagged versions through CloudflareDeploy.
Sources: ARCHITECTURE.md §3, §8, §10; environments.md §1.2; goals/ci-k3d-lanes.md.
Physically Four ways a Kubernetes cluster comes to exist — the substrate decides who owns the cluster and how long it lives.
| Substrate | Used by | Lifetime |
|---|---|---|
| k3d | lapras, rotom (laptop) | kept across down/up |
| nsc k3s | ditto, absol (CI) | one run, then destroyed |
| vcluster on ENTEI | eevee, castform | lease: days–weeks (eevee), 7-day renewable (castform) |
| Provider clusters | serving (DigitalOcean, AWS, OCI; EKS Auto Mode is the AWS direction) | permanent; removed only by Decommission |
EKS Auto Mode is assumed green — an engine decision, not a vendor-verified fact. Production use waits on your live test of aws-load-balancer-eip-allocations.
Sources: ARCHITECTURE.md §3, §3.1 (EKS Auto Mode posture); environments.md §1.2; goals/ci-k3d-lanes.md.
13 · How diene itself is built
Templates branch on three switches
Physically A tree of sample repositories. Every template is a working repo that builds and passes CI; every real repo is stamped from one.
- Every template starts as a working sample repo that builds and passes CI.
- Templates form a tree from
workspace→shared. Each child removes or adds one capability. - The switches (dimensions): language, Helm on/off, Docker on/off, observability on/off.
Sources: the build graph (template nodes and edges, 2026-11-07); goals/workspace.md, goals/shared.md.
Physically Four kinds of edge between nodes in the build graph. Each link says exactly why one node points at another.
| Link | Meaning | Example |
|---|---|---|
| template-depend | A template built on a parent template | shared → bun-base |
| template-materialize | Real code created from a template | bun-lib → lib/bun-result |
| library-depend | Code that uses a published library | lib/bun-result → lib/bun-config |
| execution-depend | Needs another node to run its proof | observability-block → bun-base-w-observability |
Sources: the build graph (node types template and code, edge kinds); goals/observability-block.md.
Physically Four planes a piece of diene code lives on — from sample repo, to real code, back to template, to your real repo.
Working sample repos, e.g. helm-wrapper. Released as CyanPrint templates.
Real code materialized from a template, e.g. charts/carbon (copied from helm-wrapper).
Code turned back into a template, e.g. the new carbon-template node.
One real repo per platform or service, stamped with cyanprint create, e.g. mercury.carbon.
Sources: the build graph (template, code and publish nodes); the carbon goal discussion.
Physically The build engine works in rounds. A unit is one template or library the engine builds and checks on its own; a round is one finished chunk of that unit's work.
Sources: the build engine's public vocabulary (unit, round, review, held, mirror) as defined on this page's open-decisions section; the build graph, 2026-11-07.
14 · Failure drill
Break one piece, see what still works
Physically The live request path never touches Primordial. A request goes DNS → cloud load balancer → cluster gateway → pods. Primordial only composes desired state, off to the side.
Sources: ARCHITECTURE.md §1 (axiom 7), §3, §7.
In one line Tap a broken piece; the drill lists what keeps working and what stops.
Sources: ARCHITECTURE.md §1 (axiom 7), §3, §4 (failure rungs, Cloudflare outage posture), §7 (vendor posture); environments.md §1.1 (ENTEI).
Physically Every failure has a measured recovery time — seconds for machines, hours only when data must be restored.
Sources: ARCHITECTURE.md §4 (5-second poll, ~5–10 s trim, Cloudflare outage posture), §3 (Infisical posture), §7 (vendor posture).
15 · Glossary
Every word on this page
- LPSM
- Landscape / Platform / Service / Module: the four-slot name of every deployed workload.
- Landscape
- A rule set for secrets, data, lifetime and network edge. One landscape = one consistent dataset per platform.
- Host landscape
- A landscape that owns clusters: pichu, pikachu, raichu, ampharos.
- Virtual landscape
- A DNS-only name over host landscapes: mew, celebi. Owns no clusters or data.
- Cluster mark
- A gem name (opal, ruby, emerald…) that shows the provider. A cluster = landscape × mark.
- Gem siblings
- Two clusters of one landscape, same dataset, used for blue/green cutover.
- Primordial
- The one permanent control-plane cluster: ArgoCD, Kargo, operators, Infisical.
- ENTEI
- The one host cluster for eevee and castform vclusters. Not a landscape.
- Instance
- One developer, run or preview inside a landscape. A naming add-on, not an LPSM slot.
- Allocation ID + generation
- The only key used to clean up or fence an instance.
- Garden
- The tool that runs the deployment graph for development profiles.
pls- The command-line tool that drives Garden:
pls env up,down,doctor. - vcluster
- A virtual Kubernetes cluster that runs inside a host cluster.
- Carbon
- A platform's home repo (
<p>.carbon). Creating it registers the platform. - Row
- One file per service per landscape in
fleet/platforms/<p>/landscapes/<l>/<svc>.yaml. Kargo edits it to promote. - T3 / fleet-operator
- The operator on Primordial with the cluster, platform, dependency, traffic, webhook and cf-deploy controllers. Graph node: dependency-operator.
- SoS
- Secrets-of-secrets: the Infisical project that holds each platform's machine credentials.
- ESO
- External Secrets Operator: copies secrets from Infisical into Kubernetes Secrets.
- forkSource
- castform's setting:
stagingorproduction. Production needs a separate grant and allows one preview at a time. - Decommission
- The explicit custom resource that deletes something for real. Deleting a repo or a CR alone never destroys data.
16 · Your open decisions
Eight cards, answers first
- Eight questions from the build engine are waiting on your answer. Each tab is one card: the question first, then the concepts you need, where things stand, and links.
- Nothing merges by itself. Review pages are for reading and comments; your answer on the card is what unblocks work.
- Unit: one template or library the engine builds and checks on its own, e.g.
bun-base. The tree of units is in How diene is built. - Round: one finished chunk of a unit's work, checked by the engine before it is shown to you.
- Review: a GitHub pull request you read and comment on. Approving records your OK; it never merges anything.
- Held: the engine will not finish a held unit until you answer.
- Mirror: a unit's own public GitHub repo in the ProtoDurian organization. Review pages live in
ProtoDurian/diene.all; goal drafts (what "done" means for a unit) live inProtoDurian/diene-corpus.
You approved the monitoring add-on, on one condition: one short section that lists the 3 dashboard test layers in order gets written in. The card is resting until that round lands; then you check that one section.
-w-observability then come to you for review, one by one.observability-block: monitoring documentation, five Grafana skills and a dashboard sandbox, built on the shared template and mixed into every template ending in -w-observability. How diene is built- Rounds 12 to 17 are ready for your approval together; the checks on the public mirror are green (3 of 3).
- Your three picks are in: the log-panel table with evidence panels, text panels to introduce sections, and the longer log-level format list.
- A fresh agent ran all five skills using only these docs: 5 of 5 passed.
- The query-check tool does not block this approval.
- Review page: rounds 16 to 17 — everything since the version you last looked at; 15 files, documentation only.
- The full rewrite: rounds 12 to 15 — the version you already reviewed; 41 files.
- Query-check goal draft — the new tool's goal, for your review; its checks fail on purpose until the engine gives the tool its own unit.
Nothing to decide yet. Your feedback is in; lib/bun-result is being fixed and its review comes back to this card. Approving that review publishes version 1.1.0.
map. No API change; async stays async.should helper such as await actual.should.be.equal(expected).result, then interfaces, then core-utils. Runtimes and librariesOk (a value) or Err (a failure) instead of a thrown error. Example: Ok(5), Err('bad').isOkSync() and isErrSync(): instant checks, meant for when the answer is already known. Two cases still throw today; both are fixed this round.- Fix order:
bun-base, then the four library templates, thenlib/bun-resultwith theshouldhelper and both sync fixes. - The consumer-test rule is merged into the goal files (link below).
dart-libis the first template with the consumer test: its round 19 landed, checks green, reviewer approved; its review is queued.- When
lib/bun-resultlands, a new review page comes to this card; approving it publishes 1.1.0 to npm, the public JavaScript package store.
- lib/bun-result review page — the version already open; it shows only what
lib/bun-resultadds on top ofbun-lib. - Consumer-test rule — the goal-file change, already merged.
Two answers, ruled as a pair: confirm that a new carbon-template unit publishes the carbon template, and choose how mercury.carbon gets made — hand-built once (recommended) or stamped by the engine.
carbon-template unit publishes the template; a person runs the scaffold once and edits platform.yaml. Carbon's hold lifts immediately.mercury.carbon, re-stamping it when the template changes. No new unit, but carbon mixes a Helm chart pair with a scaffold generator.mercury.carbon. Creating that repo is what registers a platform. Glossarycharts/carbon is the code (a Helm chart pair); carbon-template is the new publish step; each platform's carbon repo is an instance. How diene is built- Your carbon-template pick is held until you confirm it;
charts/carbonstays held on this pair; nothing was reverted. - 14 units wait behind carbon (fork-reaper, the Garden profile units, logto-operator, mercury and others); they are not held themselves.
- This ruling removes one blocker, not all: carbon also waits on other open questions through its parent units.
- Everything here is at zero; no deadlines.
- carbon-template goal draft — written, but unmerged until you confirm your pick.
Three answers on error records: confirm that the module is part of a record's identity; rename records to LPSM order (recommended); let each app template own its error-portal pieces (recommended).
lapras.nitroso.zinc.api.v1 (landscape.platform.service.module.version). Same order as the error pages' URLs; readable on its own; cheap now because nothing is published yet.zinc.api.lapras.v1 (service.module.landscape.version). Platform lives in the Kubernetes namespace, so the name skips it.Problem) per landscape + platform + service + module + version, listing every error a service can return: id, HTTP status, retryable or not, data shape. The naming note in LPSM names is this very question.bun-consumer, dotnet-api, go-consumer (back ends), nextjs-frontend (web), flutter-base (mobile). Runtimes and libraries- Your "module counts" pick is held as a draft until you confirm.
- Nothing is published under the current name; renaming touches only the four problems libraries and two goal files.
- error-portal is held as a draft; nothing sits downstream of it.
- None on this card.
Decide the mobile template's shape: split flutter-base into a v1 unit plus a later flutter-e4 unit (already drawn, nothing built), or keep one unit — and if split, two follow-up answers.
flutter-base.-w-observability templates.- Both flutter units are paused on this card; the split is kept in the graph, not undone, and nothing has climbed.
- The two follow-ups (adapter owner, link checks) only matter if the split stays.
- None on this card.
Give the two naming libraries publishing homes: their own repos with the usual diene names (recommended), their own repos with names you pick, or folders inside their parents' repos.
diene.instance-segment-naming and diene.fork-name-qualifier. No re-checks, no patch rounds.- Both units are held here and on the preview fingerprint decision (Preview pieces tab); both rulings must land before either starts.
- 11 units wait behind
instance-segment-naming; 4 sit downstream offork-name-qualifier. - No deadlines — but a published name is the name you keep.
- None on this card.
Pick the owner of the two trusted preview pieces: a new preview-assembler unit builds the fingerprint and the assembler (recommended), or the existing fork-reaper absorbs them.
- Nothing is ruled and nothing is built: 6 units are held on this, plus 11 behind them.
- Two of those units also wait on the naming-libraries decision; both cards must clear to free them.
- None on this card.
Approve the helm-wrapper template, or comment on its review page and ask for changes.
helm template, then kubeconform (schemas), then the admission rules through kyverno apply.- Approved:
dotnet-base,shared-wo-docker-helm,go-base-wo-helm. - Approved with 2 fixes:
bun-base. The Biome format script stops runningbun install, and the Express example leaves the validation doc. The fix round arrives as its own card. - From now on, every review gets its own card.
- helm-wrapper review — first review, rounds 1–14, 98 files.
Sources: the eight open decision cards, 2026-11-07. Concept links point at the sections above on this page.