Skip to content

Family registry

One family, one namespace. This page indexes every registered identifier across both layers, so a proposed new value can be checked for collisions in one place and the shared conventions can be read once instead of inferred twice.

It is an index, not a definition: the linked section is the normative home of each value, and the drift check (scripts/check-ssp-drift.py) asserts that every literal below still appears in its home specification — a row here cannot quietly outlive the thing it names.

Durable signed records are versioned by their protected content type, named sovm/<layer>-<record>-v<N>. The content type sits inside the signed structure, so it cannot be swapped in flight, and a verifier that does not know it fails closed.

Content type Record Normative home
sovm/ssp-event-v1 Change event SSP/1 data model
sovm/ssp-vouch-v1 Vouch certificate SSP/1 identity
sovm/ssp-role-v1 Role assignment SSP/1 scope
sovm/ssp-binding-v1 Transport binding SSP/1 transport
sovm/sop-access-v1 Access record (wrapped DEK) SOP/1 domains
sovm/sop-recovery-root-v1 Recovery root SOP/1 objects

Transient transcript signatures and derivations use raw ASCII labels, named sovm-<scope>-<purpose>-v<N>. The dividing rule: durable records get content types; a signature that never outlives its ceremony gets a label.

Label Purpose Normative home
sovm-mesh-id-v1 mesh_id derivation SSP/1 terminology
sovm-mesh-pair-v1 Pairing transcript SSP/1 identity
sovm-mls-credential-binding-v1 MLS credential binding transcript SOP/1 identity

Scoped by their input key rather than globally.

info Purpose Normative home
pair-session Pairing session key SSP/1 identity
pair-sas SAS derivation SSP/1 identity

Manifest-carried enumerations of the object plane. An implementation MUST fail closed on an unregistered value in either column (SOP/1 blob extension, section 1).

Identifier Kind Normative home
SOP-PME-1 Encrypted-object format (Parquet) SOP/1 Parquet profile
SOP-BLOB-1 Encrypted-object format (chunked AEAD blob) Blob extension format
blob object_kind manifest value Blob extension manifest profile

Four rules hold across the whole family, stated once here and instantiated in each specification:

  • One signature container. Every durable record in either layer is a COSE_Sign1 message: EdDSA (Ed25519) only, deterministic CBOR payload, the signer’s 16-byte site_id in the protected kid, empty unprotected bucket, fail-closed on unknown critical headers. SOP/1 additionally uses one encryption suite (A256GCM COSE_Encrypt0) for its wrapped-key records; SSP/1 seals nothing.
  • One context principle. external_aad carries what the verifier must supply rather than trust. SSP/1 records bind the 16-byte mesh_id; SOP/1 records bind richer per-record context — storage identity, domain, key generation — on the same principle. A record replayed outside its context does not fail a policy check; it fails signature verification.
  • One hash. An identifier is BLAKE3 over the exact bytes of a signed or stored structure — event_id, access_record_hash, object_manifest_hash, storage_id, every chain link. Neither layer maintains a second hash namespace.
  • One chaining shape. Policy-shaped state is a chained record: monotonic generation plus predecessor hash, per authority. SOP/1 instantiates it for authorization records and sequencing receipts; SSP/1 for role assignments and (generation-only) transport bindings. A fork in any chain is detectable evidence, never a silent divergence.

A new identifier MUST be registered here in the same change that introduces it, and MUST follow the naming patterns above. The registry exists precisely so that the check is one page rather than two specifications.