passport_ref. The bolt-on owns the mapping; the substrate owns the bytes. Anyone can build one today against the published 0.4.0 substrate, with no AlgoVoi service in the loop and no PII in the reference.
Everything you need is already public. The schema, the hash, the conformance vectors, and a worked reference adapter are all published. A passport bolt-on is a thin, auditable mapping plus one hash — not a new primitive.
The reference
passport_ref diverges. An empty field is rejected, not hashed. No name, document number, image, or other PII ever enters the reference — your bolt-on is responsible for keeping it that way (see Keeping it no-PII).
What you build against
Three published surfaces, pick one:
All three produce the same bytes on the same input, and all reproduce the published
agent_passport_lite_v1 conformance vectors.
The recipe
A bolt-on is three steps:- Read the source. Take the verification result from your KYC vendor, IdP, directory, or registry.
- Map to the four fields. Derive a no-PII
agent_id, theissuer(who vouched), a deterministicscope(what was verified), and avalidity_window. Fail closed: only emit a passport for a passed verification. - Compute the reference. Hash the four fields. That
passport_refis theagent_refthe Spend Guardrail (lite) decision binds, so identity composes straight into the pre-payment decision chain.
Worked example: KYC vendors
algovoi-kyc-passport is the reference passport bolt-on. It maps a Jumio or Sumsub identity-verification result into a passport_ref, fail-closed, with a no-PII subject helper.
pip install algovoi-kyc-passport · Apache-2.0 · Python and TypeScript byte-for-byte identical.id_token, a corporate directory record, a wallet attestation: read the result, map to the four fields, hash. Jumio and Sumsub are the worked vendors; the mapping is yours to write for any other.
Appear in the keystone control panel
A bolt-on can plug into the keystone control panel two ways, andalgovoi-kyc-passport does both:
Feed the built-in passport step. to_passport_signals packages a kyc-passport into the panel’s passport-step signals (subject_ref, issuer_did, assurance, age_ms), so the panel evaluates a Jumio/Sumsub identity against the org’s issuer-trust, assurance, and freshness posture:
algovoi.keystone.steps entry-point group, so the panel discovers and lists it with no configuration. The entry point points at a callable that returns a dict with at least step and ref:
step and ref. Your own bolt-on registers the same way — a zero-argument function returning that dict.
Keeping it no-PII
Thepassport_ref is content-addressed and shareable, so nothing private may enter it.
agent_id— use a content-addressed handle, never a raw name or document number. Thesubject_ref(vendor, account_id)helper hashes an opaque vendor account id into"sha256:" + SHA-256("vendor:account_id")for exactly this.scope— encode the verification level and check set, not the underlying data.kyc-verified:identity+liveness:tier2, never a date of birth or address.issuer— a DID or stable identifier for who vouched (did:web:jumio.com), not a person.validity_window— dates only.
Validate your bolt-on
Recompute is the test. Run your bolt-on’s output against the publicagent_passport_lite_v1 vector set (11 vectors, Python + Node runners). If your four-field hash reproduces those vectors byte-for-byte, your bolt-on is conformant and its references compose with every other passport on the substrate.
Where it composes
Apassport_ref is the identity input to the open, pinned pre-payment decision chain. Spend Guardrail (lite) composes the agent (this passport_ref), the spend authority (a mandate reference), and the policy in force (a Policy Binding reference) into one recomputable decision. Because passport_ref is the same agent_ref the decision binds, identity, authority, and policy chain into a single offline-verifiable address.