Architecture¶
agent-passport composes three layers on top of did:key identities: an operator-signed
passport (a VC with scopes), agent-signed actions, and a verifier that checks the chain.
flowchart LR
OP["operator DID"] -- issuePassport --> P["Passport (VC)<br/>name · model · scopes"]
P -- about --> AG["agent DID"]
AG -- signAction --> ACT["Action (JWT)"]
P --> VF{{"verifier"}}
ACT --> VF
VF --> OK["trusted if:<br/>action→agent · passport→trusted operator · scope covers action"]
Module map¶
| Module | Responsibility |
|---|---|
did.ts |
Ed25519 did:key identities (operators & agents) |
passport.ts |
Issue/verify the scoped passport VC; scope helpers |
action.ts |
Sign/verify individual agent actions (did-jwt) |
Design principles¶
- Attestation, not enforcement — it proves identity/authority; you enforce
assertScopeat your tool boundary and log signed actions to your audit store. - Tamper-evident — actions are signed by the agent's key, so a compromised server can't forge them.
- Trust is rooted in operators — verifiers keep an allow-list of operator DIDs they accept.
- Offline —
did:keyresolves locally; use shortexpiresInsince there's no revocation.