Bitspark constellation
accepted source ↗

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-cas this 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 way downstream did: 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 the arche-* 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:

  • downstream misdescribes 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) and infrastructure (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.json needs 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 downstream0017'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.json with layer: "adstrate", a gloss for the Latin name (no greek field), and edges only into the substrate (typically build on stele's SDKs, contract on 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 layer enum gains adstrate (the single source atlas CLI validation derives from); topology.mjs gains the two invariants of §2 plus a naming lint (an adstrate member takes a Latin name + gloss); atlas explain describes the layer; topology gen renders an adstrate band in family.md once 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.md documents 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 design wordmark mark before it can be drawn at all, so diagram treatment is decided with the first registration, in design's figure language.
  • ADR 0016 §3 is amended, not superseded: everywhere it says arche-cas, read corpus. 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.json is 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.

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

GitHub