Identity, passport & reputation lifecycle
The identity stack turns per-operation evidence into a durable, portable representation of an AI agent, without authentication, accounts, or IAM.
Four layers turn ephemeral operations into a durable agent representation. Each composes the one below it and duplicates none of its logic:
flowchart TD EV["EvidenceEnvelope"] --> IE["IdentityEngine.identify(envelope, trust)"] TR["TrustAssessment"] --> IE IE --> DID["derive_agent_id(provider|platform|runtime|agent_name|agent_type)Identity → trust profile → passport → reputation composition. Source: identity/, passport/, reputation/.
= 'agent_' + sha256[:16]"] DID --> AI["AgentIdentity (stable id across executions)"] AI --> OB["AgentTrustScoreEngine.observe(identity, trust)"] TR --> OB OB --> PROF["AgentTrustProfile
avg/best/worst · counters · operation_count"] AI --> PE["PassportEngine.issue(identity, trust_profile)"] PROF --> PE PE --> PASS["AgentPassport (pass_ = sha256(agent_id)[:16])"] AI --> RE["ReputationEngine.assess(identity, trust_profile, passport)"] PROF --> RE PASS --> RE RE --> REP["AgentReputation (rep_ = sha256(agent_id)[:16])"]
Identity
IdentityEngine.identify(envelope, trust) derives an AgentIdentity whose agent_id is content-derived: a SHA-256 over provider | platform | runtime | agent_name | agent_type, truncated to 16 hex chars and prefixed agent_. The same agent therefore resolves to the same id across executions and processes, that is what makes it a persistent identity rather than a per-operation record.
The identifying attributes are read structurally from the envelope with explicit-override precedence: provider ← provider.provider (or execution.selected_provider), platform ← provenance.source, runtime ← operation, agent_name ← provenance.actor. Latest trust posture (latest_trust_level/score, compliance/risk/quality levels) is copied from the supplied TrustAssessment. Malformed input never raises.
Trust profile
AgentTrustScoreEngine.observe(identity, trust) folds observations for the same agent_id into an AgentTrustProfile. On each observation: first_seen is preserved, last_seen advances, operation_count increments, the running average/best/worst trust scores update, and level/status counters bump (a missing value counts as unknown). It is in-memory only, not a passport, not global reputation, not persistence.
Passport lifecycle
PassportEngine.issue(identity, trust_profile) composes an identity and/or a trust profile into an AgentPassport: a portable trust document (not a credential). It reads their already-safe serialized summaries and arranges them; it duplicates no identity or scoring logic. passport_id is content-derived from agent_id (pass_ + SHA-256[:16]), stable per agent.
Passport status reflects how much operational trust data backs the document:
stateDiagram-v2 [*] --> unknown: no identity and no profile [*] --> provisional: has data, latest_trust_level None/unknown [*] --> active: has data, concrete latest_trust_level provisional --> active: trust level becomes concrete active --> provisional: trust level lost / unknownAgentPassport status transitions. Source: passport/engine.py _status().
See the full passport schema. The POST /api/v1/passport/issue endpoint can take an explicit identity/trust_profile, or derive the whole stack from evidence: in which case it uses a fresh per-request score engine (exactly one observation).
Reputation lifecycle
ReputationEngine.assess(identity, trust_profile, passport) derives a longitudinal AgentReputation by composing the layers (precedence: profile > passport > identity). reputation_id is content-derived from agent_id (rep_ + SHA-256[:16]). Scoring is fully explainable: every component's contribution sums to the score:
| Component | Weight | Basis |
|---|---|---|
| average_trust | 40 | mean trust score across the agent's operations |
| consistency | 20 | worst-case trust score (higher = more consistent) |
| maturity | 15 | amount of operational history (caps at 10 operations) |
| compliance | 10 | share of operations with complete compliance coverage |
| risk_health | 10 | weighted goodness of observed risk levels |
| quality_health | 5 | weighted goodness of observed quality levels |
Level bands: excellent ≥ 85, strong ≥ 70, stable ≥ 50, else weak; unknown when there is no operational history and no average. Findings are emitted for every component scoring below its maximum, with a severity derived from the contribution ratio. See the registry for how these records are indexed per agent.