AXM  Protocol
Genesis kernel Core hub
Chat spoke Show spoke Embodied spoke Fleet spoke SFN spoke
AXM Ecosystem · Fleet Lifecycle Spoke

AXM Fleet

Seal what is running on a deployed asset — who built it, who signed it, what it contains, when it changed, and what key authorized it. Proven offline, with no vendor infrastructure in the loop.

SPOKE lifecycle
KERNEL axm-genesis 1.0.0rc1
SUITE axm-hybrid1
RECORD node_record.json
VERSION v0.1.0
LICENSE Apache-2.0
§ 01

What Fleet Seals

Fleet turns a fleet sustainment record — node_record.json — into a shard compiled, signed, and sealed by the axm-genesis kernel. One record shard is a self-contained, offline-verifiable answer for one asset at one moment. The chain of shards is the asset's lifecycle.

Lifecycle is a supersedes chain. An update is not an edit — it is a new shard that supersedes the previous one. The kernel seals manifest.supersedes and ext/lineage@1.jsonl; axm-fleet history walks the chain from any shard back to first fielding.

Records are succeeded, never mutated. A record is sealed once and never touched again. Deploy, patch, rollback, recovery — each is its own shard, and the sequence over time is the sustainment history. Nothing in the past can be quietly rewritten.

Identity is derived, never stored. A shard's identity is sh1_ + BLAKE3 of the manifest bytes. There is no shard_id field. Same record + same key + fixed --created-at → byte-identical manifest and identical sh1_ id.

Genesis compiles and signs; everything else reads. The spoke owns only domain extraction (record_schema.py, record_compile.py) and its CLI. It never implements signing, hashing, Merkle construction, or resealing. Suite: axm-hybrid1 — Ed25519 ‖ ML-DSA-44.

Trust anchored out of band

Verification never trusts the publisher.pub embedded in the shard being verified. Trust is anchored to a public key supplied out of band — escrowed, published, sealed in an offline ceremony. Verification needs no transparency log, no network, and no reference implementation.

§ 02

The Node Record

The record document itself becomes the sealed content/source.txt; every claim cites a byte span of it. The record's digests bind the external artifacts — the shard seals the record, and the record's hashes pin the image, SBOM, provenance statement, models, and firmware by sha256 content address.

node_record.json ← becomes content/source.txt
  asset ← the physical node
    asset_id · platform
    program · compute_module
  image ← deployed image + supply chain
    image_digest
    sbom_digest · provenance_digest
    signing_key_id · builder
  components ← pinned models + firmware
    version + digest, each
  event ← why this record exists
    event_type · event_time_utc
    authorized_by

Honest Evidence

The digests in examples/*.json are the real sha256 of the files in examples/artifacts/. The test test_artifact_digests_bind enforces it on every push — change an artifact without regenerating its digest and the build fails.

asset

What physical node this describes: asset_id, platform, program, compute_module — the substitutable surface a rehost changes (e.g. node-0042 · som-vendor-a).

image

The deployed image and its supply-chain digests: image, SBOM (spdx-2.3), and SLSA provenance — each by sha256 content address — plus the signing_key_id and builder that produced it.

components

Pinned models and firmware, each carrying a version and a sha256 digest — the exact detect-model and autopilot firmware running on the node.

event

Why this record exists: deploy | patch | rollback | recovery, when (event_time_utc), and who authorized it (authorized_by).

Claim Tiers

Every claim in the shard carries a tier assigned at extraction time by which part of the record it comes from — a semantic distinction, not configuration.

TierSourceClaims
Tier 0 digests, key id Integrity facts — content addresses of image / SBOM / provenance / components, and the signing key id. Facts, not choices.
Tier 1 configuration Build id, versions, platform, compute module — the surface a rehost changes.
Tier 2 event What happened, when, and authorized by whom.
§ 03

The Four-Beat Demo

./demo.sh is the product. CI runs it on every push — every claim below is a runnable command with a real, observable result, not a promise. Throwaway keypairs are generated per run; a hardcoded key would be a regression.

1

Record

axm-fleet record examples/node-0042.deploy.json pool/deploy --key publisher.key compiles the deploy record and prints the derived sh1_ identity. Then axm-verify shard pool/deploy --trusted-key publisher.pub verifies it offline against a key supplied out of band → PASS.

2

Patch

Compile a successor with --supersedes sh1_<deploy-id>. The kernel seals the lineage — it emits manifest.supersedes and ext/lineage@1.jsonl. axm-fleet history pool/ walks the chain from the patch back to the deploy.

3

Tamper

Flip one sealed byte in content/source.txtE_MERKLE_MISMATCH. Verify the untampered shard against the wrong trusted key → E_SIG_INVALID. There is no escape hatch; either failure halts the pipeline.

4

Remove the Vendor

Verify the same shard with the independent Go verifier in axm-genesis (verifiers/go), built from the spec and vectors alone. axm-verify-go shard pool/patch --trusted-key publisher.pubPASS. Remove the reference implementation and the record still proves out — the record layer passes its own substitution test.

./demo.sh — condensed run bash · CI on every push
# beat 4 needs a Go toolchain and an axm-genesis checkout:
$ AXM_GENESIS=/path/to/axm-genesis ./demo.sh
 
== 1. RECORD ==
deploy record: sh1_…
{"shard":"…","status":"PASS","error_count":0,"errors":[]}
 
== 2. PATCH — kernel seals the lineage ==
patch record: sh1_…
--- ext/lineage@1.jsonl · --- chain: history walks deploy → patch
 
== 3. TAMPER ==
(FAIL as required — E_MERKLE_MISMATCH)
(FAIL as required — E_SIG_INVALID)
 
== 4. REMOVE THE VENDOR — independent Go verifier ==
(second implementation, built from the spec alone: PASS)
§ 04

Three Record Types

Same kernel, three spokes, three record types. Genesis compiles and signs all of them; each spoke owns only its own domain extraction. Fleet is the one that seals lifecycle over time.

Spoke Seals Record Shape
axm-show Mission authorization — what may fly, under which ceiling show_spec.json One-shot
axm-fleet Lifecycle — what is running, and how it got there node_record.json Supersedes chain
axm-sfn Hardware custody — what the machine attested it did session journal TPM-bound

Cross-reference, never a live lookup

show_spec may cite a fleet node record shard by sh1_ id — one per drone flying that show.
binding  is a content address, never a network call or a code dependency in either direction.
result   the mission authorization pins exactly what was running on each asset it authorized.
§ 05

Roadmap

A natural next step — aspirational, not yet implemented — is a hardware-attestation capsule on fleet records, following the conventions axm-sfn already established rather than inventing new ones.

tpm-attestation@1 (RFC 0006)

A capsule carrying the node's TPM quote at record time — self-fingerprinting key rows, algorithm-tagged signature rows, blobs indexed into content/, everything recomputable from the shard alone. The kernel would seal it in one pass via extra_content/extra_ext; the claim outlives the TPM's cryptography. This tpm-attestation@1 (what hardware attested) is distinct from RFC 0005's attestations@1 (when a shard existed).

§ 06

Quick Start

Install + Record + Verify bash
# The kernel. Pin the exact commit until axm-genesis is on PyPI.
$ pip install 'axm-genesis[mldsa-compat] @ git+https://github.com/BigBirdReturns/axm-genesis@fffe7cf0f1c78c8c4bea5f303099db80f7c53ba3'
$ pip install -e . # this spoke
 
# A throwaway or offline-ceremony publisher identity — never a default key.
$ axm-build keygen /secure/axm-keys --name publisher
 
# Deploy: the first record for an asset. Prints the derived sh1_ id.
$ axm-fleet record examples/node-0042.deploy.json pool/deploy \
    --key /secure/axm-keys/publisher.key
 
# Patch: a successor record; the kernel seals the lineage.
$ axm-fleet record examples/node-0042.patch.json pool/patch \
    --key /secure/axm-keys/publisher.key --supersedes sh1_<deploy-id>
 
# Audit: offline, out-of-band trust anchor. Then walk the chain.
$ axm-verify shard pool/patch --trusted-key /secure/axm-keys/publisher.pub
$ axm-fleet history pool/
Run the test suite pytest · 9 tests
$ python -m pytest tests/ -v # Go test skips without a toolchain
test_fleet_roundtrip .............................. PASSED
test_artifact_digests_bind ........................ PASSED
 
# The spoke does not check kernel requirements itself — the kernel
# verifier runs against the spoke's own output: the tamper roundtrip,
# the wrong-trusted-key case, the supersede/lineage chain, artifact-
# digest binding, reproducible builds, and cross-verification by the
# independent Go verifier.