ADR 0018 — the adstrate becomes first-class: layer: "adstrate" + the Latin naming convention
- Status: accepted
- Date: 2026-06-13
- Builds on: 0017 (the tier this makes machine-readable — its reserved "separate decision"), 0016 (whose §3 working name
arche-casthis amends) - Relates: 0001 (the layer model), 0013 (the reserve-nothing naming discipline this reuses), 0002 (the manifest the new layer value lands in)
The adstrate stops being prose.
layer: "adstrate"joins the topology enum, marking adstrate implementations — never the tier itself, which is a contract, not a repo. The value earns first-class status the same waydownstreamdid: it drives real invariants (substance must never depend on adstrate; adstrate must never depend on downstream — domain- blindness becomes a checked edge rule). And the family's naming becomes systematic: Greek marks the substrate (what declares and judges), Latin marks the adstrate (what carries) — working names corpus (content), tabula (state), cursus (flow) — and thearche-*prefix narrows to mean occupants under the arche umbrella.
Context
0017 named and defined the adstrate
tier but deliberately deferred machine-readability: "layer stays
substance | downstream | infrastructure; … If the distinction ever needs to be
machine-readable, that is a separate decision." Two pressures make that decision now:
downstreammisdescribes adstrate implementations. Its definition is "an application or product built on top." An adstrate implementation is neither — it is constitutionally referenced, domain-blind carrier infrastructure.substance(the theories + the record) andinfrastructure(the orthogonal design/atlas pair) fit no better. The enum has no honest slot — the same gap 0017 found in prose, surfacing in data.- Timing is favorable. No adstrate member exists yet (the CAS port has not started), so
adding the value is pure slot-preparation with zero member migration — and the layer enum
ripples (schema, validation, views, site, docs, tests), so it must land before the first
adstrate repo's
atlas.jsonneeds it, not after.
The bar for a new layer value is the one downstream set (per the glossary): "a first-class
layer value that drives a real invariant." The adstrate value clears it twice (§2).
Decision
1. layer: "adstrate" joins the enum — and marks implementations, not the tier.
The topology registers repos. CAS-the-referent-category is a contract (fact language +
identity discipline, 0017 §3); a
repo carrying layer: "adstrate" is an implementation serving an adstrate. Several
members may share the value (a rival content store is also adstrate), exactly as several
members share downstream. This keeps 0017's anti-conflation rule intact in the data model.
2. The value drives two checked invariants (atlas doctor, severity error):
- substance must never depend on adstrate — theories reference the adstrate vocabulary, never an implementation. The mirror of "the stack must not depend on its consumers."
- adstrate must never depend on downstream — 0017's upward opacity ("the implementer never learns what the payload means") becomes a machine-checkable edge rule rather than a promise. An adstrate implementation depends on the substrate (it is a stele client) and on nothing domain-shaped.
Adstrate→adstrate edges are left ungoverned for now: arche RFC 0001's non-composability is a claim about contracts, not about whether one implementation may operationally use another; legislating it before a second member exists would be deciding an open question implicitly.
3. The naming convention: Greek for the substrate, Latin for the adstrate. The Greek names are concepts — being, reason, law, bound, principle: what declares and judges. The Latin register is concrete Roman engineering: what carries. (And "adstrate" is already Latin morphology.) The working names, chosen for the same artifact-resonance stele has:
| Primitive | Working name | Why |
|---|---|---|
| content (CAS) | corpus | the body of content — a corpus is a fixed collection of texts; bodies too large for the record to contain |
| state (cell) | tabula | the Roman wax tablet — the erasable, rewritable surface; the ancient mutable counterpart of the stele's carved stone |
| flow (wire) | cursus | the cursus publicus — Rome's imperial courier network; from currere, to run, the root of "current" and "course" |
These are working names under 0013's reserve-nothing discipline (as dynamis/energeia are for the candidate theories): a repo is minted, and its name ratified, only on crystallization. Naming tabula does not decide cell's open adstrate question (0017 consequences) — a name can die unused.
4. The arche-* prefix narrows to mean occupants. Adstrate implementations take
Latin names; occupants under the arche umbrella keep the prefix (arche-runner, the future
arche-ops). This amends 0016 §3's
working name: CAS ports onto stele as corpus, not arche-cas (the port plan itself —
reuse the proven design, re-wire to stele — is unchanged). The prefix then means something:
arche-* = an acting occupant; Latin = a carrier; Greek = the substrate.
5. The shape of an adstrate repo. Mirroring how a substance repo owns spec + tri-core implementation + conformance vectors, an adstrate repo owns:
- the contract — the fact vocabulary (its predicates and binding shapes), the identity discipline (what makes a binding re-checkable), and conformance vectors any implementation must pass;
- the reference implementation — an ordinary occupant (fact-governed, grant-authorized, zero privileged paths), expected to ship client SDKs (go/ts per 0016 §3);
- a root
atlas.jsonwithlayer: "adstrate", aglossfor the Latin name (nogreekfield), and edges only into the substrate (typicallybuildon stele's SDKs,contracton its published read/write/grant/endpoint surface).
An adstrate member joins the unified development process
(0014) like every member — scaffold, labels,
conformance — but stays out of the substance-only substrate-release machinery
(release/pin/dispatch subscriber sets are layer === "substance" and remain so): an
adstrate repo consumes pinned substrate releases the way downstream does.
6. Registration timing is unchanged. A member registers (draft first) on crystallization, per 0016. This ADR prepares the slot; it registers nobody.
Consequences
- Machinery (this ADR lands with it): the manifest-schema
layerenum gainsadstrate(the single sourceatlasCLI validation derives from);topology.mjsgains the two invariants of §2 plus a naming lint (an adstrate member takes a Latin name + gloss);atlas explaindescribes the layer;topology genrenders an adstrate band infamily.mdonce members exist; the site's layer grouping includes Adstrate (empty layers are not rendered, so the public site is unchanged until a member registers);docs/model.mddocuments the layer as defined-and-enforced, aspirational (its own live-vs-aspirational vocabulary); the glossary's adstrate entry gains the naming convention and this ADR. - The constellation diagram is untouched until a member registers — the figure draws
the substance spine + infrastructure; an adstrate member needs a
designwordmark mark before it can be drawn at all, so diagram treatment is decided with the first registration, indesign's figure language. - ADR 0016 §3 is amended, not superseded: everywhere it says
arche-cas, readcorpus. Its substance — port, don't rebuild; rewire to stele — stands. - A migration that never happens: because the value lands before any member needs it,
no existing member changes layer, and no member repo's
atlas.jsonis touched by this ADR. - Cost: one more layer value to explain. The mitigation is the naming convention
itself — Greek/Latin/
arche-*carries the three-tier model in the names, so the topology teaches it instead of contradicting it.