# Agent Passport — what does an on-chain identity actually *prove* about an AI agent? There is a popular idea that if you register an AI agent on a blockchain, it becomes trustworthy — "the agent lives forever on-chain." This is mostly false, and the interesting part is *why* it's false. An agent is not its identity record. The thing that actually acts — the model weights, the prompt, the tools, the keys, the operator paying the inference bill — lives off-chain and can change or disappear at any moment. A chain cannot preserve cognition. It can only preserve a record of **what an identity claimed to be, who controlled it, and in what order those things changed** — and it can make that record impossible to rewrite. So this realm doesn't try to prove an agent is safe. It does something more honest and more useful: it tracks the **drift** of an identity over time and puts it in front of you. ## The model An agent is a persistent Gno object, not NFT metadata scattered across contracts: ```go type Agent struct { ID string Owner address Operators []address Runtime string // e.g. "claude-opus-4-8@" Endpoints []Endpoint // MCP / A2A / DID / URL Caps []string // self-declared capabilities Status Status // active | suspended | retired CreatedAt int64 UpdatedAt int64 History []Event // append-only lifecycle log } ``` Because it's a normal object graph, other realms don't parse it — they *ask* it: ```go passport.IsActive("percy") // is this identity live? passport.IsOperator("percy", caller) // may this key act as the agent? ``` That is the composability angle Gno gives you for free: the identity layer is an importable package, not an ABI you reverse-engineer. ## Why "drift" is the whole point Every mutation is appended to an immutable log, and the profile page surfaces the two changes that most weaken an identity as evidence: - **ownership changes** — the operator behind the identity may now be someone else entirely; - **runtime changes** — the thing acting under this name is (partly) a different thing than the one that built the reputation. ``` ## Drift - Ownership changes since creation: 1 - Runtime changes since creation: 3 ``` A reputation attached to "percy" means very little if percy changed owners last week and swapped models three times. The chain can't tell you the agent is good — but it *can* stop that history from being quietly erased. ## Try it ```go // register (caller becomes owner) passport.Register(cross(cur), "percy", "claude-opus-4-8@abc123") // authorize a second signing key passport.AddOperator(cross(cur), "percy", operatorAddr) // record a model change — logged loudly as drift passport.SetRuntime(cross(cur), "percy", "claude-opus-4-8@def456") // lifecycle passport.Suspend(cross(cur), "percy") passport.Reactivate(cross(cur), "percy") passport.Retire(cross(cur), "percy") // terminal ``` (From `gnokey maketx call`, the crossing is implicit — you just call `Register percy "claude-opus-4-8@abc123"`.) Browse the registry at the realm root, and any agent's profile + full lifecycle log at `:` (e.g. `.../passport:percy`). Run the tests: ```sh gno test . ``` ## What it deliberately does *not* do - It does not prove capabilities. `DeclareCapability` records a *claim*; proving work happened belongs to an execution-receipt realm, and validating it belongs to a review/jury realm. - It does not authorize specific actions. "Who is this agent" and "may this agent do this exact thing, once, under this budget" are different questions — the second is a capability, not an identity. Identity is the floor, not the ceiling. It tells you *who is claiming to act* and *how much that claim has drifted* — and then gets out of the way of the mechanisms that actually establish trust. --- Part of **[moul/gno-contracts](https://github.com/moul/gno-contracts)** — moul's versioned gno.land contracts. See the repository for the full catalog, build/test tooling, and usage. **Dependency graph:** ![gno.land/r/moul/agents/passport/v0 dependency graph](https://raw.githubusercontent.com/moul/gno-contracts/main/_assets/gno.land/r/moul/agents/passport/v0/deps.png) > ⚠️ **Disclaimer:** provided as-is, without warranty; not security-audited. Full disclaimer: [DISCLAIMER](https://github.com/moul/gno-contracts/blob/main/DISCLAIMER.md).