Skip to content
VerifAIer
Home / Docs / Engineering / Identity · passport · reputation
Engineering · Lifecycles

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)
= '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 → trust profile → passport → reputation composition. Source: identity/, passport/, reputation/.
Not auth. None of this is authentication, authorization, an account, OAuth or IAM. It represents who the agent is as observed through operational evidence, nothing more. No prompts, no secrets.

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.

src/vailidator/identity/engine.py · models.py

The identifying attributes are read structurally from the envelope with explicit-override precedence: providerprovider.provider (or execution.selected_provider), platformprovenance.source, runtimeoperation, agent_nameprovenance.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.

src/vailidator/identity/trust_score.py

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.

src/vailidator/passport/engine.py · models.py

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 / unknown
AgentPassport 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:

src/vailidator/reputation/engine.py · reputation/scoring.py
ComponentWeightBasis
average_trust40mean trust score across the agent's operations
consistency20worst-case trust score (higher = more consistent)
maturity15amount of operational history (caps at 10 operations)
compliance10share of operations with complete compliance coverage
risk_health10weighted goodness of observed risk levels
quality_health5weighted 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.