DIENE · Ecosystem map · design as of 2026-11-07

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.

Source of truth for every statement here: the diene design corpus (concepts/ARCHITECTURE.md, concepts/environments.md, concepts/secrets-chain.md, and the node goals in goals/), corpus main e0568f0 (2026-11-06). Each section ends with its source files. Orange note pins mark open decisions or details that are not settled.

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.

GitHub.com fleetone public repo registry/humans edit (pull requests) platforms/Kargo + fleet-operator write argon.carbonplatform repo · humans edit argon.zincservice repo · humans edit CI build OCI registryimage + app chart + primordial chart Kargo: row edit
What it holdsEvery input. Nothing in the fleet is configured any other way.
Humans editfleet/registry/, each <platform>.carbon repo (example: argon.carbon) and each service repo (example: argon.zinc).
Machines editfleet/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/.

Control flows one way: Git → Primordial → clusters and vendors. Nothing below writes back up, except the machine-written fleet/platforms/ files.

8
landscapes (environment kinds)
4
serving host landscapes: pichu, pikachu, raichu, ampharos
2
DNS-only virtual landscapes: mew, celebi
2
Helm charts per service (the 2-chart law)
12
diene custom resource types (CRDs)
5 s
health poll that drives all public DNS
Tap any box: what it is, where it runs, which repo owns it
Gitsource of truth · humans edit here
▼ pulled by ArgoCD (SCM discovery of *.carbon) ▼
Control plane · Primordialone permanent cluster · not a serving landscape
▼ renders + syncs app charts, CRs, DNS ▼
Serving plane · registered host landscapesreal data · real users
Development plane · Garden instancesno real data, except castform (fork of real data)
Outside · must survive Primordial lossexternal services

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.

M · Module— S · Service— P · Platform— L · Landscape— api . zinc . argon . raichu . cluster.atomi.cloud Four labels filled: the serving-style hostname.
L · LandscapeThe environment kind: raichu, lapras, castform…
P · PlatformA product family. Registered by creating its <p>.carbon repo. Example: argon.
S · ServiceOne repo, one deployable: <p>.<svc>. Example: argon.zinc.
M · ModuleOne named piece inside a service: an API, a database (maindb), a cache.
m modules servicep platformi instancel landscape

Sources: ARCHITECTURE.md §2 (LPSM, the closed roster of landscapes). Colours follow the legend used by the name builder in tab 3.

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.

landscape: raichu a rule set secret class data posture lifetime network edge raichu·opala cluster raichu·rubya cluster location = cluster property one datasetNeon · UpstashTigris consistency =landscape property same rules same data
Four rulesA landscape fixes secret class, data posture, lifetime, network edge.
Place vs consistencyLocation is a property of a cluster. Consistency (one dataset) is a property of a landscape.
Which are Garden copiesSix landscapes are Garden workload profiles (development copies). Primordial and serving are not.
Adding oneA new landscape is a new row of settings, never new machinery.

Source: concepts/environments.md §0 (the landscape matrix requirement: a landscape row is configuration).

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.

1 / 4
GitHubfleet repo SOPS root keythe root of trust one cloud VMcloud-init boots it k3s · one nodethis cluster is Primordial ArgoCDsyncs Git Infisicalsecret vault fleet root appthe registry sync After this, Primordial's own ArgoCD keeps it in line with Git.
What it createsPrimordial, ArgoCD, Infisical and the fleet root app. After that, Primordial's own ArgoCD keeps it in line with Git.
Created outside itThe Cloudflare zone and the ledger bucket.
Never stoppedThere is no "switch Primordial off". If it dies: rebuild, Git re-syncs, controllers adopt everything back from the ledger.

Sources: concepts/seed-cluster.md (single-node k3s on one VM, SOPS via cloud-init); ARCHITECTURE.md §10 (the L0 seed sequence).

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.

control plane ArgoCD · Kargo · operators · Infisical Primordial · one permanent cluster serving plane host-landscape clustersbehind cloud load balancers real users · real data development plane Garden instancesk3d · nsc · vclusters on ENTEI no real users edge plane Route 53 + Cloudflare · edge docsR2 + S3/CloudFront outside every cluster
Control planePrimordial. ArgoCD, Kargo, the operators, Infisical. Outside the landscape registry. Never load-bearing for traffic.
Serving planeHost-landscape clusters. Each sits behind a cloud load balancer with fixed IPs. TLS ends at the cluster gateway (cert-manager, Let's Encrypt).
Development planeGarden instances. k3d on laptops, nsc in CI, vclusters on ENTEI. Argo and Kargo never run inside these.
Edge planeDNS + edge docs. Route 53 is primary, Cloudflare is secondary. The fleet, landscape and catalog docs are published twice: R2 and S3/CloudFront.
Also called a plane: the execution plane

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).

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.

argon.zincone repo · one semver: 1.4.3 CI build OCI registryimage + 2 charts App chartruntime only Primordial chartcustom resources only A P Every host cluster zinc pods pichu · pikachu · raichu · ampharosone Application per cluster Primordial CRs → controllers one Application per landscape The pair carries everything zinc needs in isolation — nothing else is consulted.
App chartRuntime only: the Deployment, the Service, the database-init hook Job. Destined for the landscape's clusters.
Primordial chartCustom resources only: PlatformDependency, WebhookRoute, Problem, LogtoApp… Destined for Primordial, where the controllers read them.
One pair = one rowOne materialization of the pair is one row file in fleet/platforms/<p>/landscapes/<l>/<svc>.yaml. The pair contains everything the service needs in isolation.
Watch it moveThe full deploy animation — registry to Primordial to five clusters — is section 07.

Sources: ARCHITECTURE.md §1 (axiom 5, the 2-chart law), §8 (repos, release trace).

07 · Deploy, animated

Tap a repo, watch its charts land

One release, charts onceA repo publishes its charts once. ArgoCD on Primordial fans them out.
P · primordial chartLands on Primordial, once per landscape.
A · app chartLands on every cluster of every landscape in 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.yaml
Aapp chart: the pods, Service and db-init Job. Goes to every host cluster.
Pprimordial chart: custom resources (orders for the controllers). Goes onto Primordial, once per landscape.
→orange = a Git or Kargo edit
→green = a controller acting
0charts shipped
0Primordial Applications
0app Applications (clusters)

Tap argon.carbon to start.

Cluster names (opal, ruby, emerald) are examples. raichu has 2 clusters here to show the per-cluster fan-out.

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

One graphGarden runs one deployment graph for all six development profiles. pls drives it.
Only settings changeWhere the cluster runs, the network, secrets and data differ per profile.
No Argo, no KargoThey never run inside these clusters.

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 vs dittoBoth connected. lapras is kept, so you iterate fast and your data survives; ditto is a fresh cluster every run, so nothing carries over but every run repeats exactly.
rotom vs absolSame offline laws. rotom is kept, so you can iterate offline; absol is one clean run — fresh cluster, evidence captured, deleted unconditionally.
eevee vs castformBoth on ENTEI. eevee is yours and editable but has no real data; castform is a frozen fork of real data, built to be reviewed, not edited.
lapras vs eeveeBoth for writing code. lapras is on your laptop next to your files, but private (tunnel, no public URL); eevee has a real public URL but lives on a shared, capped host.
All six, side by side

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: down keeps the cluster; reset deletes 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 --force always 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).

Pick a profile, watch it come up

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

Fixed at creationNewer commits mean a new preview, never an update.
3 data classes forkedPostgres (Neon), KV (Upstash), storage (Tigris). Cache starts empty.
Cleanup lives outsidefork-reaper owns it, so it works even if the preview's cluster is already gone.
Fork source
1 / 10
What cannot be forked
  • Dragonfly (cache or KV), MinIO, R2 and S3: the fork is refused with a ForkUnsupported condition. 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

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.

One claim, per platformThe claim is called home_landscape. The app checks the claim on every sign-in and sign-up: present means go straight home.
One dataset per landscapeLocation belongs to a cluster; consistency belongs to a landscape. raichu·opal and raichu·ruby are two clusters sharing raichu's one dataset (blue/green siblings).
What lives in the homeThe user's login (that landscape's Logto), the API hostnames the app calls, and every row the user owns: database, key-value store, files. The cache is regional too, per cluster, with a TTL.

Sources: ARCHITECTURE.md §1 (axiom 1), §2 (host landscapes, clusters), §5 (home claim); concepts/environments.md §1.

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

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.

GitHub mercury.webhookone repo · image + 2 charts mercury.carbonthe platform home repo charts Primordial the primordial chartWebhookEngine CR · service claimNeon + per-landscape Upstash claims mew · celebistable webhook names geoproximity every serving landscape · pichu · pikachu · raichu · ampharos Mercury pods the fleet’s ONE multi-tenant instance Neonmanagement DB · off the hot path Upstashone per serving landscape
Own platform, own trainMercury runs on the dedicated mercury products platform (home repo mercury.carbon, service repo mercury.webhook). It owns its rows, its virtual landscape and its own promotion stages, exactly like any platform.
Where the pods runOn every serving landscape: pichu, pikachu, raichu, ampharos. It never runs on Primordial — only its orders (custom resources) land there. See section 07 for how charts land.
The stable addressProviders send to a virtual-landscape name, e.g. 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.
What is deliberately absentNo Cloudflare Worker, no Cloudflare D1 or Worker KV stores, no buffer, no wrangler — adding any would be a design regression, not an option.
One posture per landscape
primordialnothing — orders only
laprasfresh local copy
dittooff — no inbound rail
rotom · absolreal local copy, injector-fed
eeveeoff — callbacks denied
castformfresh tenant routes on the shared router
servingthe one multi-tenant instance

Sources: goals/mercury.md (kind, purpose, landscape ruling), concepts/ARCHITECTURE.md §6, concepts/environments.md §6 (shared-service table).

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.

Bun (TypeScript) · .NET · Go · Dart / Flutter · Next.js result interfaces core-utils Every language starts its libraries in this order — then adds its own. Go's first library is named errors-problems: Go's equivalent of result. Next.js (web) has no libraries of its own: it uses the Bun libraries.
RuntimeTemplatesLibraries (lib/<lang>-*)
Bun (TypeScript)bun-base, bun-lib, bun-cli, bun-consumer, nextjs-frontendresult, interfaces, core-utils, config, otel, problems, auth-engine, api-engine, frontend-utils, standard-config, e2e
.NETdotnet-base, dotnet-lib, dotnet-apiresult, interfaces, core-utils, config, otel, problems, auth-engine, api-engine, server-engine, standard-config, e2e
Gogo-base, go-lib, go-consumer, operator-templateerrors-problems, interfaces, core-utils, config, otel, auth-engine, api-engine, standard-config, e2e
Dart / Flutterdart-lib, flutter-base, flutter-e4result, problems, interfaces, core-utils, config, auth-engine, api-engine, e2e
Next.js (web)nextjs-frontend, frontend-standalone-chartuses the Bun libraries
One repo per libraryEach library is its own unit with its own repo, e.g. lib/bun-result — the Result and Option library every Bun service uses.
Same head of the chainEvery language starts 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.

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.

workspace shared bun-base dotnet-base go-base shared-wo-… -wo-helm -wo-helm-docker -w-observability same three strips under dotnet same three strips under go -docker-helm: dart-lib, flutter-base Each child removes or adds exactly one capability — never two at once.
  • 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.
Try it: flip the switches, see which template node exists Language
Capabilities

Sources: the build graph (template nodes and edges, 2026-11-07); goals/workspace.md, goals/shared.md.

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.

Userbrowser · app DNSRoute 53 + CF Cloud LBfixed IP Serving cluster raichu·opal GatewayTLS ends zinc pods live path — no Primordial anywhere in it Primordial ArgoCD · Kargocontrollers · Infisical changes only deploys · promotions secret rotation · DNS edits
The rulePrimordial composes desired state; nothing reactive depends on Primordial. Primordial down = deploys pause; traffic, failover and login keep working.
Safe to be down for hoursSecrets already copied into clusters stay there. Only changes wait: deploys, promotions, secret rotation.
Outside on purposeDNS (Route 53 primary, Cloudflare secondary), the ledger bucket and the data vendors (Neon, Upstash, Tigris) all live outside Primordial so they survive its loss.

Sources: ARCHITECTURE.md §1 (axiom 7), §3, §7.

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: staging or production. 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

Words used on every tab
  • 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 in ProtoDurian/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.

Approve RecommendedThe rewrite is accepted. The four templates whose names end in -w-observability then come to you for review, one by one.
ChangesYou comment on the review page; one more round fixes your comments before anything is approved.
Concepts you need
Monitoring add-onThe unit 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
GrafanaThe dashboards and alerting tool AtomiCloud uses.
Dashboard sandboxA local Grafana filled with fake data, where a dashboard is drawn and checked before merge. Example: a generator writes hours of fake log lines.
Query-check tool (not built)A planned tool that runs every dashboard and alert query after a test run with real traffic, and fails if a query returns nothing. Its goal draft is in the links below.
Where things stand
  • 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.
Links

Sources: the eight open decision cards, 2026-11-07. Concept links point at the sections above on this page.