Bitspark constellation
accepted source ↗

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)

stele is the fact substrate. The historical arche monorepo — which hosted a fact substrate plus a suite of services on top of it — decomposes: its fact-substrate role moves to stele, and its primitive services become standalone arche-* repos (arche-runner, arche-cas, …). arche remains 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) and arche-facts are superseded by stele; arche-agents is retired. CAS is ported from arche/services/cas onto stele as arche-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-repo LEGACY banners. arche is NOT legacy — it is the umbrella, carrying a decomposition note instead.
  • Topology: stele is the fact substrate; arche stays a member but its role shifts to umbrella (an atlas.json is / gloss update + the diagram regen), and arche-cas / arche-runner register 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.

The Bitspark constellation — how the systems are built and relate.

GitHub