Whitepaper
Version 0.2September 2026AEOS: 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.
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.
| Capability | In the 2026 agent-payment schemes | In AEOS |
|---|---|---|
| Identity | an asymmetric key registered with each scheme's directory (Visa, Mastercard, Cloudflare, Stripe profiles); the same agent registers with each | one 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 |
| Admission | registration and agreements per scheme; the criteria are the scheme's | a recorded policy: open, attested or review; deny and allow lists, quotas, provisional IDs with sealed zero bounds; every decision on the record |
| Standing | token deactivation and directory removal within each scheme | signed revocation and suspension lists every verifier checks; a revoked ID's key leaves the directory; the guard stops the agent itself |
| Record of conduct | not part of the published protocols | an append-only log of who, what, when, where, how and why, countersigned by venues, with inclusion and consistency proofs and witnesses |
| Contracts and escrow | not part of the published protocols | terms signed by both holder keys, escrow behind a risk gate, PBFT anchors, fulfilment proofs |
| Disputes | outside the agent protocols | signed two-phase evidence, automatic resolution on clear breaches, VRF-selected arbitrators voting with their own keys, refunds from escrow |
| Risk and insurance | not part of the published protocols | a risk engine at proposal, activation and release; circuit breakers; actuarial insurance with evidence-backed claims; certification tiers |
| Payments | scoped 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 |
| Recognition | RFC 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 publication | centrally operated directories; no independent evidence of what a directory showed | signed 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.
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.
| Party | Holds | Signs | Never sees |
|---|---|---|---|
| Agent or robot (the holder) | its own Ed25519 and X25519 keys: a file, an encrypted vault or an HSM | the 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 keys | the document, status lists, Marks, tokens, receipts, tree heads, publications, oversight responses | holder private keys |
| Attesters | their own keys, registered by the operator | attestations over the holder key fingerprint: model provider, KYB provider, hardware manufacturer | — |
| Venues and merchants | their own keys, registered by the operator, or a Phanes ID of their own | visas, witness signatures on events, carts, refunds | anything the holder does not disclose |
| Witnesses | their own keys, registered by the operator | cosignatures of tree heads and publication manifests | the registry's private record |
| Overseers | keys of the authorities accountable for the agents, registered with a scope | requests for the unredacted record, each with a purpose | holder private keys |
| Verifiers (anyone) | the published anchors and cached status lists | challenge nonces | anything not disclosed or published |
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 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.
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.
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.
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.
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.
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.
| Object | Signed by | Carries |
|---|---|---|
| Intent mandate | the holder key | the merchants allowed (or any registered one), the per-transaction ceiling, the lifetime ceiling, the currency, the expiry, whether a human was present |
| Cart mandate | the merchant's key: a registered venue, or another Phanes ID's holder key | items, quantities and unit prices, the total, the currency, the expiry, a checkout id, optionally the ID it is for |
| Payment token | the 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 mandate | the holder key, per transaction | token, cart, merchant, amount, currency, nonce; never accepted twice |
| Receipt | the 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.
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.
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.
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.
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.
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.
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.
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.
| Construction | Reference | Where |
|---|---|---|
| Ed25519 signatures | RFC 8032; strict verification in the Rust core | every holder, venue, attester, witness and overseer signature; the registry's seal; ledger entries; PBFT commits |
| ML-DSA-87 | FIPS 204 (PQClean), cross-checked against the Rust core in the test suite | the second seal on documents, Marks, tokens, receipts, reports, tree heads, manifests and oversight responses |
| SHA-256 | FIPS 180-4 | RFC 6962 Merkle trees (activity record, audit trail, ledger), hash chains, key ids, content digests |
| JWS, JWK, SD-JWT | RFC 7515, RFC 7517, RFC 8037, draft-ietf-oauth-selective-disclosure-jwt, RFC 7800 | the document, credentials, status lists, tokens, receipts, tree heads, manifests |
| Bitstring status lists | W3C Bitstring Status List v1.0 | revocation and suspension |
| HTTP message signatures | RFC 9421, RFC 9530, RFC 8037 A.3 thumbprints | recognition by merchants and the signed key directory |
| X25519 + HKDF-SHA256, AES-256-GCM, scrypt | RFC 7748, RFC 5869, NIST SP 800-38D | sealed envelopes to one recipient, the vault, key files |
| Verifiable random function | Ed25519-based | arbitrator selection |
| t-of-n Ed25519 multisignature, Shamir sharing | policy-bound multisig; Shamir over the Ed25519 group order | claim 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 |
| PBFT | Castro and Liskov, 1999; 3f + 1 replicas, view change, checkpoints | consensus anchors on every stack operation |
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.
| Component | What it is |
|---|---|
| The registry | the 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 core | written 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 proofs | Bulletproofs over Ristretto255 in Rust, and a Σ-protocol construction in Python |
| The TypeScript SDK | protocol 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.app | the page a printed token opens, the inspector, the ID page, the oversight console and the static mode that serves the publication |
| The evidence pipeline | the pseudo-terminal recorder, the campaign, the adversary and the documents built only from a run's files |
| Formal specifications | TLA+ models of contract escrow and of PBFT safety |
| Documentation | the 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
| Suite | Covers | Passed in the run |
|---|---|---|
| The ID stack | issuance, presentations, status lists, persistence, cryptographic vectors, the REST and MCP surfaces | 27 |
| The Agent Stack | contracts, escrow, the risk gate, consensus, disputes, restart with verified restore | 9 |
| Marks and rendering | the Mark engines, device profiles, the data page, the QR round trip | 22 |
| A live registry | the command line, the client, the TypeScript SDK, anchors, oversight, over the network | 11 |
| The browser verifier | the page a printed token opens, driven in Chromium against a live registry | 6 |
| Admission, payments, recognition, witnesses, publication | the policy and the queue, the mandate chain and refusals, RFC 9421, the guard, rollback refusal, network enrichment, publication integrity, oversight, registry keys | 21 |
| The protocol suite | the legacy modules with tamper detection | 94 |
| The verification core | recognition, verification, hybrid seals, anchors, ledger entries | 9 |
| The TypeScript SDK | protocol helpers and byte-for-byte Phanes ID vectors against the reference | 34 |
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.
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.
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.