ADR 0016 — stele is the fact substrate; arche decomposes into primitive services
- Status: accepted
- Date: 2026-06-10
- Builds on: 0012 (the substrate-theory basis), 0013 (realization as a candidate theory)
- Relates: 0002 (membership & manifests), 0014 / 0015 (the process this is governed under)
steleis the fact substrate. The historicalarchemonorepo — which hosted a fact substrate plus a suite of services on top of it — decomposes: its fact-substrate role moves tostele, and its primitive services become standalonearche-*repos (arche-runner,arche-cas, …).archeremains as the umbrella / common layer spanning those primitive services — it is not legacy. Legacy are only the substrate-floor pieces and the v3 agent prototype:arche-core(the kernel) andarche-factsare superseded by stele;arche-agentsis retired. CAS is ported fromarche/services/casonto stele asarche-cas. Deployment becomes substrate-managed; GitHub Actions transitional.
Context
The arche monorepo grew to host two different things: a verifiable fact substrate (its kernel
arche-core plus the services/facts log) and a suite of primitive services running on top of it
(services/{cas,cell,vault,schema,service-runner,accounts,…}) plus realization / runtime hosts.
stele — "the public record, signed attestations on a public slab" — is the clean reimplementation of
the fact-substrate role: arche's own atlas.json already calls stele "arche's substrate floor …
arche-facts reborn".
So the decision is not "arche is dead." It is: the substrate floor moves to stele, and arche's
contents decompose into per-service arche-* repos, with arche kept as the umbrella over them.
Without recording this, two regressions recur: code gets rebuilt on the retired kernel, and "create a
CAS repo" gets re-proposed even though CAS already exists in arche/services/cas (to be ported,
not rebuilt).
Decision
1. stele is the fact substrate. It supersedes the substrate-floor pieces of arche v3:
arche-core (the trust-critical kernel) and arche-facts (arche/services/facts). Those are legacy
reference — no new work builds on them; port what is needed onto stele.
2. arche is the umbrella for the primitive runtime services on stele — and it remains. The
historical monorepo decomposes: each primitive service becomes a standalone arche-* repo on top of
stele. arche (greek ἀρχή, "first principle") stays as the common layer / family name spanning them.
Its self-description shifts from "is the fact substrate" to "the umbrella over the services realized
on stele" (an atlas.json gloss update, tracked separately).
3. The first decomposed services are arche-runner (realization / process.v0 on stele — already
extracted) and arche-cas (CAS, ported from arche/services/cas: reuse the proven design —
content-addressed blobs, Ed25519 auth, fact-governed reads, a GC participant, go/ts SDKs — re-wired to
stele's read/write/grant/endpoint model). Later: arche-cell, arche-wire, and the remaining
services/* as they crystallize. Each is minted only on crystallization per
0013 §5.
4. arche-agents is retired. The v3 agent-orchestration prototype is legacy reference; its
docker-controller is superseded by arche-runner's process.v0 realizer as the canonical
fact-driven reconcile pattern.
5. Deployment is substrate-managed. Desired state lives in stele facts; realizers and controllers reconcile and assert observations back (the container/process loop already runs — the arche-runner realizer is live on staging). GitHub Actions is transitional (build / publish / events), not the long-term deploy authority; bootstrap stays manually-scripted genesis, declared as such.
6. Provider controllers (DNS / VM / TLS) get a future arche-ops — the one genuinely-greenfield
layer — built fresh on arche-runner's reconcile pattern, never extended from the retired
arche-agents controllers.
Consequences
- The legacy set is
arche-core,arche-facts,arche-agents— superseded by stele (the first two) / retired (the last). They carry in-repoLEGACYbanners.archeis NOT legacy — it is the umbrella, carrying a decomposition note instead. - Topology:
steleis the fact substrate;archestays a member but its role shifts to umbrella (anatlas.jsonis/glossupdate + the diagram regen), andarche-cas/arche-runnerregister as members on crystallization. Tracked as its own issue. - CAS is a port of
arche/services/cas, not a greenfield build, and not left wired to the legacy arche fact service. - Cost: decomposing arche into per-service repos and re-platforming each onto stele is real, staged work; this ADR narrows 0012 / 0013 only on which repo is the fact substrate.