ADR-010: QNTX Identity System — Vanity Subjects and Attestation System Unique IDs

Date: 2026-03-06 Status: Completed (steps 1-4, 6). Step 5 won't-do.

Context

QNTX used teranos/vanity-id (Go, v0.3.0) for all ID generation — attestation IDs, subject names, job IDs. The library was imported in 25+ files. It worked, but it was a single Go module that couldn't run in the browser, and it conflated two fundamentally different concerns: human-readable names and unique attestation identity.

Decision

QNTX's identity system has three orthogonal layers, each with distinct properties:

LayerPurposeUniquenessMutabilityExample
Vanity IDHuman-readable subject handleSemi-unique (context disambiguates)Immutable once assignedSARAH, SBVH, ACME
ASUIDAttestation identityUnique (random suffix)Generated once per attestationAS-SARAH-AUTHOR-GITHUB-7K4M
Node DIDSigner identityGlobally unique (ed25519 keypair)Generated once per nodedid:key:z6Mk...

Node DIDs already exist (server/nodedid/). This ADR defines the first two layers and commits to implementing them in Rust.

Vanity IDs

Vanity IDs are human-readable handles for subjects only. They are names, not keys.

Vanity IDs do not apply to predicates, contexts, or actors.

ASUIDs (Attestation System Unique IDs)

ASUIDs are unique identifiers for attestations with readable SPC segments for log scanning.

Structure:

AS-SARAH-AUTHOR-GITHUB-7K4M3B9X
╰prefix╯╰─S──╯╰──P──╯╰──C──╯╰──suffix──╯

Randomness is caller-provided:

Implementation: Rust crate qntx-id

Both layers are implemented in the Rust crate qntx-id, maintained in this repository. The Go dependency on teranos/vanity-id has been retired (#793).

Design principles:

Migration order (each phase independently shippable):

  1. Core alphabet and normalization — Done. Custom alphabet (Crockford-inspired, no 0/1), Unicode-to-ASCII, seed cleaning.
  2. ASUID generation — Done. Prefix system (AS, JB, PX), SPC display segments, random suffix.
  3. Random ID generation — Done (#793). For non-attestation uses (embedding IDs, run IDs).
  4. WASM bridge — Done. Both wazero and browser targets.
  5. Vanity ID generation — Won't do. Subject name derivation (name→handle) is not needed.
  6. Retire teranos/vanity-id — Done (#793). Removed from go.mod, all callers migrated.

Consequences

Positive

Negative

Neutral

References