The immutable cryptographic foundation. Every shard sealed. Every claim provable. Nothing changes here without a frozen-spec RFC.
Genesis is the only package in the AXM ecosystem with write access to the signed shard format. Everything else reads. This boundary is the invariant that makes long-term verification possible.
Tamper-evident by construction. Every byte in a shard is covered by a BLAKE3 Merkle tree. The root is signed post-quantum. Tamper any byte — content, graph, evidence, or extension — and verification fails. There is no escape hatch.
The spec is frozen. spec/v1/SPECIFICATION.md is normative and sealed at the v1.0.0 tag. Changes require an RFC in rfcs/; a breaking change means a new major format, never a mutation of this one. Profiles and extensions add; the kernel never changes.
The gold shard is the definition of correctness. fm21-11-hemorrhage-v2 is never recompiled. A verifier change that breaks the gold shard is rejected — the gold shard wins. CI enforces this on every commit.
Hybrid post-quantum. One suite: axm-hybrid1 — Ed25519 ‖ ML-DSA-44 (FIPS 204), and verification succeeds only if both components verify. A future break of either algorithm, quantum or cryptanalytic, leaves the other holding.
Six cryptographic and structural primitives are frozen across all axm-genesis >= 1.x releases. A spoke built against any of these will continue to work without modification.
One construction, forever: domain-separated with RFC 6962 odd-node promotion. Leaf: BLAKE3(0x00 ‖ path ‖ 0x00 ‖ bytes). Node: BLAKE3(0x01 ‖ left ‖ right). Sorted by UTF-8 path. Empty root: BLAKE3(0x01).
The axm-hybrid1 suite: Ed25519 ‖ ML-DSA-44 (FIPS 204). pk = 1344 B, sig = 2484 B, and both components must verify over the domain-separated message "axm-genesis/v1/manifest" ‖ 0x00 ‖ manifest.
All graph and evidence tables are canonical JSONL — one canonical-JSON record per line, sorted bytewise by primary key, reproducible byte-for-byte in any language. Parquet is demoted to a derived, local query cache outside the shard.
Supersession chains via ext/lineage@1.jsonl. Cross-shard claim links via ext/references@1.jsonl, binding to derived sh1_ shard identities. Both are Merkle-covered extension tables — optional, additive, and verifiable.
Every entity, claim, provenance row, and span is named by the full SHA-256 of its canonical preimage — base32, 52 chars, versioned prefixes e1_ c1_ p1_ s1_. Shard identity is sh1_ + BLAKE3 of the manifest bytes, derived, never stored.
Named, versioned check-sets over content/ and ext/ — e.g. embodied@1 for hot-stream continuity. Declared in the signed manifest; verifiers report them checked or unchecked, and unchecked never impersonates passed.
One suite (RFC 0002). The suite field in manifest.json is required and must equal axm-hybrid1; there is no suite negotiation and no detection by key size.
| Suite Identifier | Algorithm | Key | Signature | Merkle | Status |
|---|---|---|---|---|---|
| axm-hybrid1 | Ed25519 ‖ ML-DSA-44 (FIPS 204) — both must verify | 1344 B | 2484 B | RFC 6962 odd-node promotion | Hybrid PQ Only suite |
All three layers use the same Genesis container format. The distinction is semantic — enforced by convention, not by protocol. Genesis seals layers 1 and 2. It never touches layer 3.
The reference verifier axm-verify runs seven checks in sequence. A failure at any step halts the pipeline. Exit 0 = PASS, Exit 1 = FAIL, Exit 2 = malformed layout.
Required root items: manifest.json, sig/, content/, graph/, evidence/. Optional: ext/. Unexpected items trigger E_LAYOUT_DIRTY. Symlinks, dotfiles rejected unconditionally.
manifest.json is read once — the same bytes are used for signature verification and identity to prevent TOCTOU swaps. Byte-exact canonical encoding, every required field validated (spec_version, suite, created_at format, sources bijection, statistics), closed key set, no shard_id.
Requires --trusted-key. The shard's publisher.pub must match the trusted key exactly. Then both hybrid components — Ed25519 and ML-DSA-44 — must verify over the domain-separated message.
All shard files except manifest.json and sig/ are hashed using the single frozen Merkle construction. Computed root must match manifest.integrity.merkle_root exactly.
Each line of entities, claims, provenance, and spans must be canonical JSON with the exact frozen key set and types; rows sorted bytewise by primary key, no duplicates, no nulls, no floats. Entity and claim IDs are recomputed from their preimages.
Every claim subject and entity-type object must exist in entities. Every provenance and span must reference a content file whose SHA-256 is in sources. Byte ranges are validated and span text is confirmed against file bytes.
Every profile the manifest declares and the verifier implements is run (e.g. embodied@1 → E_BUFFER_DISCONTINUITY); the rest are reported in profiles_unchecked. Unchecked is not passed.
Spokes that produce shards must satisfy the four kernel requirements; domain checks (the former REQ 5) live in profiles. Run the conformance suite with pytest tests/test_conformance.py -v.
| REQ | Description | Error Codes |
|---|---|---|
| REQ 1 | Manifest integrity — byte-exact signature over the manifest | E_SIG_INVALID E_MERKLE_MISMATCH |
| REQ 2 | Content identity — all content files covered by Merkle tree | E_MERKLE_MISMATCH E_REF_SOURCE |
| REQ 3 | Traceable lineage — all references valid, no nulls in required fields | E_REF_ORPHAN E_SCHEMA_NULL |
| REQ 4 | Proof bundle — valid hybrid signature from a trusted publisher key | E_SIG_INVALID E_SIG_MISSING |
| embodied@1 | Non-selective recording — a profile, not a kernel requirement: no gaps in the binary hot stream, for shards declaring it | E_BUFFER_DISCONTINUITY |
All error codes are prefixed E_ and defined in axm_verify/const.py. Existing codes are never renamed or removed — only new codes are added in minor versions.
| Code | Meaning |
|---|---|
| Layout | |
| E_LAYOUT_MISSING | Required directory or file absent from shard root |
| E_LAYOUT_DIRTY | Unexpected file or directory found at shard root or in required subdirectory |
| E_DOTFILE | Dotfile found anywhere in the shard tree |
| Manifest | |
| E_MANIFEST_SYNTAX | manifest.json is not valid JSON |
| E_MANIFEST_SCHEMA | manifest.json missing required field or field has wrong type |
| Signature | |
| E_SIG_MISSING | sig/manifest.sig or sig/publisher.pub not found |
| E_SIG_INVALID | Either hybrid component fails to verify, trusted-key mismatch, or wrong key/signature length |
| Integrity | |
| E_MERKLE_MISMATCH | Computed Merkle root does not match stored value in manifest |
| Core tables | |
| E_SCHEMA_READ | Table unreadable, malformed or non-canonical JSON line, rows out of order, or duplicate primary key |
| E_SCHEMA_MISSING | Required core table (.jsonl) absent |
| E_SCHEMA_TYPE | Unexpected key in a record, or a value of the wrong JSON type |
| E_SCHEMA_NULL | Required field missing from a record, or null |
| E_SCHEMA_ENUM | Invalid object_type or tier value |
| Identity | |
| E_ID_ENTITY | entity_id does not match recomputed hash from namespace + label |
| E_ID_CLAIM | claim_id does not match recomputed hash from subject + predicate + object |
| References | |
| E_REF_ORPHAN | Claim subject or entity-type object not found in entities table |
| E_REF_SOURCE | span or provenance source_hash not in content/, or byte range out of bounds |
| E_REF_READ | Content file unreadable during span byte-range verification |
| Profile: embodied@1 | |
| E_BUFFER_DISCONTINUITY | Frame gap, bad magic, or truncation in cam_latents.bin (profile code — shards declaring embodied@1 only) |