Atom — the Protocol Plane
Formal model: Atom — the Protocol Plane
2026-07-12. Status: v0.2 — the naming-and-trust plane given its own
formal model. The Composition Model §0 names two
deliberate non-primitives, and the first is this document's subject:
"naming and trust (atom identity, publish_czd, signatures, trust
anchors) are the protocol plane above the substrate… The omission is a
decision, not an oversight." This model fills the reserved seat: it does
not add a fourth primitive, it formalizes the plane the trichotomy
deliberately excluded. Substance is drawn from the landed atom corpus
(atom-sad, atom-transactions, git-storage-format, atom-sourcing — cited,
never restated) and from design decisions ratified in working session
with nrd, 2026-07-12: the composite duality (§2), the metadata partition
law (§4), the signature-anchoring law (§5), the reproducibility contract
(§6), environments-as-atoms and the system kind (§7). Doc amendments
this model obligates are listed in §8; none are performed here.
v0.2 (2026-07-12): corrections from two decorrelated zero-context reviews (a general refuter pass and an architect/coherence pass), plus same-day session ratifications. Sharpest: the closure-projection claim split honestly — the build closure is intent-determined; the runtime closure is bounded by determination and located by evidence — with the declared runtime-dependency flow ratified alongside (§2); the granularity and intent stratum axes separated and the generator kind placed outside the composite genus (§3, §7); the metadata partition gains the asserted-fact species (§4); the anchoring table gains dev-atom and trial-attestation rows and "local" becomes normative (§5); the reproducibility contract states its monotone-history cost, its declaration quantifier, and its adjudication exits (§6); the §8 amendment manifest completed.
0. The plane above the trichotomy¶
The substrate trichotomy (storage, composition, execution — Composition Model §0) answers "what is computed." This plane answers the questions the substrate deliberately cannot: what is this thing, who says so, and who believes what — naming, authorship, and trust. Its primitives are the atom protocol's transactions (charter, claim, publish — atom-transactions) and the trust semantics the execution model delegates upward (fact-hood is signer-relative, Execution Model §3.4; the anchor format and acceptance policy "ride on atom's existing signing machinery," §9.7).
The plane's own founding question is older than the substrate. The derivation — Nix's unit — is simultaneously too granular and too abstract: humans care about a package, a development environment, an operating system, and the derivation representation distinguishes none of them. This model's central object, the composite, is the answer to that question, and the atom is its publishable reification.
1. The one-sentence model¶
The atom plane assigns every human-meaningful unit of software — the composite — a permanent name, a signed intent reification, and a single anchor point where all trust about it accumulates; everything the substrate computes is bound to the world of humans and keys through exactly this plane.
2. The composite duality¶
A composite is the genus: a human-meaningful unit of software at one of the three granularity strata the composition model defines — package, environment, system (Composition Model §4). The composite is never itself a concrete object; it exists in exactly two reifications, one on each side of every execution edge:
atom the INTENT reification: signed, published, versioned
declaration of what the composite is and how it comes to be
(sources + manifest + lock under one snapshot identity)
composition the ARTIFACT reification: the content-addressed value the
substrate produces and arranges (Composition Model §2)
The formal core of this duality is already proven: endpoint completeness
(Composition Model §1.1) states that every execution edge connects two
fully-determined content-addressed points — the atom snapshot on the
intent side, the composition root on the artifact side — in two
deliberately distinct content-addressed spaces (Storage Model §5), while
the edge itself stays a witnessed relation. This model adds only the
vocabulary: both endpoints are the same composite, reified twice. The
lock↔composition isomorphism (htc-sad §6.9 — name → signed content pointer, one layer apart) is the same duality observed at the binding
level: the two reifications carry the one algebra.
Identity names the composite, not a reification. AtomId = (anchor, label) — the abstract pair, permanent across versions, owners, and
keys (atom-sad §6.1, [identity-content-addressed],
[identity-stability]) — names the composite through time. One
publish (one publish_czd) names one intent instance; one composition
root names one artifact instance. The olog's identity-stability diagram
(publishing-stack-layers §1) commutes
unchanged under this reading.
Closures are projections — one determined, one bounded. The composite "includes the formal closure of all dependencies" in a precise and deliberately indirect sense: the atom's signed content governs its closures without containing them by value — but the two closures are governed differently, and the difference is the execution model's own (§4.2–§4.4):
- The build closure is determined.
[lock-action-totality](lock spec) obligates lock + manifest to determine, by pure elaboration with no discovery, every input ofaction_id—atom_czd_closure_rootfrom the dep pins. The build closure is included the way a theorem is included in axioms. - The runtime closure is bounded by determination and located by
evidence. The composite fixes the candidate universe and the
certified interval's structural bound (Execution Model §4.2); the
justified closure
Jis then located within those bounds by evidence — static extraction, observation, declaration — and refined towardDep(a)over the artifact's operational life (Execution Model §4.3–§4.4). It is a projection in the bounded sense, never a pure function of intent.
Neither touches identity: closure roots feed action_id (Execution
Model §2.4), never AtomId.
Tripwire (what the determination claim rests on). The build-closure
leg: [lock-sufficiency], [lock-groundness],
[lock-closure-completeness], [lock-action-totality] (lock spec),
and P7's totality gate (Execution Model §8) — which is itself gated on
the toolchain-pin lock entry that does not exist yet (htc-sad §9,
gap 11). Until that entry lands, the toolchain leg of the determination
is a stated obligation, not a discharged fact. If any of these weakens,
this section's determination claim names exactly what breaks with it.
Declared runtime dependencies close the loop. A runtime dependency
absent from the build closure MUST be declared — a Declared-class,
signer-keyed assertion (Execution Model §4.2) — and thereby enters the
resolution formula: formation over the pinned fact snapshot resolves
the declared require to a provider like any other binding. A declared
dependency need not be present at build time, but it IS injected into
the observation environment (the Observe-tier check-phase view, htc-sad
§5.1), so runtime tracing exercises it and its interface facts get
built. Repair lands at the package contract, never per-environment
(Composition Model §4): every environment containing the package picks
up the binding at re-formation with zero rebuilds, and the atom's own
lock absorbs the require at its next publish. The one genuinely open
residue is constraint authoring at declaration time — a closure fault
names what is missing, but a human or tool must author the
version/interface constraint the declaration carries — an
interaction-design question directed at the ion UX design pass (§8).
This is what dissolves the founding question. Nix has only the artifact reification (store paths and their unexplainable closures) and no first-class intent reification — the derivation is a build instruction, not a signed, human-meaningful declaration. Here the human-meaningful unit is the identity-bearing object, at every granularity stratum.
3. What the plane owns per stratum¶
Two independent axes classify atoms, and this model keeps them separate (§7): the granularity strata — package / environment / system, law-bearing at the composition layer (Composition Model §4) — and the intent strata — executable / algebraic, closed and law-bearing (Composition Model §5) — with kinds the open, schema-level family over them (Composition Model §5; Execution Model §9.13). The plane's own contribution is uniform across all of them: every composite, at any granularity, MAY be published as an atom, and publication is the only door from private value to public claim (§5). Ratifications recorded in §7 make this uniformity real for environments and systems.
4. The metadata partition law¶
htc-sad §4.2 states, for fetch pins: "lock = intent (before the build); metadata = fact (after the build)." This model generalizes that rule to the whole plane:
Placement of every datum about a composite is decided by whether it can affect the result. What is knowable before the build AND could affect the final result is intent: it lives in the atom — in the sources where it naturally lives (a license file, an adopted ecosystem lockfile), else as a signed publish-time field. Everything else is chain-anchored fact, in two species: derived facts — what only building produces (output digests, interface manifests, observation records, build records), signed by whoever derived them — and asserted facts — signed post-hoc assertions by a keyed signer that no build produces (security advisories, deprecation and yanked/superseded markers, and declared runtime requires, §2 — the
Declared-kind precedent, Execution Model §4.2).
The two sides have different laws, and the difference is load-bearing:
- Intent is czd-covered and chain-invariant. It participates in the
snapshot identity (
dig) or the signed publish payload, hence inaction_idvia[lock-action-totality]; the chain-invariant core(label, version, dig, src, path)cannot change behind a version ([tag-chain-semantic-immutable], git-storage-format). - Fact is appended, monotone, and signer-attributed. The metadata chain is the concrete realization of the substrate's only state — the fact-set (Composition Model §6): insertion commutative and idempotent, several witnesses for one action a legitimate state, fact-hood judged signer-relative at read time (Execution Model §3.4). Both species ride the same chain under the same laws — they differ only in provenance (a build vs a keyed assertion). Facts never occupy identity-bearing positions (obligation P12).
The partition decides field placement mechanically. A license file:
result-affecting (it ships), intent. An expected output digest:
derivable only by building — a derived fact, unless asserted as a
contract (§6, where the assertion is intent and the evidence stays
fact). An interface manifest: derived fact, memoized per
(analyzer, blob) (htc-sad §2.2). A CVE advisory discovered months
after publish: an asserted fact — knowable by no one at build time,
affecting no result (atom-transactions.md's advisory and yanked
fact kinds, [fact-kind-table], are this species — the
git-storage-format meta.security/meta.broken fields this species
was formerly recommended through are retired, their content now
carried as append-class fact entries instead of meta). There are no
taste calls left, only classifications.
Two hardening gaps become normative obligations of this plane. Both are already registered (atom-sad §9 gap 5; htc-sad §6.10) and are design work this model now governs rather than defers:
- Builder ≠ owner authorization. Facts are signed by their deriving executor, which is generally not the claim owner. The metadata chain MUST admit fact appends from signers outside the ownership chain while keeping them distinguishable from owner-signed appends — acceptance is the consumer's trust judgment (Execution Model §3.4), never the chain's.
- The fact-append carve-out. A routine fact append MUST NOT be
presented to consumers as an ownership-relevant event: atom-sad
§8.6's moved-tip warning exists to surface signing/ownership
changes, and fact traffic through the same mechanism
(
[publish-update-transition]) currently trips it. The carve-out is now concretely mechanized by the field classification — atom-transactions.md[amendment-field-classification]and its fact-kind table ([fact-kind-table]) — distinguishing appends that CHANGE THE VALUE of a policy-relevant overwrite-class field (signing identity,mode— trust-chain-relevant) from appends that add only append-class fact entries, or that merely re-assert an unchanged overwrite-class value (both routine). The distinction is value-change, not field-presence: every signed tag necessarily sets some overwrite-class fields (e.g.tmb,now), so a presence-based trigger would fire on every tip move.
5. The signature-anchoring law¶
Signers differ across the stack — publishers sign intent, executors sign records, analyzers' outputs are keyed by the analyzer's own czd, composers sign compositions — but anchoring does not:
Every signature offered across a trust boundary is anchored to an atom. It either IS atom-plane intent (a charter, claim, or publish transaction), or it is a fact anchored to some atom's metadata chain. A signed value that is neither is local: it carries no protocol trust, whatever its cryptographic validity.
The atom is thereby the single human-identifiable, machine-enumerable anchor point of trust: to audit what is believed about a composite, one walks one chain, whoever the signers were. The classification is total (obligation P13):
| Signed object | Class |
| Charter, claim, publish | intent (the plane's own transactions) |
| Build record, interface manifest, observation record | fact (derived) — appended atom metadata (htc-sad §6.10) |
| Trial attestation (networked-test witness) | fact (derived) — anchored to the tested atom's chain; consumed by publication gating (Execution Model §2.3, §3.2) |
Advisory / lifecycle assertion (advisory, yanked, deprecated, superseded-by), declared runtime require (runtime-requires) |
fact (asserted) — signed publish-chain append, atom-transactions.md [fact-kind-table] (§4) |
| Lock, adopted ecosystem lockfile | intent — inside the snapshot, czd-covered |
| Environment certificate, published | intent — the environment atom's pinned elaboration (Composition Model §5) |
| Composition, published as/within an atom | intent — content of an environment/system atom |
| Composition or certificate, unpublished | local — a dev shell, a machine's own root |
| Analyzer facts about dev/filesystem-sourced atoms | local — no claim or publish chain exists to anchor to ([fs-ingest-transition]) |
| Promotion (attestation → lock entry) | intent — lands czd-covered on the next publish |
The local class is normative, not descriptive: an unanchored
signature carries no protocol trust, and consuming one is
out-of-protocol trust by definition — whatever the signature's
cryptographic validity, and however far the value happens to travel (a
dev atom's analyzer facts are shareable CAS data; they are still
local). This is the designed consequence of the plane's premise:
publication requires a signature — an unsigned atom cannot be
published, because the claim and publish transactions ARE signed
CozMessages and the verification pipeline rejects everything else
(atom-transactions §Constraints,
§Verification Pipeline) — which is what makes every published object
trust-decidable and the anchoring law total over the protocol. The
moment a local value's trust claim must travel — a binary offered for
substitution, an environment offered for reuse — it must cross the
publication door and acquire an anchor. Within the protocol there is
deliberately no third path; an out-of-band digest handoff (a signed but
unpublished composition passed peer-to-peer and bound by raw digest) is
out-of-protocol by definition, and refusing it is exactly what a trust
policy is for (Execution Model §3.4).
6. The reproducibility contract¶
The execution model settles what reproducibility is — an accumulating attestation on an action, empirical, never proven (§2.3), with multiplicity of witnesses a legitimate state (§2.2) — and delegates to this plane what it means to consumers (§3.4, §9.7). This model supplies the atom-side half of that commissioned semantics; the policy-language spec inherits it.
The mode is declared, signed intent. A publish carries a reproducibility mode:
mode ∈ { reproducible, witnessed } (default: witnessed)
- Under witnessed, nothing changes: records accumulate multi-valued, cache hits serve any trust-acceptable witness (Execution Model §2.2).
- Under reproducible, the publisher asserts: for every action this
atom denotes, fixed
action_id⇒record_core-equal records (Execution Model §3.1 — equality over(req_digest, exit_code, outputs), never full records). The claim quantifies over actions, not the atom in the abstract: outputs legitimately vary across toolchain closures, so a violation is judged peraction_id, which is exactly what accumulated build records already carry (htc-sad §2.3). The declaration itself, though, is one universal claim: it covers every action the publish denotes, including toolchain and params combinations untested at declaration time — publishers declare accordingly (prudence, not protocol). Scoping the mode per toolchain role is a possible future refinement, not v1.
Violation is a defect finding, not a datum. Under the declared
mode, a record_core-divergent record from a trusted signer at a
fixed action_id is never absorbed into the witness set as one more
observation. It is a contradiction between signed intent and signed
fact, and it demands adjudication: either the claim is wrong (the
publisher amends the mode, signed) or something is compromised — a
builder, a toolchain, the atom's own determinism assumption. Trust
policies MUST be able to refuse cache service on the contradicted
action while it stands. This is the entire point of declaring: without
the declaration, a trojaned artifact and benign nondeterminism are
indistinguishable — the alarm semantics is what the signature buys.
Adjudication is minimal and chain-observable. A standing finding is immutable chain state; its lawful exits are exactly two — a signed mode amendment (the claim was wrong: the demotion below) or the consumer's own trust-anchor revision (the witness was the defect, Execution Model §3.4) — and consumers observe resolution the same way they observed the finding: on the chain.
Emergence feeds declaration through the promotion door. Witness
convergence (k record_core-equal records from independent signers —
the hardening mechanism of Execution Model §3.4) is evidence, and
evidence crosses into intent only over a signature (Execution Model
§3.3, the plane-wide promotion law). A publisher holding convergence
evidence MAY promote witnessed → reproducible; adjudication of a
violation MAY demote reproducible → witnessed. Both transitions are
signed appends on the publish chain — auditable, never silent
(obligation P14).
Monotone history is the structural cost. The fact-set only grows (Composition Model §6): divergent records and mode transitions are immutable chain history that no later signature can retroactively reclassify. A demotion forfeits the declared trust tier for every policy composed on it, and a demotion under a standing contradiction is itself a visible, policy-consumable pattern — the dodge is exactly as auditable as the violation it dodges. The thresholds are deliberately asymmetric: k-of-n convergence earns trust (promotion evidence); 1-of-n divergence raises an alarm — never a global verdict, because fact-hood is signer-relative (Execution Model §3.4), so an alarm is a per-consumer investigation trigger, priced accordingly.
Consumers compose policy on declarations, not statistics. A policy
like "toolchain roles require reproducible atoms" is sound because
the mode is signed intent with defined violation semantics; the same
policy over emergent witness counts would be a moving target with no
accountable party.
7. Kinds, strata, and the recorded ratifications¶
Two axes, never conflated. The granularity strata (package / environment / system) are the composition layer's law-bearing levels (Composition Model §4). The intent strata (executable / algebraic) are the closed, law-bearing classification of elaboration (Composition Model §5). Kinds — package, environment, generator, and future members — are the open, schema-level family, each kind belonging to exactly one intent stratum (Composition Model §5). "System" is a granularity level whose atom is the canonical mixed-pipeline case (Composition Model §5), not a distinct kind.
Generator atoms stand outside the composite genus, by design. A
generator atom is published, signed, versioned intent denoting a
transition between composites — a choice-function delta (Composition
Model §7) — where environments are states. The duality of §2 does not
apply to it: its denotation is an edit, not an artifact. The plane's
machinery — identity, anchoring, publication, the metadata chain —
applies to generator atoms uniformly, and that uniformity is
security-critical: an override is a prime supply-chain attack vector
("rebind your crypto provider"), and publishing deltas as signed atoms
makes policy itself a trust-decidable, auditable artifact, where an
unsigned local overlay file is invisible to every downstream consumer.
Concretely: a published hardening profile applied ∀ atoms declaring
role cc; an embargo-window graft delta rebinding a vulnerable
provider fleet-wide, signed and attributable. The v1 kind deferral
(generator = transitions, not a v1 manifest kind) stands unchanged.
This model records two decisions, ratified 2026-07-12, as normative content of the plane:
- Environments-as-atoms: yes — resolving Execution Model §9.10. An environment MAY publish as a signed atom whose content is the composition and whose pinned elaboration is the certificate; ion's existing version machinery covers it with nothing new invented (Composition Model §4, "Versioning"). This is what makes the composite duality uniform at the environment stratum, and it is load-bearing for §5: publication is how an environment's trust claim travels.
- The system kind stands — the boundary-declaration artifact of Composition Model §4, publishable as an atom like any composite (the system atom is already the canonical mixed-pipeline case, Composition Model §5).
The kind discriminator's schema shape (tables vs field, mixed-atom hygiene) remains open (Execution Model §9.13) — a manifest/lock redesign concern, not a law of this plane.
8. Doc amendments this model obligates¶
Recorded here so the reconciliation sweep has a manifest; none are performed by this document:
- execution-model.md §9 (landed 2026-07-12): item 10 (environments-as-atoms) → RATIFIED yes, per §7; item 7 → note that the atom-side acceptance semantics (mode, violation, promotion) is specified by this model; item 13 → note §7's axis separation (kinds vs the two stratum axes); register a new open question — constraint authoring for declared runtime dependencies (§2), directed at the ion UX design pass that precedes ion implementation.
- atom-transactions.md (landed 2026-07-12 —
[publish-mode]; the fact-append MECHANISM remains registered design work): the reproducibility mode as a protocol-defined publish field (§6) — root-level protocol namespace, notmeta.*(root keys are reserved for protocol fields; the mode is one), defaultwitnessed, with its own invariant and its[no-duplicate-version]interaction stated (a mode transition is a new tag on the existing chain, never a new version); the fact-append signer-authorization and carve-out obligations (§4). - git-storage-format.md (landed 2026-07-12):
[tag-chain-semantic-immutable]— the mode joins the chain-variable class (it is promotable/demotable per §6), which the constraint's variance list must name explicitly;[publish-update-transition]— its permitted reasons (today "key revocation or resigning") extend to mode transitions. - atom-sad.md (landed 2026-07-12): §6 gains the plane framing (composite duality, anchoring law); §9 gap 5 narrows from open design to the P12/P13 obligations and carve-out convention this model states.
- htc-sad.md §6.10 (landed 2026-07-12): cite this model as the governing law of the fact-publication channel.
9. What this model deliberately does not own¶
- The substrate. Storage identity, composition algebra, execution semantics — the three sibling models. This plane consumes their values and laws; it defines who names and who believes.
- Resolution and the lock schema. Ion's algebra and the lock spec
instantiate the plane's laws (
[lock-action-totality],[lock-set-charter-head]); this model cites them as discharged obligations, never re-derives them. - Backend mechanics. How a backend stores transactions, walks chains, and enforces ancestry is the subject of the companion backend contract, axiomatizing what ANY content-addressed VCS must provide to host this plane, with the git backend (git-storage-format) as its reference instantiation.
- Key management and identity frameworks. Below the plane
(Coz/Cyphr);
ownerstays opaque ([owner-abstract]). - The acceptance-policy language. Execution Model §9.7's spec remains future work; this model fixes only its atom-side semantics (§6).
10. Proof obligations¶
Continuing the substrate-wide P-numbering (P1–P11 are homed in the three substrate models):
- P12 — metadata-partition well-formedness. Every field of the
publish payload, the chain-variable set, and every fact kind on the
metadata chain is classifiable under §4 — identity-covered,
result-affecting intent xor chain-anchored fact (derived or
asserted) — and no chain-anchored fact occupies an identity-bearing
position: nothing in the chain-invariant core
(label, version, dig, src, path)and no input ofaction_idderives from one. An audit obligation with a checkable inventory, P5/P10-style — the schema is finite; enumerate and classify it. - P13 — anchoring totality. The signed-object classification of §5 is total and stays total: every signed object class in the corpus is intent, anchored fact, or local, and any new signed object class names its row before landing. Audit obligation over a checkable inventory; the table in §5 is its initial state.
- P14 — reproducibility-contract coherence. (a) Mode transitions
occur only as signed publish-chain appends (promotion/demotion per
§6) — no unsigned or out-of-chain path can alter the mode a consumer
sees; (b) under
reproducible, arecord_core-divergent trusted record at fixedaction_idis classified a defect finding and is not servable as an ordinary cache hit while unadjudicated; (c) underwitnessed, semantics are exactly Execution Model §2.2 (this contract adds nothing). Small state-machine model, TLC-able in the AtomCharter style, owed when the acceptance-policy spec lands; until then the classification stands as specification.
Closure determination deliberately contributes no new obligation:
the build closure's determination is carried by
[lock-action-totality] and the lock spec's formal requirements
([lock-sufficiency], [lock-groundness],
[lock-closure-completeness]), gated by P7 (Execution Model §8) and
by the toolchain-pin lock entry named in §2's tripwire; the runtime
closure's evidence fixpoint is P2's. This model only names what they
jointly mean: the build closure is a determined projection of the
composite, and the runtime closure is bounded by it and located by
evidence.