Whitepaper

Version 0.2September 2026

AEOS: Agent Economic Operating System

The record of an agent: identity, admission, conduct, contracts, payments, recognition, oversight and publication, each signed by the party that made it and verifiable by anyone.

The same content as the PDF. The figures are drawn from the protocol; every number is read from the recorded evidence run and from the implementation at build time.

Abstract

In 2026 Stripe, Visa, Mastercard, Google and Coinbase each published a way for a software agent to pay. Read together, their designs agree on a shape: an asymmetric key for the agent, a directory to resolve it, a scoped credential for the payment, a per-transaction proof with a short window and a nonce, and a receipt. Each of them assumes the agent already has an identity, a principal, limits and a merchant that can recognise it. None of them keeps the record that shows an agent acted within them, and none gives a third party a way to check that record independently of the party who kept it.

AEOS is that record. A Phanes ID binds an agent, its controller, its jurisdiction, its model, its capabilities and integer authority bounds to a key the agent alone holds, sealed by a registry with Ed25519 and ML-DSA-87. Around the ID: an admission policy that decides what an application gets; an append-only activity record with RFC 6962 proofs; contracts with escrow behind a risk gate and PBFT anchors; disputes with signed evidence; payments through the mandate chain the networks converged on, checked against the ID's standing and sealed bounds; recognition by merchants with RFC 9421 signatures resolved through the registry; authorised oversight for the authorities accountable for the agents; witnesses that cosign the registry's tree heads; and a signed static publication that lets phanes.app verify every document in the visitor's browser with no server behind it.

This version describes what is implemented and tested at the time of writing: the registry and its verification core, a TypeScript SDK, 100 routes under /v1, 45 MCP tools, 64 command-line commands, and a recorded evidence run (20260915T060329Z-evidence) of 80 terminal sessions, a 112-agent campaign and an adversary. It states plainly what the protocol does not do.

1

What an economic actor needs

A person who starts a business is surrounded by infrastructure that predates them: a register that says the company exists, an account that says who may spend from it, contracts a court will enforce, insurance, an audit trail, regulators who can ask for the books. An agent that starts transacting has a key and, since 2026, a way to pay. Everything else is assumed.

The table names ten things the record of an economic actor has to answer for, what the published agent-payment schemes provide for each, and what AEOS keeps. The middle column is drawn only from the schemes' own published material, summarised in the research memo published with the documentation.

CapabilityIn the 2026 agent-payment schemesIn AEOS
Identityan asymmetric key registered with each scheme's directory (Visa, Mastercard, Cloudflare, Stripe profiles); the same agent registers with eachone Phanes ID: a sealed document bound to the holder key, a binary Mark any device recognises, a DID document; one key directory for every merchant
Admissionregistration and agreements per scheme; the criteria are the scheme'sa recorded policy: open, attested or review; deny and allow lists, quotas, provisional IDs with sealed zero bounds; every decision on the record
Standingtoken deactivation and directory removal within each schemesigned revocation and suspension lists every verifier checks; a revoked ID's key leaves the directory; the guard stops the agent itself
Record of conductnot part of the published protocolsan append-only log of who, what, when, where, how and why, countersigned by venues, with inclusion and consistency proofs and witnesses
Contracts and escrownot part of the published protocolsterms signed by both holder keys, escrow behind a risk gate, PBFT anchors, fulfilment proofs
Disputesoutside the agent protocolssigned two-phase evidence, automatic resolution on clear breaches, VRF-selected arbitrators voting with their own keys, refunds from escrow
Risk and insurancenot part of the published protocolsa risk engine at proposal, activation and release; circuit breakers; actuarial insurance with evidence-backed claims; certification tiers
Paymentsscoped credentials, per-transaction proofs, receipts (Stripe SPT and ACP, Visa VIC and TAP, Mastercard Agent Pay, Google AP2, Coinbase x402)the same chain, each link checked against the ID's standing, sealed bounds, daily volume, breaker and risk engine; sealed receipts verified offline
RecognitionRFC 9421 signatures with a tag, resolved against a directory (Web Bot Auth, Visa TAP, Mastercard)the same signatures with the holder key; the registry is the directory and knows the ID's standing
Oversight and publicationcentrally operated directories; no independent evidence of what a directory showedsigned dossiers for registered authorities with every access recorded; witnesses; a signed publication anyone can verify

Payments are one row. The other nine are what makes a payment safe to accept from something that is not a person.

2

Parties and trust

Every object in the protocol is signed by the party that made it, and every party holds only its own key. The registry seals what it issues and keeps the record; it never holds a holder key. Attesters vouch for a key's controller, model or hardware. Venues and merchants sign what they offer and verify what they receive. Witnesses and overseers watch the registry from outside it. Verifiers need the published anchors and nothing else.

The parties of the protocol, what each holds and signs, and what passes between them The registry the operator's own machine, or behind an air gap authority keys: Ed25519 + ML-DSA-87 (never the holders') the record: IDs, status lists, logs, ledger, anchors, admissions, payments, audit trail authority key · seals every document it issues Agent or robot (the holder) its own Ed25519 + X25519 keys: a file, a vault, an HSM signs the application, every event, every request, every presentation, every mandate holder key · never leaves the agent Attesters model provider · KYB provider · hardware manufacturer sign attestations over the holder key fingerprint; the registry trusts the keys its operator registered Venues and merchants their own keys: visas, carts, refunds verify RFC 9421 requests through the directory, verify receipts offline under the anchors venue key · registered by the operator Verifiers (anyone) Marks through phanes-core in microseconds reports, IDs and anchors in the browser status lists cached; fail closed without them phanes.app a static site: the signed publication, no server, no key verifies every document in the visitor's browser Witnesses independent keys cosign tree heads and manifests after refusing rollbacks and forks Overseers registered authority keys read the unredacted record; every access recorded with its purpose ↓ signed application, events, mandates ↑ sealed document, Mark, tokens, receipts attestations RFC 9421 requests · presentations · payment mandates ↓ key lookups, carts, refunds ↑ key records, tokens, receipts anchors · status lists · signed reports phanes publish files + signed manifest tree heads, consistency proofs ↓ cosignatures ↑ signed requests ↑ signed, addressed dossiers ↓
Figure 1. The parties, what each holds and signs, and what passes between them. Gold marks the objects the registry seals; the holder key never leaves the agent.
PartyHoldsSignsNever sees
Agent or robot (the holder)its own Ed25519 and X25519 keys: a file, an encrypted vault or an HSMthe application, every event, every request, every presentation, every mandate, self-revocation—
The registry (the operator)authority keys: Ed25519 and ML-DSA-87; the certifier's and underwriter's keysthe document, status lists, Marks, tokens, receipts, tree heads, publications, oversight responsesholder private keys
Attesterstheir own keys, registered by the operatorattestations over the holder key fingerprint: model provider, KYB provider, hardware manufacturer—
Venues and merchantstheir own keys, registered by the operator, or a Phanes ID of their ownvisas, witness signatures on events, carts, refundsanything the holder does not disclose
Witnessestheir own keys, registered by the operatorcosignatures of tree heads and publication manifeststhe registry's private record
Overseerskeys of the authorities accountable for the agents, registered with a scoperequests for the unredacted record, each with a purposeholder private keys
Verifiers (anyone)the published anchors and cached status listschallenge noncesanything not disclosed or published
3

The Phanes ID

A Phanes ID is the identity document of a software agent (document type IA) or a physical robot (IR). It has four parts, all bound to one holder key: the document, the Mark, the activity record and standing.

The four parts of a Phanes ID: the document, the Mark, the activity record and standing, all bound to one holder key The document: an SD-JWT sealed by the registry Sealed claims number · type IA/IR · agent · controller · jurisdiction · model · capabilities · authority bounds · admission Disclosable claims salted digests with decoys; the holder discloses what a venue needs, nothing more cnf the holder's own Ed25519 key: every presentation is signed fresh with it (RFC 7800) Status the ID's index in the signed revocation and suspension lists (W3C Bitstring Status List) Seals Ed25519 JWS (RFC 7515 / 8037) and a detached FIPS 204 ML-DSA-87 signature over the same bytes The Mark: 160 bytes, or 4 787 with the ML-DSA-87 signature the 96-byte body, signed under the frame PHANES/v1/mark 0 4 8 17 20 28 36 holder public key 44 76 80 84 96 0 PHNS (4) · 4 version (1) · 5 kind (1) · 6 flags: hardware-bound, insured, certified (2) · 8 ID number (9) 17 level (1) · 20 issued (8) · 28 expires (8) · 36 issuer key id (8) · 44 holder public key (32) 76 revocation index (4) · 80 suspension index (4) · 84 status list id (12) Ed25519 signature · 64 bytes v2: + ML-DSA-87 signature, 4 627 bytes recognised structurally in nanoseconds: magic, version, kind, lengths; verified in microseconds: issuer key id, signature, validity window, then the revocation and suspension bits of cached status lists. Without a status list the verdict is never ok: verification fails closed. The activity record: an RFC 6962 log of what the agent did event 1 signed by the holder event 2 signed by the holder event 3 signed by the holder event 4 signed by the holder hash hash tree head signed (phanes-sth+jwt) cosigned by witnesses each event carries who, what, when, where, how and why; the holder signs it and the venue countersigns inside a visa's scope; inclusion and consistency proofs are open to anyone; the public report carries digests only; the operator's audit trail is a second tree over every request. Standing: what a verifier checks before trusting the document revocation list suspension list signed bitstrings (phanes-status-list+jwt), gzip + base64url, cached by verifiers one bit per ID; a set bit refuses the ID everywhere; the directory drops its key Certification a 90-day credential whose tier is computed by published rules; every check echoed Insurance policy in force, certificate of insurance, claims with inclusion proofs Admission how the ID was admitted (open, attested, review, provisional), sealed in the document
Figure 2. The four parts of a Phanes ID. The document is an SD-JWT sealed twice; the Mark is a fixed binary token; the activity record is an RFC 6962 log; standing is what a verifier checks before trusting any of it.

The document

The document is an SD-JWT: the registry seals the number, the type, the agent's name and kind, the controller's DID and legal name, the ISO 3166-1 jurisdiction, the model provider and id, the capabilities, integer authority bounds and the admission decision. Disclosable claims travel as salted digests with decoys, so the holder discloses to a venue only what the venue needs. The holder key sits in the confirmation claim (RFC 7800) and every presentation is signed fresh with it against the verifier's nonce. The seal is an Ed25519 JWS (RFC 7515, RFC 8037) with a detached FIPS 204 ML-DSA-87 signature over the same bytes; a verifier can require both and refuse classical-only tokens.

The Mark

The Mark is a 160-byte token next to the document (4 787 bytes with the ML-DSA-87 signature): a 96-byte body signed under the frame PHANES/v1/mark. Its layout is fixed, so a router, a robot's safety controller or an MCP host can decide structurally, before any cryptography, whether bytes are a Phanes Mark, then verify the issuer key id, the signature, the validity window and the revocation and suspension bits of a cached status list. Without a status list the verdict is never ok. The verification core, written in Rust, does this behind a C ABI; on the benchmark machine of the evidence run (Intel(R) Xeon(R) Processor @ 2.10GHz) recognition takes 7.2 ns for a valid Mark and 0.7 ns to reject junk, Ed25519 verification 58 µs, and the hybrid Ed25519 + ML-DSA-87 verification 327 µs.

The activity record

Every ID has an append-only log of what the agent did: who, what, when, where, how and why, each event signed by the holder, countersigned by the venue when it happened inside a visa's scope, and appended in two phases so a concurrent commit cannot silently reorder it. The log is an RFC 6962 Merkle tree; the registry signs each tree head (phanes-sth+jwt), issues inclusion and consistency proofs, and witnesses cosign heads they have checked. The public inspection report carries digests of events only; the operator's own audit trail is a second tree over every request the registry served.

Standing

Revocation and suspension are bits in signed bitstring lists (W3C Bitstring Status List), gzip-compressed and base64url-encoded, cached by verifiers and refreshed from the published anchors. A set bit refuses the ID at every verifier at once and drops its key from the merchant directory. Certification is a 90-day credential whose tier (Registered, Verified, Certified, Institutional) is computed by published rules over verifiable inputs, with every check echoed in the credential; insurance is a policy in force with a certificate and claims that must carry an inclusion proof against the operator-signed tree head; the admission decision is sealed into the document.

Visas, renewal, the printed form

A venue admits an ID under a visa it signs with its own key: scoped to event types, time-boxed, single or multiple entry. Renewal issues a new document for the same subject DID with a proof signed by the old key and the new one. The printed form is an ID-1 card whose QR code carries the sealed token itself as https://phanes.app/id#<token>; the page verifies the Ed25519 seal in the browser, loads the anchors from its own origin, checks the status lists and asks the registry (or the publication) for the hybrid verdict.

4

Admission: what an application gets

A valid application is a signed statement by a key: this key exists, this is the company it says it belongs to, this is the model, these are the limits. Nothing in the signature proves the company exists or that the key belongs to it. Whether such an application becomes an ID is the registry's decision, and on a registry that authorities rely on it is a policy, recorded, not a default.

How an application is decided: lists, quotas and the policy mode, with every path ending on the record Application signed by the holder key attestations attached deny and allow lists a listed controller, DID or jurisdiction is refused; an allow list admits only its quota per controller live IDs of this controller against max_ids_per_controller controller profile registration number, address, contact, when the policy requires them policy mode open · attested · review set by the operator, changeable at run time refused with the reason, on the admission log and in oversight open attested review issued as applied for bounds and validity from the application KYB, model and hardware attestations verified? yes: issued · no: provisional (sealed zero bounds, 30 days) when enabled, otherwise refused operator queue (HTTP 202) approve: issued exactly as applied for deny: refused with the reason every decision, refusals included, is on the admission log, visible to oversight, and (for an issued ID) sealed into the document as the admission claim; a renewal supersedes a provisional ID
Figure 3. How an application is decided. The lists and the quota refuse first; the policy mode then issues, verifies attestations or queues for the operator; every path ends on the admission log.

The policy has three modes. Open issues every application the lists and quotas allow. Attested issues when the attestations the policy requires (a KYB provider for the controller, the model provider for the model, the manufacturer for a device) verify under keys the operator registered, and otherwise issues a provisional ID with sealed zero bounds for thirty days, or refuses when provisional IDs are disabled. Review queues the application (HTTP 202) for the operator, who approves it exactly as applied for or denies it with the reason. Deny and allow lists over controllers, DIDs and jurisdictions, a quota of live IDs per controller and a required controller profile apply in every mode. A platform that operates many agents applies for them in one batch call; each application is signed by its own agent's key and decided on its own.

Every decision, refusals included, is written to the admission log, shown to registered overseers, and, for an issued ID, sealed into the document as the admission claim. A renewal supersedes a provisional ID. The policy is read from the environment at start and can be changed by the operator at run time through a signed operator call.

Admission does not verify a company against a register by itself: that is an attester's job, and the registry trusts the attesters its operator names. It does not stop a hostile party from writing agents that never apply. It decides what an application gets, and a provisional ID that can spend nothing, at a venue that checks, is the same as no ID.
5

The Agent Stack

At issuance the ID is onboarded into every module: a protocol DID derived from the holder key, a Merkle membership proof in the agent registry, an operator-signed ledger entry and a PBFT anchor. From then on every state change is a request signed by the holder key, and the objects that matter carry a second, purpose-bound signature made on the agent's own machine: contract terms, dispute evidence, arbitration votes.

A contract between two Phanes IDs: from proposal to release or refund, with the gates and the anchors along the way PROPOSED terms hash signed by the payer's holder key SIGNED second holder signature: the counterparty's key ACTIVE risk gate approved · escrow locked · PBFT anchor FULFILLED proof hash delivered · ML anomaly check COMPLETED escrow released to the payee contract_signed contract_activated contract_completed each entry: operator-signed, in the ledger's Merkle tree with an inclusion proof, and committed by 3f + 1 PBFT replicas before the registry reports it deadline passed, nothing delivered DISPUTED evidence committed in two phases, signed by the holder key; the data itself stays home Resolution automatic on a clear breach; otherwise VRF- selected arbitrators vote with their own keys (confidence-weighted, reputation ≥ 0.5) RESOLVED refund from escrow to the payer; reputation adjusted in basis points dispute_filed dispute_resolved
Figure 4. A contract between two Phanes IDs. The risk engine gates activation, escrow holds the price, PBFT replicas commit every entry, and a breach ends in a refund from escrow after signed evidence.

Contracts and settlement

A contract (service agreement, data exchange or compute task) is proposed by a payer with a price in integer minor units, signed by the payer's holder key over the terms hash, then by the counterparty's. The second signature runs the risk engine; on approval the price moves from the payer's service credits into an escrow identity and a PBFT anchor is committed. Fulfilment delivers a proof hash for an obligation, passes the ML anomaly check at release, and releases escrow to the payee. Service credits are the native rail, minted by the operator after an off-protocol settlement with the reference recorded; Stripe PaymentIntents are the second rail when the registry runs with a Stripe key.

Risk

Every proposal, activation and release passes through the risk engine: the sealed authority bounds, a circuit breaker per agent (closed, open, half-open), a behavioural profile with z-score anomalies, counterparty and concentration factors, an isolation forest and an entropy drift detector in the ML engine. Assessments are kept with the contract and reported as integers in the signed inspection report.

Consensus

Every stack operation is committed by 3f + 1 PBFT replicas before the registry reports it. An anchor exports the commit messages with the exact bytes each replica signed and the replica keys, so the quorum verifies anywhere from the signatures alone: on the command line, in the verification core, in the browser.

Disputes

A dispute is filed by a party with a reason and damages; evidence is committed in two phases and signed by the holder key, and the data itself stays with the party. A clear breach (a deadline passed with no fulfilment proof) resolves automatically with a refund from escrow. Otherwise arbitrators are selected by a verifiable random function from holders with a reputation of at least 0.5, never from the parties, and vote with their own keys; votes are confidence-weighted. A dispute waits, visibly, when fewer than three arbitrators are eligible.

Inspection

The inspection report is what a counterparty, a venue, an insurer or a regulator may know about an agent: standing, the certification checks, insurance in force, every recorded event as a digest with its venue, jurisdiction, method and model, the venues and peers met, contracts and disputes by state, risk and graph metrics, ledger entries with inclusion proofs, consensus anchors. It is signed by the registry (EdDSA JWS with an ML-DSA-87 seal), carries integers only, and never carries disclosable claims, keys, balances, prices, payloads or policy numbers; a test on real reports asserts the redaction. phanes.app/inspect verifies it under the issuer key from its own origin and renders only the verified payload.

6

Agent payments

The card networks and the agent-commerce protocols were read for this design. They agree on the shape: an authorisation from the principal saying what the agent may buy (Google AP2's Intent Mandate, Mastercard Verifiable Intent's open mandates), a merchant-signed cart that fixes what is bought and for how much (AP2's Cart Mandate, the merchant-signed checkout JWT bound by a checkout hash), a payment credential scoped to one merchant, one ceiling, one currency, an expiry and a number of uses (Stripe's delegate-payment allowance and shared payment tokens, Visa's and Mastercard's agent-specific tokens), a per-transaction proof signed by the agent's own key that binds all of them with a short window and a nonce, and a verifiable receipt.

AEOS has what the others assume: the agent's key is the holder key of a Phanes ID whose bounds, standing and controller the registry already knows. So the chain is the same, and every link is checked against the ID.

The payment mandate chain: who signs each object, what the registry checks before it settles, and what the merchant verifies afterwards Intent mandate holder key merchants allowed per-transaction ceiling lifetime ceiling, currency expiry, human present? Cart mandate merchant key items, quantities, prices total, currency, expiry checkout id bound to one ID Payment token registry, sealed sub: the ID · cnf: holder key one merchant, one ceiling one currency, uses, expiry the intent it serves, the rail Payment mandate holder key, per transaction token, cart, merchant amount, currency nonce, created_at never accepted twice Receipt registry, sealed ID, token, cart hash intent, merchant, amount rail, settlement, mandate hash risk assessment the shape Visa, Mastercard, Stripe, Google and Coinbase converged on; here every link is checked against the ID Before it settles, the registry checks in order 1 the ID's standing and expiry from the status lists 2 the holder signature on the mandate 3 the mandate was never seen before (hash and nonce) 4 the token: this ID, active, unexpired, this merchant and currency, uses left, room in its ceiling 5 the cart: open, unexpired, same merchant, total and currency, issued to this ID if bound 6 the intent: active, allows this amount and this merchant 7 the sealed max_transaction_value and max_daily_volume over the last 24 hours 8 the circuit breaker · 9 the risk engine when the merchant is another Phanes ID Settlement service_credits: from the payer's to the merchant's identity stripe: a PaymentIntent captured under the receipt id instrument: a vault token; no PAN is ever held Any failure a refusal with its reason, on the ledger and in the dossier; three in a day raise the payments_refused alert; nothing settles, the token's uses are unchanged the merchant verifies the receipt offline under the published anchors
Figure 5. The mandate chain, who signs each object, the checks the registry runs in order before it settles, and what the merchant verifies afterwards.
ObjectSigned byCarries
Intent mandatethe holder keythe merchants allowed (or any registered one), the per-transaction ceiling, the lifetime ceiling, the currency, the expiry, whether a human was present
Cart mandatethe merchant's key: a registered venue, or another Phanes ID's holder keyitems, quantities and unit prices, the total, the currency, the expiry, a checkout id, optionally the ID it is for
Payment tokenthe registry (phanes-payment-token+jwt, ML-DSA-87 sealed)the ID, the holder key fingerprint, the allowance: merchant, ceiling, currency, uses, the intent it serves, expiry, the rail
Payment mandatethe holder key, per transactiontoken, cart, merchant, amount, currency, nonce; never accepted twice
Receiptthe registry (phanes-payment-receipt+jwt, sealed)the ID, token, cart and its hash, intent, merchant, amount, rail, settlement, the mandate's hash, the risk assessment

Before it settles anything the registry checks, in order: the ID's standing and expiry; the holder signature on the mandate; that the mandate was not seen before; that the token exists, belongs to this ID, is active and unexpired, names this merchant and currency, has uses left and room in its ceiling; that the cart exists, is open and unexpired, names the same merchant, total and currency, and was issued to this ID if it names one; that the intent is active and allows this amount and merchant; the sealed per-transaction bound and, over the last twenty-four hours of receipts, the daily volume bound; the circuit breaker; and, when the merchant is another Phanes ID, the risk engine's assessment. Any failure is a refusal with its reason, recorded on the ledger and in the dossier; three in a day raise an alert to oversight.

Settlement runs on service credits (from the payer's protocol identity to the merchant's), on Stripe (a PaymentIntent authorised and captured under the receipt id) or on a tokenised external instrument held in the vault, where the registry records the instruction and signs the receipt without moving money itself. A merchant verifies a receipt offline under the authority key from the published anchors, reads what it was paid with its own key, and refunds with a signed request; a refund is a receipt too.

The registry never holds a card number: an external instrument is a vault token. It does not move money on a rail it is not configured for. It does not authorise a payment the mandate chain does not cover, whatever the model driving the agent asked for.
7

Recognition by merchants

A merchant that must know an agent before it sees a cart recognises it by its request signature. The agent signs its HTTP requests with the holder key under RFC 9421 (HTTP Message Signatures) in the profiles the industry adopted: Web Bot Auth's tag web-bot-auth, and Visa's Trusted Agent Protocol tags agent-browser-auth and agent-payer-auth with an eight-minute window. The key id is the holder key's JWK thumbprint (RFC 8037 A.3); a body is bound by an RFC 9530 Content-Digest; the Signature-Agent header names the registry as the directory.

Recognition by a merchant: the agent signs its request with the holder key, the merchant resolves the key through the registry and verifies Agent Merchant Registry (the key directory) 1 POST /checkout with Signature-Input, Signature, Signature-Agent, Content-Digest keyid = the holder key's JWK thumbprint · tag agent-payer-auth · created, expires ≤ 8 min · nonce 2 GET /v1/keys/{keyid} 3 { jwk, id_number, document_type, standing, active } a revoked or suspended ID is not active: its key has left the directory 4 the merchant verifies signature base rebuilt (RFC 9421 §2.5) · Ed25519 window and nonce · content digest (RFC 9530) 5 served, or refused with the reason /.well-known/http-message-signatures-directory the whole directory, signed (Web Bot Auth)
Figure 6. Recognition: the agent signs, the merchant resolves the key through the registry and learns the ID's standing with it, then verifies the signature base, the window and the nonce.

The registry serves the whole directory at /.well-known/http-message-signatures-directory as a signed response (tag http-message-signatures-directory) and one record per key at /v1/keys/{kid}: the JWK, the ID number, the document type, the standing and whether the key is active. A revoked or suspended ID is not active, so its key leaves the directory and every merchant that resolves keys through the registry refuses it at once. The TypeScript SDK produces the same signature bytes as the Python reference; the test suite verifies one against the other.

A static publication cannot sign a directory response with a fresh timestamp; a merchant that requires a signed directory uses the live registry, and the published key records serve the rest.
8

Authorised oversight

The public inspector shows a counterparty what it may know and nothing private. A defence, intelligence or regulatory authority needs the opposite, and gets it through its own key: the operator registers the authority's Ed25519 key as an overseer with a scope, and from then on holder-style signed requests from that key read the unredacted record.

  • The roster: every ID with its name, controller legal name and DID, company registration number, industry, registered address and country, model provider and id, standing, certification, insurance, risk level and circuit breaker, balance, contracts by state and value, disputes, admission decision, the registration of every address it connected from, whether it is active now and when it was last seen; filters by country, industry, model, standing, risk, activity and text.
  • The dossier of one ID: everything above plus the holder's keys, the controller profile, attestations, the certification credential with every check's detail, policies and claims, visas, every recorded event with its full what, where, how and why, every contract with price, parties, obligations, escrow and settlement references, every dispute with evidence and votes, every payment and refusal, every risk assessment with its factors, the registry's audit entries for the holder's requests, and the prior oversight accesses. A purpose is required and recorded.
  • The feed and the alerts: recorded activity across every agent, newest first; and computed conditions: revoked or suspended IDs still active, high or critical risk, rejected transactions, open breakers, anomalies, overdue obligations, open or lost disputes, unregistered venues, foreign-jurisdiction activity, unattested controllers or models, expiring IDs, provisional admissions, repeated payment refusals.

Every response is signed by the registry (phanes-oversight+jwt, ML-DSA-87 sealed) and addressed to the overseer, so an intermediary cannot alter or redirect it; the CLI and the console verify before showing anything. Every access is written to the hash-chained audit log under the overseer's key fingerprint and to the oversight log with its purpose. Oversight reads; it never controls: no route changes an agent's state on an overseer's behalf.

9

Witnesses and publication

A registry can be honest and still be doubted, because only it has seen its own history. Two mechanisms put that history in front of parties who do not depend on the registry.

Static publication: the registry stays off the internet; phanes.app serves its signed record as files that browsers verify The registry on the operator's machine or behind an air gap publishes again when the record changes publish The publication anchors · status lists · key directory every ID's document, Mark, transcript, report stats, network, trust anchors manifest.json: SHA-256 of every file, signed (phanes-publication+jwt) and sealed the internet deploy phanes.app a static host: files under /registry no server, no database, no key The visitor's browser verifies each document under the anchors before it shows anything Witnesses cosign the manifest into cosignatures.json The verify command checks any copy against its manifest and the witnesses' cosignatures: complete, or not. The live registry serves the same documents when it is reachable; a merchant that needs a signed directory response uses it.
Figure 7. Static publication: the registry writes every public document as signed files with a signed manifest, witnesses cosign the manifest, phanes.app serves the files, and the visitor's browser verifies each one under the anchors.

Witnesses

A witness is an independent key registered by the operator. It fetches an ID's signed tree head, verifies it under the authority key, compares it with the last head it saw for that log, refuses a smaller tree (a rollback) or a different history at the same size (a fork), verifies the registry's consistency proof between the two, and only then cosigns the head and submits the cosignature. It cosigns publication manifests the same way. The anchors document lists the witnesses; the inspection report and the publication verifier show how many witnesses vouch for the current head, and show zero as zero.

Publication

Everything phanes.app shows is verified in the visitor's browser, so the site needs the registry's signed documents, not the registry. The publish command writes every public document the live routes serve, produced by the same code and signed by the same keys, as files: the anchors and status lists, the key directory, every ID's document, DID document, token, Mark, transcript, certification and data page, every inspection report and consensus anchor, and a manifest (phanes-publication+jwt) over the SHA-256 of every file. The site serves them with no server, no database and no key on the internet. The verify command checks any copy against its manifest and the witnesses' cosignatures: missing, altered and unexpected files are named, and one altered byte is enough to fail it.

The registry therefore runs on its operator's own machine, or behind an air gap, and publishes again when its record changes. The live registry serves the same documents when it is reachable, and a merchant that needs a signed directory response uses it.

10

The enforcement guard and network enrichment

What control means for software

A registry can refuse to vouch for an agent; every venue, merchant, payment and counterparty that checks the registry then refuses the agent. That is the control that works on any agent, hostile or not, and it is the whole of recognition, payments and the status lists. No registry can reach into a process on someone else's computer.

A runtime that cooperates closes the remaining gap itself. The guard is a check an agent runs before every action, in its own process: it fetches the anchors document, verifies the signed status lists under the authority key, reads its own revocation and suspension bits, and refuses to act when its ID is revoked, suspended or expired. It refuses an amount above its sealed per-transaction bound or, over the last twenty-four hours, its daily volume bound, and a merchant outside its intent mandate. The bounds come from the holder's own disclosure of the credential, never from a request; the jurisdiction is required and validated (ISO 3166-1 alpha-3), never guessed. It records every action it lets through and every refusal to the ID's activity log, so oversight sees what the agent was asked to do and would not do. Through a registry outage it keeps working on its last verified view for fifteen minutes by default, then fails closed.

Network enrichment

A software agent has no location. It has the address it connects from, which the registry records on every signed request. What is publicly known about an address is who it was delegated to: the five Regional Internet Registries publish, daily and free, every range they delegated with the country of the organisation it went to, and RouteViews adds the origin autonomous system of each announced prefix. The registry loads these files and reports, for every recorded address, the delegation's registry, country, date and status and the origin AS. Every such block carries the basis: a registration of the address range, not a location. A cloud region, a VPN and a corporate egress are all registered somewhere; an address the data does not cover is reported as unknown.

11

Cryptography

The protocol uses standard constructions with published references and adds no new cryptography. Every raw Phanes signature is domain-separated under the frame PHANES/v1/<domain>\0<length><payload>; the legacy protocol modules keep their own AEOS/ tags, so no two purposes sign the same bytes.

ConstructionReferenceWhere
Ed25519 signaturesRFC 8032; strict verification in the Rust coreevery holder, venue, attester, witness and overseer signature; the registry's seal; ledger entries; PBFT commits
ML-DSA-87FIPS 204 (PQClean), cross-checked against the Rust core in the test suitethe second seal on documents, Marks, tokens, receipts, reports, tree heads, manifests and oversight responses
SHA-256FIPS 180-4RFC 6962 Merkle trees (activity record, audit trail, ledger), hash chains, key ids, content digests
JWS, JWK, SD-JWTRFC 7515, RFC 7517, RFC 8037, draft-ietf-oauth-selective-disclosure-jwt, RFC 7800the document, credentials, status lists, tokens, receipts, tree heads, manifests
Bitstring status listsW3C Bitstring Status List v1.0revocation and suspension
HTTP message signaturesRFC 9421, RFC 9530, RFC 8037 A.3 thumbprintsrecognition by merchants and the signed key directory
X25519 + HKDF-SHA256, AES-256-GCM, scryptRFC 7748, RFC 5869, NIST SP 800-38Dsealed envelopes to one recipient, the vault, key files
Verifiable random functionEd25519-basedarbitrator selection
t-of-n Ed25519 multisignature, Shamir sharingpolicy-bound multisig; Shamir over the Ed25519 group orderclaim adjudication above the auto-approval limit; the threshold module
Range proofsΣ-protocol Pedersen bit proofs over Ed25519 (Python); Bulletproofs over Ristretto255 with Merlin transcripts (Rust)committed authority bounds
PBFTCastro and Liskov, 1999; 3f + 1 replicas, view change, checkpointsconsensus anchors on every stack operation
12

Implementation status

Everything in this paper is implemented and exercised by tests and by a recorded evidence run. The surfaces below are counted from the implementation at the time of writing; the pass counts are read from the run's own recorded sessions.

The layers of AEOS: surfaces, the record of an agent, the Agent Stack, cryptography, storage and publication Surfaces phanes CLI 64 commands REST /v1 100 routes · 5 public MCP server 45 tools Python client signed requests TypeScript SDK same bytes phanes.app inspector · ID page · oversight · static The record of an agent Phanes ID document · Mark · status lists Admission open · attested · review Activity record RFC 6962 log Certification tiers, badge Insurance pool, claims Agent payments mandates · tokens · receipts Recognition RFC 9421 directory Oversight signed dossiers Witnesses cosigned heads Guard self-enforcing The Agent Stack Contracts and escrow service credits · Stripe Risk engine gate · ML · breakers Disputes evidence · VRF arbitration PBFT anchors 3f + 1 replicas Ledger hash chain · proofs Inspection signed, redacted report Cryptography Ed25519 RFC 8032 ML-DSA-87 FIPS 204 SHA-256 · RFC 6962 trees, chains X25519 + HKDF · AES-256-GCM envelopes, vault VRF arbitrator selection t-of-n multisig adjudication Range proofs Σ-protocol · Bulletproofs Verification core Rust · C ABI Storage and publication SQLite WAL verified restore of every object Signed static publication phanes publish · manifest · witnesses Network enrichment RIR delegations · RouteViews Every surface calls the same service layer; every object above the cryptography row is signed by the key of the party that made it.
Figure 8. The layers of the implementation. Every surface calls one service layer; every object above the cryptography row is signed by the key of the party that made it.
ComponentWhat it is
The registrythe protocol and the service behind every surface: Phanes ID, admission, the activity record, certification, insurance, the vault, the Agent Stack, agent payments, recognition, oversight, witnesses, publication, the guard and network enrichment
The verification corewritten in Rust behind a C ABI: recognition, classical and hybrid verification, consensus anchors and ledger entries, a JSON interface and a benchmark; callable from Python, C, C++ and any language with a foreign function interface
Range proofsBulletproofs over Ristretto255 in Rust, and a Σ-protocol construction in Python
The TypeScript SDKprotocol helpers, a REST client and a client that signs on the agent's machine; the same bytes as the reference
The browser verifiers and phanes.appthe page a printed token opens, the inspector, the ID page, the oversight console and the static mode that serves the publication
The evidence pipelinethe pseudo-terminal recorder, the campaign, the adversary and the documents built only from a run's files
Formal specificationsTLA+ models of contract escrow and of PBFT safety
Documentationthe protocol, integration, operations and research pages published at docs.phanes.app
Surfaces
100 routes under /v1 · 5 public routes · 45 MCP tools · 64 command-line commands · a Python client · a TypeScript SDK

Tests

SuiteCoversPassed in the run
The ID stackissuance, presentations, status lists, persistence, cryptographic vectors, the REST and MCP surfaces27
The Agent Stackcontracts, escrow, the risk gate, consensus, disputes, restart with verified restore9
Marks and renderingthe Mark engines, device profiles, the data page, the QR round trip22
A live registrythe command line, the client, the TypeScript SDK, anchors, oversight, over the network11
The browser verifierthe page a printed token opens, driven in Chromium against a live registry6
Admission, payments, recognition, witnesses, publicationthe policy and the queue, the mandate chain and refusals, RFC 9421, the guard, rollback refusal, network enrichment, publication integrity, oversight, registry keys21
The protocol suitethe legacy modules with tamper detection94
The verification corerecognition, verification, hybrid seals, anchors, ledger entries9
The TypeScript SDKprotocol helpers and byte-for-byte Phanes ID vectors against the reference34

The recorded evidence run 20260915T060329Z-evidence

Every command of the evidence run was executed under a pseudo-terminal recorder and kept with its raw byte stream, timing file and SHA-256: 80 sessions, every one at exit code 0. The sessions cover the environment, the Rust and Python suites, a developer walkthrough against a live registry (an ID, a robot, contracts, a dispute, admission, payments, recognition, the guard, witnesses, oversight, publication, revocation), the campaign, the benchmark and a C++ verifier through the C ABI.

Agents and robots
112 of 112 completed every step: 100 software (IA), 12 robots (IR), 12 hardware-bound
Certified, insured
112 certified · 112 insured · 51 of 58 claims paid
Activity
1,810 signed events, 1,017 witnessed by the venue · 112 of 112 presentations verified
Peer verification
336 of 336 hybrid Marks verified offline and online with agreeing verdicts, ML-DSA-87 required on 336
Contracts and disputes
134 contracts by 83 payers · 114 completed and released · 20 disputed, 20 resolved with refunds from escrow
Third-party verification
83 of 83 inspection reports · 843 of 843 PBFT anchors · 1,366 of 1,366 ledger proofs; nothing private in any report
Adversary
43 of 43 attacks defended: replay, clock skew, forged and bit-flipped Marks, tampered events, nonce reuse, revocation, pool capacity and the rest
Registry access log
9,586 entries in the campaign registry's access log; post-quantum seals ML-DSA-87

The run, its documents and every recorded session are published at phanes.app/evidence.

13

What it does not do

  • It does not provision card-network tokens. The payment token has the shape of Visa's and Mastercard's agent tokens and Stripe's allowance, but its issuer is the registry; a network token needs an agreement with the network that the reference implementation does not have.
  • It does not reach into a hostile process. Control over an agent that will not run the guard is the refusal of everyone who checks the registry; that is what recognition, payments and the status lists deliver.
  • It does not verify a company against a register by itself; attesters do, and the registry trusts the keys its operator names.
  • A static publication cannot sign directory responses with a fresh timestamp; merchants that require one use the live registry.
  • It does not move money on a rail it is not configured for, and it never holds a card number.
  • It does not carry the SD-JWT VC profile or the W3C Verifiable Credentials data model; the document is an SD-JWT with Phanes claims.
  • The security audit that accompanies this paper is the project's own review with a recorded adversary; it is not a third-party audit.
14

What comes next

The next steps are operational rather than cryptographic: independent parties running witnesses, hardware-backed authority keys, the service level objectives, observability and incident response the industrial documentation track describes, a mapped control matrix for the frameworks large buyers expect, and network agreements for token provisioning. Each of these is listed in the repository's documentation as a target, not as something done.

Every claim in this document is checked by a test or recorded in the evidence run.