Conformance · draft 0.1

Every result, with the command and the log behind it

SOVRAS ran each test below on 22 October 2026 against the reference implementation, after that day's revision of the specification. The tests fall in three classes, as in specification §12, and their results are never added together. Each figure links to the log that produced it.

Runs: 22 Oct 2026, 22:13 to 22:34 UTC, against the repositoryWindows 11 · Node.js 22.20.0 · Python 3.14.0, cryptography 50.0.2

Check your own implementation

The conformance validator acts as a personal agent against your company's server and reports each check with the rule it tests: passed, failed, optional or manual. It also checks every object your server returns against the JSON Schemas (check S1). Against the reference implementation: 51 passed, 0 failed, 3 manual.

node conformance/validate.ts my-config.json --report my-report.json · How to configure it · Failures and the tests that cover them · Schemas index

Read this first

This is a self-run conformance record by SOVRAS, and it is not an independent certification. The Poppy and PACT suites are official and unmodified, but SOVRAS ran them on its own machines against its own implementation. Nobody outside SOVRAS has reproduced these results yet.

Three classes, never added together. Official tools of other protocols are published by the Poppy and PACT projects and run unchanged. Own adapter tests are written by SOVRAS to check its adapters where no official tool reaches. VXP tests check VXP itself. A pass in one class says nothing about the others.

The official PACT delegated suite only runs against PACT's demo airline. To test delegated authority against VXP, SOVRAS wrote its own delegated test with the official PACT client. It is an own adapter test, not the official suite.

Environments. In process: the test starts the server inside its own Node.js process. Local server: a separate server process on the same machine, reached over TCP. Offline: the verifier reads files, with no server. Public tunnel: a local server reached from the internet through a tunnel.

Class 1

Official tools of other protocols

Written and published by the Poppy and PACT projects, and run unchanged. They check that VXP's adapters keep those protocols' own contracts. They do not check VXP Proof, VXP Relationship or the operation requirements. The Poppy validator's result is not full Poppy conformance: this version of the kit covers discovery and conversations, and does not check sign-in or Operations.

  1. Poppy official validator

    The official Poppy kit, unmodified, with milestones foundation and interfaces, against three test companies: a hardware store, a hotel, and the hardware store with returns. It covers discovery and conversations. Sign-in and the Operations extension are outside what this version of the kit validates, so this is not full Poppy conformance.

    Version
    Poppy draft 0.2, kit commit 39b35bd
    Command
    npm test (runs test/poppy-validador.test.ts and test/exigencia-poppy.test.ts)
    When
    22 Oct 2026, 22:13:55 UTC
    Environment
    In process; the .test hosts resolve to the server
    Skipped
    By the kit's design: authorization endpoint (no Direct Sign-In published) 1, DPoP nonce (optional) 1, OpenAPI 2, MCP 11

    59 passed0 failed · 15 skipped
    in each of the three companies

    01-npm-test.loglines 61, 83 and 441
  2. Poppy official validator, through a public tunnel

    The same kit, run from its command line against the test hardware store exposed on the internet. Earlier run, from before the 22 October revision. The hotel was not run this way.

    Version
    Poppy draft 0.2
    Command
    The kit's CLI with --json
    When
    21 Oct 2026, 03:48 UTC (file time)
    Environment
    Public tunnel

    59 passed0 failed · 15 skipped
    hardware store only

    poppy-validator-tunnel.jsonsummary.total
  3. PACT official Identity suite, hardware store

    Agent identity according to PACT 1.0: the official end-to-end Identity tests (e2e/pact.test.ts) from a clean clone of the PACT repository.

    Version
    PACT 1.0 over A2A 1.0.1, openpactprotocol commit 838c6bd
    Command
    bash scripts/pact-e2e.sh <clone of openpactprotocol 838c6bd with pnpm install>
    When
    22 Oct 2026, 22:30:38 UTC
    Environment
    Local server on localhost:3620, PACT test agent on 3622

    10/10

    13-pact-ferreteria.logfile pact.test.ts
  4. PACT official Identity suite, hotel

    The same Identity tests against the test hotel.

    Version
    PACT 1.0 over A2A 1.0.1, commit 838c6bd
    Command
    CUSTOMER_ID=t_hotel npx vitest run pact.test.ts (in the clone's e2e/)
    When
    22 Oct 2026, 22:31:25 UTC
    Environment
    Local server on localhost:3620

Class 2

Own adapter tests

Written by SOVRAS, for what the official tools do not reach. They show that SOVRAS's adapters behave as SOVRAS reads the external contract; they do not show that a third party agrees. The Poppy adapter's own flow tests (sign-in, Operations, the relationship over a Poppy conversation) run inside the full suite of class 3.

  1. Delegated test with the official PACT client

    Written by SOVRAS with the official PACT client: delegation by device code, expansion of permissions, PACT receipts and VXP proofs. It is not the official PACT delegated suite. It found a defect, listed below under failures fixed.

    Version
    PACT 1.0 over A2A 1.0.1, client from commit 838c6bd
    Command
    bash scripts/pact-e2e.sh <clone> (file sovras-delegada.test.ts, copied into e2e/ and removed afterwards)
    When
    22 Oct 2026, 22:30:38 UTC
    Environment
    Local server on localhost:3620

    12/12

    13-pact-ferreteria.logfile sovras-delegada.test.ts

Class 3

VXP tests

Written by SOVRAS. They check VXP Proof, VXP Relationship, the operation requirements O1 to O7, the native profile and the reference implementation, including the native-only gateway. Each protection has a mutation that switches it off, and the matching test must then fail. They do not show interoperability with an implementation written elsewhere.

  1. Full suite

    Store, hotel, VXP, native profile, a native-only gateway with no adapter, key persistence, rotation and historical verification, relationship over Poppy, attacks from review round 3, round 4, and real phrases from the agents of 21 October. The same command also runs the official Poppy validator, whose result belongs to class 1.

    Command
    npm test (node --test test/*.test.ts)
    When
    22 Oct 2026, 22:13:55 UTC
    Environment
    In process

    149/1490 failed · 0 skipped

    01-npm-test.log
  2. Full operation over the network

    Server and agent in separate processes: OAuth with DPoP, account linking, request, acceptance, change in the company's system, proof checked by the Python verifier fetching the material over HTTP, and a company-initiated request delivered to an HTTP inbox. The agent is a test process written by SOVRAS.

    Command
    npm run test:network
    When
    22 Oct 2026, 22:14:14 UTC
    Environment
    Local server; each test starts and stops its own processes
  3. Live verifier

    The Python verifier against the two proofs left by the delegated test, fetching public material from the running server. Two proofs × seven checks (brand domain, PACT authorization server, Poppy domain, cross-check with the second verifier, aud of another agent, tampered result, tampered PACT receipt), plus two false anchors.

    Command
    bash scripts/verificar-vivo.sh
    When
    22 Oct 2026, 22:31:29 UTC
    Environment
    Local server on localhost:3620
  4. Native-only run over the network

    The gateway in its own process with no adapter (no poppy.json, no Agent Card, no A2A) and persistent keys; an agent that signs with node:crypto directly. Discovery, identity, per-order authority, proposal, one execution, read-back, proof verified by the issuer alone, and a company-initiated request to the agent's inbox. Its files are the evening native run in the downloads, and the home page shows it.

    Command
    VXP_RECORRIDO_DIR=<out> VXP_KEYS_DIR=<private dir> node --test scripts/recorrido-nativo.test.ts
    When
    22 Oct 2026, 22:30:28 UTC
    Environment
    VXP gateway on localhost:3730, agent on localhost:3734
  5. Mutations

    One protection is switched off at a time, and the test that covers it has to fail. Four sets: VXP 21, the 0.1 design (native profile) 15, the store and hotel scenarios 15, and the proof chain 39.

    Commands
    node scripts/mutar-vxp.mjs · node scripts/mutar-nativo.mjs · node scripts/mutar-exigencia.mjs · PYTHONIOENCODING=utf-8 python scripts/mutar-prueba.py
    When
    22 Oct 2026, from 22:14:19 UTC (VXP), 22:18:11 (native), 22:18:58 (scenarios) and 22:21:01 (chain)
    Environment
    In process
  6. Test vectors

    Vectors generated by the TypeScript issuer with test keys, neutral test data and *.example hosts, checked by two Python verifiers: the proof vectors with each verifier, and the PACT anchoring vectors. The run used the vector files published in Downloads.

    Commands
    python verifier/verificar.py <published vectores-0.1.json>
    python verifier/verificar_paquete.py vectores <published vectores-0.1.json>
    python verifier/verificar_paquete.py pact <published vectores-pact-0.1.json>
    When
    22 Oct 2026, 22:28:54 to 22:28:55 UTC
    Environment
    Offline
  7. Cross-check of the two verifiers

    Both Python verifiers on the same cases: every chain in the vectors, the malleated signature, the negative cases and the anchoring cases. Both verifiers were written by the same team.

    Command
    python scripts/cruce-verificadores.py
    When
    22 Oct 2026, 22:28:56 UTC
    Environment
    Offline

    49 cases0 discrepancies

    10-cruce.log
  8. Differential fuzz

    Random chains, signed with the vector test keys, mixing valid and invalid steps, run through both verifiers. Of the 20,000 chains, 279 are valid, so it measures agreement mostly on rejections.

    Command
    python scripts/fuzz-diferencial.py 20000 (default seed 20261020; with no argument it runs 5,000)
    When
    22 Oct 2026, 22:28:57 UTC
    Environment
    Offline

    20,000 chains0 discrepancies

    11-fuzz.log
  9. Browser verifier against the Python reference

    The JavaScript module behind the Verify page, run under Node.js and compared line by line with the Python verifier: both vector files and every proof published in the downloads (the two native runs and the PACT run), each as captured and with tampered copies.

    Command
    node verifier/tests/test-vxp-verify.mjs (module verifier/vxp-verify.js)
    When
    22 Oct 2026, 22:34:42 UTC
    Environment
    Offline, Node.js 22.20.0

    202 comparisons0 discrepancies

    16-verificador-web.log

What the tests caught

Failures found in the reference implementation, and fixed

  1. A VXP field leaked into the PACT Agent Card

    The vxp:relationship checkbox was published as a scope in the PACT Agent Card. The delegated test with the official PACT client detected it.

  2. The verifier compared with the first outcome

    It compared the operation's state with the first outcome, instead of the last final statement.

  3. Three mutations went undetected

    Until their tests were added: a write in a traditional channel, a phone number shared by two customers in a channel, and a relationship that survived revoking the delegation.

  4. Expanding permissions over Poppy added the earlier scopes (22 Oct)

    Poppy draft 0.2 §4.4: «The Company MUST NOT grant scopes beyond those requested». The token now carries only what was requested; test H3 and the mutation permisos_suman cover it.

Reproduce

Run the kit

The vectors and the verifier run from the downloads on this site. The full battery runs from reference/ in the repository, under Apache 2.0.

With the downloads only · Python 3 and cryptography
# from the downloads/ folder
pip install cryptography
python verifier/verificar_paquete.py vectores vectors/vectores-0.1.json
python verifier/verificar_paquete.py pact vectors/vectores-pact-0.1.json
python verifier/verificar.py vectors/vectores-0.1.json

# a proof from the home page, offline
python verifier/verificar_paquete.py material \
    --material native-run-2026-10-22-evening/material-op_XzdILOmlgiae.json \
  --paquete  native-run-2026-10-22-evening/paquete-op_XzdILOmlgiae.json \
  --operacion native-run-2026-10-22-evening/operacion-op_XzdILOmlgiae.json

Expected: 92 comprobaciones, 0 fallas, 16 comprobaciones, 0 fallas, 0 fallas, and one JSON line with "valid": true. Exit code 0 means valid.

The full battery · run from reference/
npm test
npm run test:network
node scripts/mutar-vxp.mjs
node scripts/mutar-nativo.mjs
node scripts/mutar-exigencia.mjs
PYTHONIOENCODING=utf-8 python scripts/mutar-prueba.py
python ../verifier/verificar.py ../vectors/vectores-0.1.json
python ../verifier/verificar_paquete.py vectores ../vectors/vectores-0.1.json
python ../verifier/verificar_paquete.py pact ../vectors/vectores-pact-0.1.json
python scripts/cruce-verificadores.py
python scripts/fuzz-diferencial.py 20000
VXP_RECORRIDO_DIR=<out> VXP_KEYS_DIR=<private dir> node --test scripts/recorrido-nativo.test.ts
PORT=3620 PA_PORT=3622 VXP_KEYS_DIR=<private dir> PA_PUBLIC_JWK="$(cat .prueba/pa-public.jwk)" node src/main.ts > .prueba/server.log &
bash scripts/pact-e2e.sh <clone of openpactprotocol 838c6bd with pnpm install>
bash scripts/verificar-vivo.sh

All of them, with one log per test, are in correr.sh, the script that produced the logs on this page. The PACT steps need a clone of openpactprotocol and the server running. On a Windows console with cp1252, mutar-prueba.py needs PYTHONIOENCODING=utf-8.

Downloads

Logs, vectors, verifier and proofs

The README explains every file and how to verify it. The start-up log of the local server for runs 13 to 15 is left out, because it prints an internal key of the test server.