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.
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.
-
Poppy official validator
The official Poppy kit, unmodified, with milestones
foundationandinterfaces, 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(runstest/poppy-validador.test.tsandtest/exigencia-poppy.test.ts)- When
- 22 Oct 2026, 22:13:55 UTC
- Environment
- In process; the
.testhosts 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
-
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
-
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,
openpactprotocolcommit838c6bd - 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 on3622
-
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'se2e/)- 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.
-
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>(filesovras-delegada.test.ts, copied intoe2e/and removed afterwards)- When
- 22 Oct 2026, 22:30:38 UTC
- Environment
- Local server on
localhost:3620
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.
-
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 -
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/3
02-red.log -
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,
audof 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
-
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 withnode:cryptodirectly. 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 onlocalhost:3734
-
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
90/90detected: 21 + 15 + 15 + 39
03-mutar-vxp.log04-mutar-nativo.log05-mutar-exigencia.log06-mutar-prueba.log -
Test vectors
Vectors generated by the TypeScript issuer with test keys, neutral test data and
*.examplehosts, 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
0 failures92 checks; PACT 16 checks
07-vectores-verificar.log08-vectores-paquete.log09-vectores-pact.log -
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 -
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 -
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(moduleverifier/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
A VXP field leaked into the PACT Agent Card
The
vxp:relationshipcheckbox was published as a scope in the PACT Agent Card. The delegated test with the official PACT client detected it.The verifier compared with the first outcome
It compared the operation's state with the first
outcome, instead of the last final statement.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.
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_sumancover 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.
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.
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.
- README.txtWhat each file is, and the verification commands
- runs-2026-10-22-evening/correr.shThe script that ran every test on this page, 01 to 17
- native-run-2026-10-22-evening/paquete-op_XzdILOmlgiae.jsonProof from the native-only run, the one on the home page; its operation and saved material, anchored by the issuer
- pact-run-2026-10-22-evening/pact-op_R6F-x006Gxsg.jsonProof left by the delegated PACT test, approved through the company's channel (
company_channel); its PACT receipt and saved material - pact-run-2026-10-22-evening/pact-op_YxV3xdcUxo5-.jsonSecond proof from the same run; its operation, PACT receipt and saved material
- vectors/vectores-0.1.jsonProof vectors. Carries test-only keys derived from public phrases
- vectors/vectores-pact-0.1.jsonPACT anchoring and receipt vectors
- verifier/verificar_paquete.pyThe verifier, in Python, with the current
vxpnames - verifier/verificar.pyThe second Python verifier, used in tests 07 and 10
- verifier/vxp-verify.jsThe browser verifier used on the Verify page, used in test 16
- Native run proofsListed on the Examples page. The OP-5 package was re-verified with signatures on 22 Oct 2026 and is available on request