Authorizing surface
Use the typed lineage verification APIs in each SDK language (for example Rustverify_lineage with VerifyConfig, TypeScript/Python/Go/Swift/Kotlin
typed verify-request equivalents). Those APIs:
- select parent keys from validated parent DID documents (not from the proof’s embedded key alone);
- require verifier-supplied trust anchors for human roots;
- bind proof type, algorithm, canonicalization, proof purpose, parent and child verification methods and keys, derivation path, and generation;
- reject legacy unbound three-field proofs as non-authorizing.
The proof chain
Each parent-child pair is bound by anAgentLineageProof2025: the
parent’s Ed25519 signature over a fully bound canonical payload, with the
HKDF-SHA256 derivation path recorded. The lineage section of a document
carries:
humanRootDid— the ultimate root (HMR, MHR, or ENR)creatorDid— the direct parentgeneration— derivation steps from the root (0 = direct child)derivationProof— the signed linkhumanRootChain— ordered DIDs from this entity to the rootorgInclusionProof— optional Merkle proof binding this entity to the creator’s org rootanchorRefs— optional anchor references (see anchors)
Verification rules
- Typed authorization — only the typed verify APIs may authorize; structural prechecks never grant privilege
- Chain completeness — every link must resolve; a broken link means rejection
- Key binding — the proof’s parent key must match the key authorized
on the parent document (
capabilityDelegation); child keys bind to the child document - Generation consistency —
generationequals chain length minus one - Human root termination — the chain must end at
hmr,mhr, orenrpresent in the verifier’s trust anchors (ENR chains additionally verify the governance section) - Immutability — lineage never changes after establishment; rotation is a new document, not an edit
- Revocation cascades — a revoked ancestor poisons the whole tree below it
Derivation
Child identities derive deterministically: HKDF-SHA256 from the parent key plus a derivation path (BIP-44/SLIP-0010 conventions). The derived key
signs nothing until the parent signs the lineage proof binding the child
to the chain — proof first, use second.
Public verifiers do not recompute child secret material from a parent
public key. Authorizing verification checks the signed, fully bound proof
against resolved documents and trust policy.
Org inclusion
Entities created under an organization (MHR/ENR) bind to the org’s lineage root with a Merkle inclusion proof: the org commits a root over its members, and each entity carries its path. When the anchor backend has anOrgLineageRoot for the creator, the proof is required at resolution;
when it has none (e.g., an HMR creator), the check is skipped — present
versus absent is data, not policy.
Proofs offline, authority anchored
A complete, signature-valid chain proves structure under the authorizing verifier contract. It cannot prove the negative: that the root was ever registered, or that nothing in the chain has been revoked or superseded since. That answer is authority, and it comes from the anchor backend.- Cryptographic checks can run offline when documents and anchors are bundled.
- Privileged paths — sessions, credentials, org membership, wallet authority — require the anchor’s answer too, and fail closed when there is none.
- Trusted anchor schemes are verifier policy (anchor policy); documents declare refs, verifiers choose.
Depth and performance
Chains are capped (recommended defaultMAX_GENERATION = 16, spec minimum
support 10): verification is sequential resolution of ancestors, so
pathologically deep chains degrade every verifier that meets them.
Timeouts are enforced per-resolution (5s) and per-chain (30s) — a timeout
reports unverifiable, never invalid.
Next
- Anchors — where authority comes from
- DID resolution — the pipeline that walks this
- OAS overview — the specification context
- FROST — threshold roots and share migration notes