Open spec · v0.1

.aif / .aifp

AiFER Information Format — quantum mesh in plain English.

Most chains start from a token. AiFER starts from a question: what is the smallest, most honest piece of data two people can exchange without trusting a server in the middle? The answer is a capsule with a content-address, two signatures (classical + post-quantum), and a payload small enough to fly over WebRTC. We call it `.aif`. The gossip-layer counterpart is `.aifp`. The rest of this document is what those bytes actually look like.

Status: draft, v0.1. AI-first, mesh-native. Breakende changes tot we het naar v1.0 vrijgeven.

1. Doel

Twee complementaire formaten voor data op de AiFER quantum-mesh:

.aif (capsule) .aifp (packet)
Levensduur durable (Spine + Walrus-store) ephemeral (mesh wire)
Content-id BLAKE3 (32B), hex sequence + origin
Signed Ed25519 over CID nee (transport layer auth)
Compressie gzip (v0.1) → Zstd-dict (v0.2) gzip-light
Transport IndexedDB / Walrus Trystero / WebRTC
Wire-encoding CBOR CBOR

2. .aif Capsule

Envelope (CBOR-encoded):

{
  cid: string,             // hex(blake3(cbor(capsule)))
  capsule: {
    magic: "aif1",
    kind: "note" | "post" | "message" | "profile" | "listing" | "capsule" | "checkpoint",
    schema: number,        // payload-schema versie binnen kind
    createdAt: string,     // ISO-8601
    author: string,        // hex(ed25519 pubkey, 32B)
    parent?: string,       // optional vorige CID (edit-chain)
    compression: "none" | "gzip",
    payload: bytes         // CBOR-encoded payload, optioneel gzipped
  },
  sig: string              // hex(ed25519_sign(cidBytes, authorPriv))
}

Verificatie

  1. Bereken cid' = blake3(cbor(capsule)) → moet gelijk zijn aan envelope.cid.
  2. ed25519_verify(sig, cid', author) → true.
  3. (Optioneel) decompress + cbor-decode payload.

3. .aifp Packet

{
  magic: "aifp",
  seq: number,             // monotonic per origin sessie
  from: string,            // 8-byte hex nodeId (== ferMesh nodeId)
  kind: "delta" | "ping" | "ack" | "bloom" | "want",
  payload: bytes,
  ref?: string             // optionele CID waarop deze delta voortbouwt
}

Geen handtekening — auth gebeurt op de transport layer (Trystero room password in v0.2, X3DH-achtig handshake in v1.0).

4. Data-besparing — geplande quantum-tech roadmap

v0.1 (nu) v0.2 v1.0
Compressie gzip via CompressionStream Zstd + per-domein shared dictionary Adaptive: AI kiest dict per peer-paar
Dedup BLAKE3 content-id Walrus erasure-coded chunks Reed-Solomon over peer-set
Sync volledige lijst-uitwisseling Bloom-filter diff Quantum-inspired probabilistic sync (peers wisselen signatures over hun set uit)
Samenvatten n.v.t. AI rolt 1000 messages op tot 1 .aif checkpoint AI extraheert semantische indexen, originelen mogen weg

5. Identity

Node-keypair (Ed25519) wordt gegenereerd op eerste app-load en in localStorage.aifer:identity:v1 opgeslagen. v0.2 verhuist naar IndexedDB + PBKDF2-wrapped seed; v1.0 voegt zkLogin-derivatie toe (Sui-style).

6. Routing in de chain

  • .aif van kind note, message, postLattice (FAST) voor directe finality, periodieke roll-up naar Spine.
  • .aif van kind listing, profile, checkpointSpine (CANON) direct, want waardevol of identity-kritisch.
  • .aifp blijft altijd op de mesh; wordt nooit gepersisteerd voor langer dan één checkpoint-ronde.

7. Compatibiliteit & forward versions

  • magic velden zijn versie-gestuurd: aif1, aif2. Decoders MOETEN onbekende magic met kind: "unknown" markeren en doorgeven, niet droppen.
  • Onbekende velden in capsule MOETEN behouden blijven (CBOR roundtrip).

8. Referentie-implementatie

src/lib/aif/codec.ts (encode/decode/sign/verify), store.ts (IndexedDB), types.ts (shared types). Eerste consumer: Notes app (src/routes/_authenticated/apps.notes.tsx).