ARIA
Status & Conformance
@aria-registry/verify 1.x — refer to the preview line.spec_version: "1.0" and be issued by TrustLayer Foundation (issuer DID TBD). Until then, preview credentials remain resolvable and are distinguished by their issuer.What is normative here. Sections labeled normative define verifiable behaviour; MUST, MUST NOT, SHOULD and MAY are RFC 2119 keywords. Sections labeled informative and every appendix except E explain and position; nothing in them binds an implementation. Precedence: this specification → the Verification Requirements → their JSON representation. Where the deployed behaviour and this text disagree on the wire format, the conformance vectors in aria-protocol/conformance/ decide and the text is a bug.
Terminology. Defined once, here; used without redefinition below.
| Term | Meaning |
|---|---|
| Registry (Registration Authority) | The operator that performs verification, holds the Case File and the customer relationship, and attests to the result under its own signature. Today: registry.aria.bar. |
| Authority (TLF) | TrustLayer Foundation: stewards the specification, arbitrates namespace uniqueness, signs on the registry’s attestation. Never sees personal data. |
| Case File | The append-only evidentiary record a registry keeps for every L1+ credential (EXP-01). Never in the AID. |
| Flag | A recorded doubt on a Case File that blocks issuance or renewal until a human reviews it. |
| Authoritative Source | The public register of the jurisdiction of incorporation against which an entity is confirmed. |
| Route A / Route B | Direct query of the Authoritative Source (Class 1 jurisdictions) / documentary route with reinforced spot-check where no direct query exists (Class 2). Class 3 has no reliable source: ceiling L1. |
| Controller | Whoever holds the agent’s holder key and can publish the anchor TXT — normally the Account Admin acting for the Principal (§4). The party that performs the did:aria operations in §3. |
| Holder key | The agent’s Ed25519 keypair (RFC 8032), generated by the controller on its own machine; the key that signs Intent Declarations and answers receiver challenges (§8). Distinct from the issuer’s composite key (§5). |
| Binding Officer | A natural person with proven power to bind the entity, evidenced by public instrument (L3). |
| Preview line | Credentials and texts labeled 1.0–1.2 between April and August 2026. No production adoption; distinguished by issuer DID; sunset at cutover. |
Protocol Overview
Six composable layers, each on a proven standard. DNS is the root; nothing below introduces a new cryptographic primitive.
| Layer | Standard | Function |
|---|---|---|
| P1 Anchor | W3C DID Core / did:aria | Every agent gets a DID. Resolution: DNS TXT pointer + HTTPS AID endpoint. |
| P2 Certify | W3C VC Data Model 2.0 | Signed, portable, independently verifiable credentials. Offline-capable. |
| P3 Present | ATP / OAuth 2.0 + DPoP | How credentials are presented and evaluated. ATP handshake + MCP + A2A compatible. |
| P4 Protect | FIPS 204 + RFC 8032 | ML-DSA-65 + Ed25519 composite (AND). Post-quantum native. Classical half sunsets 2029-12-31. |
| P5 Revoke | W3C Bitstring Status List v1.0 + Trust Ledger | Revocation in under 60 seconds. Append-only Trust Ledger. CAEP push notifications [PLANNED]. |
| P6 Govern | TrustLayer Foundation A.C. | Nonprofit stewardship. Apache 2.0 + CC-BY-4.0. Anti-capture. Community governed. |
Trust Levels
Four levels, two independent axes: the person who answers and the entity represented. The level is not declared; it is recalculated from the evidence. An AID never guarantees the present or future conduct of the agent or its holder; it states what was verified, how, against which source and when (DPV-02).
| Entity not verified | Entity confirmed | |
|---|---|---|
| Person not verified | L0 | not permitted |
| Person verified | L1 | L2 · L3 |
The normative basis is the Verification Requirements (Appendix E). Each card cites the IDs it rests on; the cards state what a level asserts, the Requirements state what it demands.
| Level | TLS analogy | Validity | Renewal |
|---|---|---|---|
| L0 | Self-signed | 366 days | E-mail re-verification. Fully automatic. |
| L1 | DV | 366 days | Domain and e-mail re-verification. The person is re-verified only on document expiry or Flag. |
| L2 | OV | 200 days | Status at source + sanctions + domain + link. |
| L3 | EV+ | 180 days | Semi-automatic: source + sanctions + instrument validity + confirmation by the named human. |
DID Method: did:aria
Canonical method: did:aria. Compatibility bridge: did:web. Self-generated. Zero cost. No permission required to create.
§3.1 — Method Syntax (ABNF). The did:aria method-specific identifier follows this grammar, using ABNF as defined in RFC 5234 with the ALPHA and DIGIT core rules.
did:aria — ABNF grammar (RFC 5234)show ▾
Four identifier shapes result from combining the two subject kinds (agent, principal) with the two anchoring modes (verified DNS domain, registry-namespaced fallback):
| Shape | Example | Used when |
|---|---|---|
| Agent · domain-form | did:aria:example.com:ordering-agent | Principal has verified control of the DNS domain (trust level L1+). |
| Agent · registry-form | did:aria:aria.bar:u-cmDoHhM3:ordering-agent | Agent lives under a registry namespace (L0, or L1+ before the principal's domain is verified). |
| Principal · domain-form | did:aria:example.com:org | Organizational identity for a principal that has verified its domain. |
| Principal · registry-form | did:aria:u-cmDoHhM3:org | Organizational identity for a principal without a verified domain — namespaced only by registry-account, no host prefix, stable across registry migrations. |
":org" is reserved: an agent-slug MUST NOT equal org, so that principal identifiers remain unambiguously distinguishable from agent identifiers by inspection. domain and registry-host labels are case-insensitive (per DNS); registry-account and agent-slug are case-sensitive.§3.2 — Resolution and the DID Document. The result of did:aria resolution is a DID Document in the sense of W3C DID Core 1.0 §5. It is not stored anywhere: a resolver derives it deterministically from the Agent Identity Document (AID) defined in §4 — a W3C Verifiable Credential secured by the composite mldsa65-ed25519-2026 proof — after obtaining the AID through the DNS TXT pointer (§3.4) and verifying its SHA-256 hash and composite signature. The AID is the signed source artifact; the DID Document is its projection, and the AID travels alongside it in the DID Document Metadata (§3.5.2). This is the same pattern as did:key (derived from the identifier) and did:webvh (derived from a log): derivation is resolution, the derived document is the result.
The derivation, applied to the currently-active AID:
DID Document — derived from the AID · JSON exampleshow ▾
Derivation rules — given an AID retrieved via §3.4 and the URL from which it was served:
§3.2 — Resolution and the DID Document · algorithm · 5 stepsshow ▾
id—credentialSubject.idfrom the AID.controller— computed fromid: for agent-domain-form, replace theagent-slugcomponent with the literalorg; for agent-registry-form, keep only theregistry-account:orgtail (drop theregistry-host), matching how the registry issues principal identifiers.verificationMethod— a single Multikey entry that translates the AID'scredentialSubject.holderKey:publicKeyMultibasecarries over unchanged (bothEd25519VerificationKey2020andMultikeyencode the same 32-byte Ed25519 public key with the samez6Mk…prefix);idandcontrollerare derived from the agent DID.authenticationandassertionMethod— both reference the single verification method: the agent authenticates as itself and asserts on its own behalf using the holder key.service— a singleAriaAgentIdentityDocumententry whoseserviceEndpointis the HTTPS URL from which the AID was retrieved (present in the DNS TXT pointer, §3.4).
verificationMethod publishes only the Ed25519 holder key because the operations that reference this material — holder proofs over ATP challenges, presentation binding — sign ephemeral payloads whose exposure window is measured in minutes, and because Ed25519 verification is universally deployed. The AID's issuer signature, where post-quantum protection matters (AIDs are long-lived and verifiable retroactively), uses the composite mldsa65-ed25519-2026 suite (§5) and is not re-stated in the DID Document. Any future PQ-native VerificationMethod type (e.g. Mldsa65VerificationKey2026) may be added to verificationMethod alongside the Multikey entry without any change to the resolution algorithm.§3.3 — Compatibility bridge: did:web. A did:web MAY act as a bridge for verifiers that already support did:web but not did:aria. The principal publishes the derived DID Document at https://<domain>/.well-known/did.json, which allows did:web:<domain> to resolve to the same document as did:aria:<domain>:org. The bridge is a compatibility measure; the canonical identifier remains did:aria.
§3.4 — DNS TXT pointer model. ML-DSA-65 public keys are 1,952 bytes raw (~2,603 bytes base64) — too large for a DNS TXT record (255 bytes per string). ARIA uses a two-component model: a TXT pointer at _aria.<domain> carrying the DID, a SHA-256 hash of the expected AID, and the HTTPS URL where the AID is served.
The hash pins the served AID to the TXT record — an adversary that substitutes the HTTPS response cannot match the hash the domain owner published, so tampering is detected before signature evaluation. TXT pointers for registry-form identifiers are published by the registry under its own zone (e.g. _aria.aria.bar); TXT pointers for domain-form identifiers are published by the principal under its verified zone. A name MAY hold several pointer records — one per agent anchored there (e.g. several agents under _aria.example.com, or every registry-form agent under _aria.aria.bar); a resolver selects the record whose did= equals the identifier being resolved and ignores the rest.
§3.5 — Method operations. did:aria defines the four DID Core operations. The registry holds the namespace and signs; the controller holds the keys. No operation requires the controller to reveal a private key to anyone.
§3.5.1 — Create.
§3.5.1 — Create · algorithm · 7 stepsshow ▾
- Key generation. The controller generates, on its own machine, an Ed25519 holder keypair (RFC 8032) for authentication and presentation binding. Private material never leaves the controller.
- Reservation. The controller (or its registry, on its behalf) asks the namespace to reserve the target identifier. The registry validates it against the ABNF of §3.1 — an identifier that does not parse MUST NOT occupy a slot — and checks uniqueness. Reservation is exclusive, held for 15 minutes, and returned as a single-use token. Two callers asking for the same identifier at the same instant receive exactly one success; the check and the claim are one atomic operation at the namespace, never a read followed by a write.
- Manifest. The controller builds an enrollment manifest — agent name, requested scopes, holder public key, principal DID — and signs it with the holder key over canonical JSON (§5.1). The registry MUST reject a manifest whose signature does not verify against the enclosed holder key.
- Verification. The registry performs the checks the requested level demands (§2) and records the Case File. This step is where L0 stays automatic and L1+ is not.
- Issuance. The registry redeems the reservation token and issues the AID: a W3C VC 2.0 credential whose
credentialSubject.idis the DID, carrying the holder key, principal reference, level and scopes, secured by the compositemldsa65-ed25519-2026proof (§5). The top-levelidis the credential-instance URL. A status list position is allocated and written intocredentialStatus. Issuance is terminal for the identifier: it never returns to the pool, even if the credential is later revoked. - Anchoring (L1+). The controller publishes the TXT pointer at
_aria.<domain>(§3.4): DID, SHA-256 of the served AID, HTTPS URL. For registry-form identifiers the registry publishes the pointer under its own zone. - Record. Reservation and issuance are written to the append-only, hash-chained issuance record (§7) in the same transaction as the state change. A registry MUST NOT hold a signature it has no record of making.
Errors. malformed (fails §3.1), alreadyIssued (terminal), heldByAnother (live reservation by a different caller), reservationExpired, manifestSignatureInvalid, levelNotPermitted (the registry is not accredited for the requested level).
§3.5.2 — Read (Resolve). Input: a did:aria string. Output: a DID Resolution result — the derived DID Document (§3.2) as didDocument, the verified AID and its provenance in didDocumentMetadata, and didResolutionMetadata. The DID Document is the result; the AID is metadata. A resolver that returns the AID without the DID Document has not resolved the DID. A conforming resolver MUST perform every step; skipping one is a resolution failure, not a degraded success.
§3.5.2 — Read (Resolve) · algorithm · 11 stepsshow ▾
- Parse. Validate against §3.1. Failure →
invalidDid. - Locate. Domain-form: query
_aria.<domain>TXT over DNS-over-HTTPS (RFC 8484); DNSSEC validation SHOULD be performed and its result reported. Registry-form: query_aria.<registry-host>, or GET the registry resolver directly. No TXT and no resolver →notFound. - Check the pointer. The TXT MUST carry
v=ARIA1, adid=equal to the input, ahash=and anaid=HTTPS URL. Mismatched DID →pointerMismatch. - Fetch. GET the AID over HTTPS. The response is treated as opaque bytes.
- Pin. SHA-256 of the fetched bytes MUST equal
hash=. Mismatch →hashMismatch; the document MUST NOT be evaluated further. - Bind.
credentialSubject.idMUST equal the input DID → elsesubjectMismatch. - Verify the proof. Canonicalize the credential minus
proof(§5.1); decodeproofValue(§5.1); verify the ML-DSA-65 half against the issuer's post-quantum key and the Ed25519 half against the classical key. Both MUST verify. A failure of either half →signatureInvalid, reported per half so tampering can be told from implementation disagreement. Verifying only the classical half is a failure, not a fallback (ATP-11). - Check validity.
validFrom ≤ now < validUntil, elseexpiredornotYetValid. - Check status. Fetch
credentialStatus.statusListCredential, verify its own proof, read the bit atstatusListIndex. Set →revoked. Status evidence older than the caller's freshness bound (ATPfresh, floor 60 s) →statusStale. - Check accreditation. The issuer MUST have been accredited to assert the credential's level at the time of issuance. Withdrawal of an accreditation is forward-only: it does not invalidate issuances made while the accreditation was valid, i.e. between the registry's
accredited_fromand itsdistrust_aftercut-off (§5.2, AUD-02). - Derive. Apply the §3.2 rules to the verified AID to produce the DID Document, and assemble the resolution result below. This step is mandatory.
Resolution metadata. A resolver returns, alongside the document: retrieved (timestamp), source (dns | registry), dnssec (secure | insecure | bogus | indeterminate), statusChecked (timestamp of the status evidence), credentialId and, when present, previousCredentialId. A historical instance is resolvable by its credential-instance URL (GET /v1/credentials/{id}) so a verifier can walk the issuance chain.
Resolution result. Every field of DID Core §7 is present. didDocument carries the derivation of §3.2. didDocumentMetadata carries the AID and what was checked: versionId is the credential id, created and updated are the validFrom of the first and of the current credential at this DID, deactivated reflects §3.5.4, and the aria map names the URL the AID was fetched from, its SHA-256, the derived level and the age of the status evidence used. A client whose important artifact is the AID dereferences didDocumentMetadata.aria.aid, or passes the resolution option aria-aid=embed to receive the full credential inside that map; in both cases didDocument is returned. didResolutionMetadata carries contentType, the DNSSEC outcome of step 2, and on failure exactly one error from the codes above.
/v1/aids/{did} and the MCP tool resolve_did returns the AID as well; neither returns a DID Resolution result yet. A conforming resolver endpoint is planned; until it ships, verifiers derive the DID Document client-side per §3.2.§3.5.3 — Update. The DID is stable; the credential is not. Every update is a re-issuance at the same DID: a new credential instance with a new top-level id, credentialSubject.previousCredentialId pointing to the superseded instance, and the superseded instance moved to superseded (§7). What MAY change: holder key (rotation), scopes, level (upward after verification, downward on Flag), principal metadata. What MUST NOT change: credentialSubject.id. For domain-form identifiers the controller MUST update hash= in the TXT pointer; a resolver that fetches the new document against the old hash fails at step 5, which is the intended behaviour until the pointer is updated. The registry records the re-issuance in the issuance record with both credential ids.
§3.5.4 — Deactivate. Two independent, non-exclusive signals; a verifier MUST honour either.
- Status list. The registry sets the credential's bit in the W3C Bitstring Status List v1.0 credential it publishes (§7). The new list is published within the COM-05 bound (§7). This is the authoritative signal: it works for every identifier form and survives the loss of the controller's DNS.
- Pointer removal. The controller of a domain-form identifier removes or empties
_aria.<domain>. Resolution fails at step 2. This signal is under the controller's sole authority and needs no registry.
Deactivation is terminal for the identifier: a deactivated DID is never re-issued to a different controller, so a new agent cannot inherit the history or the trust of a retired one. The registry records the event with the revoking authority and reason code. Cascade — deactivating everything one registry ever vouched for — is never automatic; it is a distinct, human-authorized decision reserved for a proven compromise of the registry's attestation key.
Security and privacy of the operations. Reservation tokens are single-use, expire, and are stored only as a digest. The namespace never learns who the customer is — only which registry asked. No operation transmits a private key. Hash pinning (step 5) defeats substitution of the served document; the composite proof (step 7) defeats forgery even by a party able to alter DNS; accreditation-at-issuance (step 10) bounds the damage of a misbehaving registry to the window in which it was trusted.
The AID Document
The Agent Identity Document (AID) is ARIA's core data structure — the passport. A W3C Verifiable Credential containing everything a counterparty needs to verify an agent's identity, authorization, and intent.
ARIA defines three identity roles — analogous to DNS registrant vs. admin contact:
| Role | Maps to | Description |
|---|---|---|
| Registrant | account_holder | Human who opens the account and accepts ToS. One registrant per account. |
| Principal | credentialSubject.principal | Legal entity or person in the AID. The authority behind the agent. |
| Account Admin | platform user | Manages AIDs day-to-day. May differ from registrant. Analogy: DNS registrant vs. admin contact. |
principal.legalName: self-declared (L0, L1 — registrant-asserted, no external check), registry-confirmed (L2 — confirmed against the Authoritative Source of the jurisdiction), or legal-verified (L3 — primary register plus a Binding Officer). Verifiers MUST consult this field before treating legalName as authoritative. legalName is an organization name — see §9.AID — complete example (preview-line credential, spec_version 1.2) · 60 linesshow ▾
Cryptography
Post-quantum from the first credential, not retrofitted: the Harvest-Now-Decrypt-Later threat makes retroactive protection the requirement.
| Algorithm | NIST Standard | Usage | Security Level |
|---|---|---|---|
| ML-DSA-65 | FIPS 204 | Primary signing for all AIDs | Level 3 (AES-192) |
| ML-KEM-768 | FIPS 203 | [PLANNED] Session key establishment | Level 3 |
| SLH-DSA | FIPS 205 | [PLANNED] Long-lived registry records | Conservative (hash-based) |
| Ed25519 | RFC 8032 | Composite classical (AND with ML-DSA) | Classical backward compat |
mldsa65-ed25519-2026: both signatures MUST verify. Live today: FIPS 204 + RFC 8032. The composite mode ends December 31, 2029; after that date ML-DSA-only credentials are required.§5.1 — Cryptosuite mldsa65-ed25519-2026. A W3C Data Integrity cryptosuite is defined by its transformation, hashing and proof-serialization algorithms. What follows is what the deployed issuer and the published verifier implement; credentials in the wild are signed this way and cannot be re-signed, so this text is descriptive of the wire format, not aspirational.
- Transformation. Take the credential as a JSON object, remove the
proofmember, and serialize it as canonical JSON: object members sorted by key (UTF-16 code-unit order, asArray.prototype.sortorders JavaScript strings, recursively at every depth), arrays in document order, no whitespace, strings escaped asJSON.stringifydoes (the two mandatory characters, the five short escapes, and remaining control characters below U+0020 as\u00xx; all other characters, including non-ASCII, emitted literally), numbers asJSON.stringifyrenders them. Encode as UTF-8. This form is intentionally narrower than RFC 8785 (JCS): for every credential ARIA issues the two coincide, but conformance is defined against the golden vectors inaria-protocol/conformance/, not against RFC 8785. - Hashing. None. Both algorithms sign the transformed bytes directly. ML-DSA-65 is used in pure mode with an empty context string; Ed25519 is pure Ed25519 (RFC 8032 §5.1, SHA-512 internal) with no pre-hash and no context. There is no additional domain-separation tag.
- Proof serialization.
proofValueis the unpadded base64url (RFC 4648 §5) encoding ofu32be(pq_len) ‖ pq_signature ‖ ed_signature: a four-byte big-endian length of the ML-DSA-65 signature (3,309 bytes for FIPS 204 ML-DSA-65), the ML-DSA-65 signature, then the 64-byte Ed25519 signature. Suite1.0emits it multibase-encoded: the prefixu(base64url, no padding) per the multibase registry, because the VC v2 context typesproofValueassec:multibaseand a bare base64 string declaring that datatype is not one. Credentials issued before the 1.0 cutover carry the same bytes with no prefix; a verifier MUST accept both. The two are decidable without guessing: the length header of this suite is always0x00000CED, so a bareproofValuealways beginsAAAMand neveru. A verifier MUST validate the header against the byte count that follows it rather than trusting the first character. Theproofobject carriestype: DataIntegrityProof,cryptosuite: mldsa65-ed25519-2026,created,verificationMethodandproofPurpose: assertionMethod. - Verification. Decode
proofValue; a value that is not base64url, shorter than four bytes, or whose declared length exceeds the remainder isMALFORMED. Recompute the transformation. Verify the ML-DSA-65 half against the issuer's ML-DSA-65 public key (1,952 bytes) and the Ed25519 half against the issuer's Ed25519 public key (32 bytes). Both MUST verify. A verifier MUST report which half failed, so tampering can be distinguished from implementation disagreement, and MUST NOT accept a credential on one half alone (ATP-11). - Determinism. FIPS 204 permits deterministic and hedged signing; the two produce different bytes for the same input. Byte-identical signatures across implementations are therefore not required and MUST NOT be asserted as a conformance property; what is required is that a signature produced by either variant verifies under the other's verifier.
mldsa65-ed25519-2026 without breaking issued credentials (invariant #2).§5.2 — Trust bootstrap: issuer keys and accreditation. Verification in §3.5.2 needs two inputs that are not in the credential: the issuer's public keys (step 7) and evidence that the issuer was accredited for the level at issuance time (step 10). This is ARIA's equivalent of a root store.
- Today. The issuer's ML-DSA-65 and Ed25519 public keys for
did:aria:registry.aria.barare pinned in the published verifier SDK (@aria-registry/verify) and overridable at runtime for other registries. The credential'sverificationMethod(did:aria:registry.aria.bar#key-1) names the key but there is no live endpoint that serves it;api.aria.bar/.well-known/ariaadvertises the issuer DID, suite and status list URL but not the key material. No signed accreditation list is published: a verifier today trusts the pinned issuer for every level, which is acceptable only while a single registry issues and only L0 is issued. - Consequence (invariant #4). Because the keys are compiled into every published SDK version, the issuer key cannot rotate for as long as any of those versions is in use. Key discovery must ship before rotation is even possible.
- [PLANNED] Key discovery. A signed key document resolvable from the issuer DID (the
#key-1fragment), served at a well-known location and mirrored in the SDK as a fallback, with explicit validity windows so rotation becomes a first-class operation. - [PLANNED] Accreditation list. A TLF-signed list of accredited registries carrying, per registry, its attestation public key, ceiling level,
accredited_fromand anydistrust_aftercut-off — the data step 10 evaluates. Verifiers fetch it like a status list: cacheable, with a freshness bound. - [PLANNED] TLF root distribution. The TLF root key that signs the accreditation list, distributed out of band (pinned in SDK releases, published fingerprint, offline ceremony record) so the chain closes at a key nobody obtains from the network it is meant to protect.
Scopes & Delegation
Scopes. Format namespace:resource:action: three colon-separated segments, wildcard only in the last. Eight immutable actions combine with admin-defined namespaces and resources. Every reference pins a version (commerce:purchase_order:read@v0.2); versions are immutable once published, with a 24-month minimum deprecation window.
| Action | Meaning |
|---|---|
| read | Query or retrieve data |
| write | Create or update data |
| delete | Remove data permanently |
| execute | Run a process or workflow |
| approve | Authorize a pending action |
| export | Extract data outside the system |
| subscribe | Register for ongoing notifications |
| delegate | Grant a subset of permissions to another agent |
Namespace taxonomy · 10 namespacesshow ▾
Delegation. Authority flows from a human. An agent MAY delegate to a sub-agent; when it does, every hop MUST be signed, scope can only narrow, and the original principal stays traceable. Maximum depth: 4. credentialSubject.delegationDepth is signed by the issuer and is what ATP’s depth= compares against.
delegationDepth: 0. The rule above is the contract such issuance will meet.Human approval has three tiers declared in the delegation chain and enforced at resolution time: pre-authorized (routine), categorical (approve once per category), explicit (a human approves this specific action).
Lifecycle, Revocation & Trust Ledger
A person authorizes an agent on Tuesday and resigns on Wednesday; on Thursday the agent must not be acting with nobody behind it. On principal change the credential is suspended pending re-authorization. A designated successor principal is [PLANNED]: schema 1.0 has no field for it yet.
Every credential is in exactly one of six states:
| State | Meaning | Transitions | Reversible? |
|---|---|---|---|
| active | Credential valid. Agent operating normally. | Can become: suspended, revoked, expired | Starting state |
| suspended | Temporarily paused. Principal change, investigation, or policy violation. | Can become: active (reinstated) or revoked | Yes |
| revoked | Permanently invalidated. Compromise, termination, or breach. | Terminal state | No. Ever. |
| expired | Credential TTL exceeded. Must renew to resume. | Can become: active (after renewal) | Yes (renewal) |
| tombstoned | Organization dissolved or acquired. Permanent archive. | Terminal state | No |
| superseded | Replaced by a new credential. Old DID permanently points to new one (301 redirect pattern). | Terminal state. Pointer to successor. | No |
suspended with reason: broken-link, and the entity has 30 calendar days to accredit a new responsible person. If the window lapses, the credential is revoked.Validity and renewal per level: §2.
Revocation. The registry sets the credential’s bit in the W3C Bitstring Status List v1.0 credential it publishes; the new list is available to verifiers in under 60 seconds from the event, and conforming verifiers do not accept status evidence older than 60 seconds unless the receiver’s policy is stricter (COM-05). The list credential is signed by the registry with the same composite suite as an AID, carries the id that issued credentials name in credentialStatus.statusListCredential, and is re-signed on every change; its validFrom is the moment that version was signed, which is the age a verifier measures against the freshness bound. A verifier MUST check the list credential’s proof before reading a bit from it: an unsigned list is a revocation claim over transport security, not evidence. Revocation is terminal for the credential; the identifier never returns to the pool (§3.5.1) and may be re-issued only to the same controller (§3.5.4).
Trust Ledger. The permanent, append-only, SHA-256 hash-chained record of every credential lifecycle event — issuance, renewal, suspension, revocation, expiry, tombstone — modeled on Certificate Transparency (RFC 9162). One event, one Trust Record; every record carries the delegation-chain snapshot at the time of the action. It records the registry that asked and the identifier concerned, never who the customer is (§9).
Trust Ledger events and retention · issuance, renewal, suspension, revocation, expiry, tombstone · show tableshow ▾
| Event | What is logged | Retention |
|---|---|---|
| Issuance | DID, trust level, issuing authority, delegation chain, timestamp | 7 years |
| Revocation | Revoking authority, reason code, cascade scope | 7 years |
| State change | Previous state, new state, triggering event, authority | 7 years |
| Delegation | Delegating DID, receiving DID, scope granted, depth, approval config | 7 years |
Agent Trust Protocol
ATP defines what happens when an agent presents its credential to a receiving system: a three-phase handshake — Declare (the agent presents its AID and a signed Intent Declaration), Evaluate (the receiver checks both against its configured admission policy, the same one it publishes as a DNS TXT record), Admit (a result code, with a literal reason). The published record informs agents in advance and MUST match the configured policy. The explanatory guide, with deployment patterns and the DMARC parallel, is at /protocol; this section is the normative reference.
_aria.<domain> is published by the agent’s holder and answers “does this domain back this agent?” (§3.4, L1+). _aria-policy.<host> is published by the receiver — looked up host first, then apex — and answers “whom does this service admit?”. The policy record never demands anything of the agent: an L0 agent has no domain and is admissible by any policy with min=L0.Intent Declaration. An Intent Declaration MUST be present in the Declare phase (ATP/1 §6.1) and is signed by the holder key. The three MUST fields below are the protocol minimum for it to be valid at all; a receiver’s intent= parameter adds required fields on top of that minimum, never below it.
| Field | Required | Description |
|---|---|---|
| purpose | MUST | Human-readable statement of operational purpose |
| action_requested | MUST | ARIA scope, three segments (e.g. commerce:order:read) |
| principal_ref | MUST | DID of the principal (did:aria:…:org). MUST NOT be a name (ATP-13, COM-09). |
| target_resource | SHOULD | Specific resource or endpoint the agent intends to access |
| dataUsage | SHOULD | W3C DPV purpose categories (dpv:TransactionManagement, etc.) |
| retention | SHOULD | Maximum data retention duration (ISO 8601, e.g. P90D) |
| constraints | MAY | Self-declared operational constraints |
| session_id | MAY | Unique session ID for correlating multiple interactions |
Agent Trust Policy — the DNS record. ATP/1 grammar (RFC 5234): v=ATP1 first; enforce= mandatory in a published record; an unknown parameter is ignored unless written !name= (critical), in which case a processor that does not understand it MUST treat the policy as unsatisfiable. A record that fails to parse, or is absent, means “no usable published policy”.
Agent Trust Policy parameters · normative, informative and reserved · defaults · show tableshow ▾
| Parameter | Class | Default | Semantics |
|---|---|---|---|
| v | normative | — | Version. Mandatory, first. Always ATP1. |
| min | normative | L0 | Minimum level, derived from the evidence, never read from a label. L0 < L1 < L2 < L3. |
| req | normative | empty | Required scopes, AND semantics. Three segments, colon-separated; wildcard only in the last (commerce:order:*). |
| fresh | normative | 3600s | Maximum age of the AID status evidence at decision time and during the session. Floor 60s (COM-05); lower values are a configuration error. |
| enforce | normative | strict | monitor (evaluate, log, admit all) · warn (admit, add warning) · strict (deny). Mandatory in a published record; absent in configuration = strict. |
| deny | normative | empty | Prohibited scopes. Any intersection with the agent effective set denies. |
| intent | normative | empty | Fields the signed Intent Declaration must carry. principal_ref is a DID, never a name. |
| depth | normative | unlimited | Maximum delegation depth: credentialSubject.delegationDepth ≤ depth. |
| rua | informative | — | URI for aggregate evaluation reports (DMARC rua= pattern). Does not affect admission. |
| rate | informative | — | Declared call limit. Not evaluated: rate enforcement is receiver infrastructure, outside admission. |
| qualify | reserved | — | Depends on Trust Seals (Appendix C, not implemented). Never evaluated in ATP/1. |
Freshness. All checks are local after the first hash-pinned fetch. Status evidence MUST be no older than fresh (default 3600 s, floor 60 s): the receiver-side consumer of the COM-05 bound (§7).
Deployment layers. A conforming receiver runs three layers that add up; they are not alternatives to choose between. Every admission runs on the first; the second is reached only when the status evidence has aged past fresh; the third never participates in an admission at all.
| Layer | When | Cost | Source |
|---|---|---|---|
| Local SDK | Every call | No network | Credential and scopes cached by hash; both signature halves verified in-process |
| Freshness | When the status evidence is older than fresh= | One cacheable request | The issuing registry’s Status List (COM-05, refreshed within 60 s) |
| Reaffirmation | Cold start, dispute, audit, a receiver’s own spot-check | One request, outside the admission path | A TrustLayer Foundation API returning signed, dated answers |
Presented material. The evaluator receives an authenticated presentation: the agent’s DID, the audience it is presenting to, a fresh proof of possession, and the signed Intent Declaration, alongside the AID and the status evidence (ATP/1 §6.1). Steps 2 and 3 of the algorithm check the proof and the audience before the credential is looked at, which is what makes a copied AID useless to a third party.
Evaluation algorithm. Eleven checks in fixed order, cheapest and most local first, state-dependent last. Every check MUST be performed; the first failure ends the evaluation and its code is the result. The order is not a preference: a receiver that checked scopes before the signature would be reasoning about a document it has not authenticated.
| # | Check | What it establishes | Code on failure |
|---|---|---|---|
| 1 | Configuration | The configured policy parses, implements every parameter it carries and every critical one it was sent. | configuration error, not a per-call code |
| 2 | Presentation | The presentation is authenticated and fresh: the caller proves possession of the holder key now. | ATP-401 / SIG |
| 3 | Audience | The presentation names this receiver. One built for someone else cannot be replayed here. | ATP-421 |
| 4 | AID integrity | Both halves of the composite countersignature verify and the schema conforms. | ATP-401 / SIG · MALFORMED |
| 5 | Validity | Now falls between validFrom and validUntil. | ATP-401 / EXPIRED |
| 6 | Status · network | The status evidence is no older than fresh=. Older and not renewable is a refusal, never a pass: stale evidence does not admit. | ATP-412 · ATP-410 / REVOKED · SUSPENDED |
| 7 | Level | The level derived from the evidence meets min=. A level label inconsistent with its own facts is malformed, not insufficient. | ATP-403 |
| 8 | Scopes | The effective scope set covers every req= and intersects no deny=. | ATP-406 |
| 9 | Delegation | The signed delegationDepth is within depth=. | ATP-462 |
| 10 | Intent | The signed Intent Declaration carries every field intent= requires, and principal_ref is a DID. | ATP-451 |
| 11 | Admit | Bound to this audience and this DID, opening a session. | ATP-200 |
strict a failure denies. In warn the agent is admitted with ATP-200 and reason=ADMIT-FLAGGED(<code that would have denied>), plus a notice in the response. In monitor the same, without the notice. No mode admits a failure of integrity, presentation or audience.Result codes. Every denial carries exactly one code — the first failing step — and a literal reason; both are part of the conformance contract.
Result codes · 2xx admit, 4xx refuse · one code per denial, first failing step · show tableshow ▾
| Code | Name | Meaning | reason |
|---|---|---|---|
| ATP-200 | Admitted | All policy checks passed | ADMIT · in monitor/warn: ADMIT-FLAGGED(<code that would have denied>) |
| ATP-401 | Credential invalid | Signature fails, malformed, or expired | SIG · MALFORMED · EXPIRED |
| ATP-410 | Credential revoked or suspended | Status evidence shows the credential is not active | REVOKED · SUSPENDED(<reason>) |
| ATP-412 | Status evidence stale | Status evidence older than fresh and not renewable | STALE |
| ATP-421 | Audience mismatch | Presentation not bound to this receiver | AUDIENCE |
| ATP-403 | Trust insufficient | Evidence-derived level below policy minimum | LEVEL |
| ATP-406 | Scope mismatch | Missing a required scope or carries a denied one | SCOPE-MISSING · SCOPE-DENIED |
| ATP-451 | Intent incomplete | Intent Declaration missing or malformed | INTENT-MISSING(<field>) · INTENT-MALFORMED |
| ATP-462 | Delegation too deep | delegationDepth exceeds policy depth | DEPTH |
| ATP-429 | Rate limited | Emitted by receiver infrastructure, outside the algorithm (rate is informative) | — |
| ATP-460 | Qualifier missing | Reserved: qualify= is not part of ATP/1 | — |
Enforcement modes — graduated adoption, the pattern DMARC established:
| Mode | Behavior | Use |
|---|---|---|
| monitor | Log everything. Admit all agents. Non-compliant agents flagged but not blocked. | First deployment. Turn on the lights. |
| warn | Admit all agents. Non-compliant agents receive warning header + logged. | Transition phase. Training wheels. |
| strict | Reject non-compliant agents. ATP error response. No access. | Full enforcement. Default when enforce= is absent in configuration. |
Privacy & Data Governance
Agent identity metadata is organizational, not personal. Agent DIDs identify software entities. The principal identity is held by the registry operator that performed the verification, under data controller obligations; TrustLayer Foundation stewards the standard and does not hold it. The authority’s own records name the registry that asked and the identifier issued, never the customer.
legalName is an organization name. Natural-person principals at any level MUST NOT populate legalName; the public AID never carries a natural person’s name (COM-09, L0-03). Field under revision for schema 1.0 stable.GDPR tension: the right to erasure (Article 17) conflicts with the Trust Ledger’s append-only immutability. Resolution: Trust Ledger entries can be redacted — the event record remains, personally identifiable fields are replaced with a redaction marker. Because the ledger never holds personal data in the first place (§7), redaction is a safeguard, not the design.
Security Considerations
Spoofing. Cryptographic identity replaces self-reported user-agent strings; a DID resolves identically across clouds, so the identity fabric does not depend on any provider’s trust domain.
Accountability, as a design statement. ARIA is designed so that when a regulator, a court or a board asks “who authorized this agent to do this?” there is a signed, timestamped answer whose provenance can be checked. It is a property of the records, not a legal guarantee.
Prompt injection. ARIA’s contribution is not prevention (a model-layer problem) but damage containment through identity infrastructure:
| Defense layer | Mechanism |
|---|---|
| Scope containment | Agent cannot exceed declared scopes even if prompt-injected |
| Delegation ceiling | Compromised agent cannot escalate beyond delegated authority |
| Rapid revocation | Compromised agent credentials revoked within the status-list bound of §7 |
| Intent mismatch | Declared intent vs. actual actions enables anomaly detection |
| Audit trail | Complete cryptographic record for incident response |
| Trust policy | Receiving systems enforce minimum trust + scope via ATP |
Versioning & Governance
Semantic versioning (major.minor). Minor changes (1.x) are backward-compatible; major changes (vN.0) may break. TLF supports all credentials under supported major versions for a minimum of 36 months. Preview-line credentials (labeled 1.0–1.2, April–August 2026) are outside this commitment and are sunset at the issuance cutover. API: v1 endpoints stable for a minimum of 5 years.
TrustLayer Foundation A.C. is the independent nonprofit that stewards the protocol, issues credentials from the issuance cutover (today the operating registry issues), maintains the Trust Ledger and governs the open standard under Apache 2.0 (code) and CC-BY-4.0 (documentation). Composition of the Technical Steering Committee, decision process and anti-capture provisions: /governance.
Integration Map
18 integration surfaces · MCP, enterprise IAM, commerce, A2Ashow ▾
ARIA is the identity layer the protocols below reference but do not define: MCP handles connectivity, ATP handles admission, ARIA handles identity. ARIA is to A2A what a passport is to an airline.
| Layer | Protocol | ARIA’s role |
|---|---|---|
| Commerce Checkout | Visa TAP / Mastercard Agent Pay | Verified agent identity BEFORE issuing payment credentials |
| Agent Communication | Google A2A | Verified identity embedded in Agent Cards |
| Commerce Protocol | Stripe ACP / SPTs | Legal entity verification for B2B + regulated commerce |
| Micropayments | x402 (USDC/Coinbase) | Agent identity for autonomous spend authorization |
| Tool Connection | Anthropic MCP | Cross-org identity layer MCP doesn't supply |
| Agent Discovery | Shopify UCP | Trust signal for agent ranking. UCP Level 3 = ARIA L2+ |
| Internal Workload | SPIFFE/SPIRE | External-facing bridge when agents cross org boundaries |
| Bot Authentication | Cloudflare Web Bot Auth | Identity content that HTTP signatures transport |
| Auth Framework | IETF AIMS (WIMSE+OAuth) | Cross-org identity + authorization |
| Identity Standards | OIDF AIIM CG | Participation in the community group; no recommendation process is implied |
| Enterprise IAM | SCIM / IPSIE / AuthZEN | Lifecycle bridge for agent provisioning/deprovisioning |
| Cloud Identity | Microsoft Entra Agent ID | Cross-org portable identity outside Azure trust domain |
| Cloud Identity | AWS Bedrock AgentCore | Cross-org portable identity outside AWS trust domain |
| Access Control | NGAC / GNAP (RFC 9635) | Delegation chain maps to GNAP multi-party model |
| Token Security | NISTIR 8587 | DPoP binding prevents token theft/replay |
| Credential Issuance | OpenID4VCI / OpenID4VP | VC issuance and presentation compatible with OIDF specs |
| Agent Interop | FIPA ACL | ARIA credential headers embeddable in FIPA messages |
| Governance Framework | ToIP Metamodel | TLF governance maps to ToIP four-layer trust stack |
MCP surfaces.
| # | Surface | How it works |
|---|---|---|
| 1 | ATP transport binding | [PLANNED — D7] How a presentation travels over MCP is undecided. A bare AID in tool-call metadata is not an authenticated presentation (§8). |
| 2 | Trust level discovery | MCP servers declare minimum trust level per tool |
| 3 | ARIA as MCP tool | verify_aid: native identity check callable from any MCP client |
| 4 | Cross-org calls | Identity layer MCP assumes but does not supply |
| 5 | Scope alignment | 8 standardized actions mirror MCP tool patterns |
| 6 | Delegation chains | End-to-end accountability in multi-tool flows |
| 7 | DPoP (RFC 9449) | Token bound to specific agent, prevents theft/replay |
Enterprise. SCIM lifecycle bridge for agent provisioning, OIDC bridge for existing IAM, AuthZEN PEP/PDP and GNAP (RFC 9635) delegation compatibility, SP 800-207 zero-trust alignment. SDK: TypeScript live; Python and Rust [PLANNED], verification-only.
Regulatory Mapping
Selected frameworks: NIST SP 800-63A-4, EU AI Act, Colorado SB 26-189, TLS analogiesshow ▾
How ARIA relates to selected frameworks. Aligned to NIST SP 800-63A-4; no conformance assessment is claimed. No legal conclusion is claimed anywhere in this appendix.
| ARIA level | Verification | TLS analogy | EU AI Act | Colorado SB 26-189 |
|---|---|---|---|---|
| L0 Anchored | E-mail challenge + key possession | Self-signed | Risk mapping | N/A |
| L1 Identified | Verified person (ICAO 9303 · ISO/IEC 30107-3 · biometric match · human review) + domain via DoH + RDAP | DV | Risk mapping | Designed to support |
| L2 Certified | Authoritative Source (Route A / Route B ≥20 % spot-check) + person–entity link + sanctions ≤7 d | OV | Risk mapping | Designed to support |
| L3 Sovereign | Primary register + Binding Officer + FIPS 140-3 L2+ / CC EAL4+ keys + signed accountability | EV+ | Risk mapping | Designed to support |
EU AI Act — Regulation (EU) 2024/1689, final numbering; general application began August 2, 2026. ARIA’s HITL tiers (§6) are designed to support human oversight (Art. 14); the AID’s declared principal, scopes and signed intent support transparency (Art. 50).
| Article | ARIA mapping |
|---|---|
| Article 9 (Risk management) | Trust levels provide risk-proportional identity |
| Article 14 (Human oversight) | HITL tiers are designed to support oversight (see §6) |
| Article 50 (Transparency obligations) | AID declares principal, scopes and signed intent |
| Article 72 (Post-market monitoring) | Trust Ledger provides the audit trail |
| Article 99 (Penalties) | L2/L3 verification documents the compliance effort |
Trust Seals
Optional sector, compliance and capability attestations · qualify= reservedshow ▾
Trust Seals are optional attestations embedded in the AID’s attestations field, referenced by ATP qualify= rules. L2+ required (Education: L1+). They are not trust levels; they enable sector-specific policy. [PLANNED] — qualify= is reserved in ATP/1 and never evaluated until seals exist.
| Category | Seals | Minimum level |
|---|---|---|
| Sector | Healthcare, Finance, Government, Legal, Education | L2 (Education: L1+) |
| Compliance | SOC2, ISO 27001, ISO 42001, PCI-DSS, EU AI Act, HIPAA | L2+ |
| Capability | HSM-bound keys, Offline-capable, Multi-agent orchestrator | L2+ |
An Insured seal (proof of E&O or professional liability insurance covering AI operations) is one candidate qualification for L2+ agents; the Trust Ledger’s lifecycle records are the underwriting data layer such insurers currently lack.
Deployment Patterns
Offline and QR verification · optional blockchain anchor · multi-principal, robotic and SPIFFE patternsshow ▾
Offline. Credentials are self-contained: a verifier with a cached issuer key and status list validates any AID without network access (subject to the freshness bound of §8). QR presentation enables physical-world verification.
Blockchain (optional). DNS remains the primary trust anchor; did:ethr, did:ion or did:sol may serve as secondary anchors.
Patterns. Multi-principal agents: separate AIDs per principal context. Model provenance: a modelAttestation field for AI Act transparency. Robotic identity: the same framework, with L3 hardware keys bound to a specific device. SPIFFE bridge: ARIA L2+ wraps a SPIFFE SVID with cross-organization verification.
Verification Requirements
The 80 citable requirements that §2 rests on are published at aria.bar/requirements: version 1.3-draft, 10 requirements changed from v1.2, each marked with its reason; adoption by TLF [PLANNED]. The canonical text is Spanish; an English translation is [PLANNED], and until it is published the Spanish text governs. Every ID cited in this specification resolves there.
Apache 2.0 (code) + CC-BY-4.0 (documentation) · Copyright 2026 TrustLayer Foundation A.C.