Version: v0 (May 2026)
Protocol: prism.report.v0
Schema: prism-report-v0.schema.json
A Prism report is a bundle of independently verifiable receipts. This guide walks through verifying each receipt type. Every step is self-contained — you can verify IPFS CIDs without running the Prism dashboard, and you can check onchain transactions without trusting any Prism service.
Every Prism trace is pinned to IPFS. The trace's ipfs_cid references the full Trading-R1 trace JSON — reasoning steps, market context, evidence references, and the trader's final action.
Fetch the trace content using any IPFS gateway. The /ipfs/<CID> path pattern is gateway-agnostic — swap the host to any gateway you trust:
https://ipfs.io/ipfs/<CID>
https://gateway.pinata.cloud/ipfs/<CID>
https://dweb.link/ipfs/<CID>
Canonical PASS example:
- View canonical PASS trace on IPFS — resolves
ipfs://QmNzqnPEEQUMn3GMbiEZANpKXZRPmTHxVwt5nNevR8iXt8through a public gateway. - Bare gateway URL:
https://ipfs.io/ipfs/QmNzqnPEEQUMn3GMbiEZANpKXZRPmTHxVwt5nNevR8iXt8
- Resolve the CID from any public IPFS gateway using the
/ipfs/<CID>path. - Confirm the returned JSON content matches the trace identity fields in the report (
trace_id,agent_id,market_id,action). - Compute the content hash of the returned JSON (see section 4) and confirm it matches
content_hashes.trace_json_hashin the report.
If any gateway returns different content for the same CID, or if the content hash does not match, the report is invalid — IPFS CIDs are content-addressable and should be deterministic.
Paid Prism validations use x402 — an HTTP 402-based micropayment protocol. Every paid validation produces an onchain transaction on Base Sepolia.
Look up the x402 transaction hash on a Base Sepolia block explorer:
https://sepolia.basescan.org/tx/<tx_hash>
Canonical CLI example:
https://sepolia.basescan.org/tx/0xd6ab0cbba99dfa1162ab24ccf35c9e9544c1bb64a550a0e349e8033ebd4f43e1
- Extract
payment_receipts[].tx_hashfrom the report for the entry withprotocol == "x402". - Open
https://sepolia.basescan.org/tx/<tx_hash>in a browser or query the Base Sepolia RPC. - Confirm the transaction status is successful (status
1). - Confirm the
amount_usdcfield in the report is consistent with the onchain transfer amount. - Confirm the
networkfield is"base-sepolia"or equivalent.
The x402 protocol settles on Base Sepolia before the Prism sentinel returns a verdict. If the payment transaction is not found or has failed, the validation was never completed and the report is not authentic.
Every Prism validation request and response is submitted to the deployed Arc ERC-8004 ValidationRegistry. This produces onchain transaction hashes that anchor the validation to Arc testnet.
Look up the Arc transaction hash on the Arc testnet block explorer:
https://testnet.arcscan.app/tx/<tx_hash>
Canonical PASS example:
https://testnet.arcscan.app/tx/0x5adb156fa8de6c1cf7e0d50c2197d8315eb9a501da2c00ffbf52996d2407d786
- Extract
onchain_receipts.validation_arc_txfrom the report. - Open
https://testnet.arcscan.app/tx/<tx_hash>or query the Arc testnet RPC. - Confirm the transaction exists and was successful.
- Confirm the
erc8004_request_hashin the report matches the ValidationRequest event emitted by the transaction logs. - If the trace also has its own Arc anchoring, repeat for
onchain_receipts.trace_arc_tx.
Arc validation transactions are the onchain proof that a sentinel reviewed a trace and submitted a verdict through the ERC-8004 contract. Without a valid Arc transaction, the validation is not onchain-anchored.
Every Prism report carries three content hashes under content_hashes:
| Hash field | What it covers |
|---|---|
trace_json_hash |
The full Trading-R1 trace JSON |
verdict_json_hash |
The sentinel's verdict payload JSON |
report_json_hash |
The entire prism.report.v0 report JSON |
These hashes are computed using deterministic JSON canonicalization — the JSON is serialized with sorted keys and a canonical encoding before hashing.
The canonicalization follows RFC 8785 (JSON Canonicalization Scheme, JCS):
- Object keys are sorted lexicographically.
- No whitespace outside string literals.
- Unicode characters are represented in their shortest UTF-8 encoding.
- String escaping uses the minimal representation (
\nfor newline, no\u000a).
The resulting canonical JSON byte sequence is hashed with Keccak-256, producing a 32-byte (64-hex) digest prefixed with 0x.
The report_json_hash field is self-referential — it covers the report JSON that contains it. To break the circular dependency, report_json_hash MUST be omitted from the report JSON before canonicalization and hashing:
- Take the full report JSON object.
- Delete the key
content_hashes.report_json_hash(remove it entirely from the object — or set it tonullbefore canonicalization; the canonical form is the object without this field). - Canonicalize the remaining object according to RFC 8785 / JCS.
- Hash the resulting UTF-8 bytes with Keccak-256.
- Insert the resulting
0x-prefixed hex digest back intocontent_hashes.report_json_hash.
Note: trace_json_hash and verdict_json_hash do not have this self-reference problem — they hash separate JSON payloads (the trace JSON and the verdict JSON), not the report JSON that contains them.
The generated_at timestamp is part of the report JSON and therefore participates in report_json_hash. If a report is regenerated with a different generated_at, the report_json_hash will differ. generated_at also participates in trace_json_hash and verdict_json_hash if those payloads include a timestamp. This is intentional — content hashes are a fingerprint of the exact payload at the exact generation time.
- Obtain the canonical JSON for the target object (trace, verdict, or report).
- Serialize using RFC 8785 / JCS canonicalization rules: sorted keys, no extra whitespace, minimal escaping.
- Compute Keccak-256 of the canonical bytes.
- Compare the resulting
0x-prefixed hex digest against the correspondingcontent_hashes.*field in the report.
Tooling: Most languages have JCS libraries (json-canonicalize in JS/TS, canonicaljson in Python). If you do not have a JCS library, sorting keys alphabetically and stripping whitespace produces equivalent results for Prism's JSON payloads (which use only ASCII-safe strings and standard JSON value types).
The content hash chain provides integrity: if any hash mismatches, either the JSON was tampered with or the canonicalization was not applied correctly.
The payment_receipts array in a prism.report.v0 report uses a discriminated union on the protocol field. In v0, only x402 is implemented as a strict, fully-constrained receipt shape.
MPP (Multiparty Payment Protocol) and AP2 (Agent Payment Protocol v2) are reserved protocol identifiers. They appear in the schema's oneOf branches with only protocol required and a receipt_header_hash placeholder field. No MPP-specific or AP2-specific fields beyond the placeholder are defined in v0.
These slots follow the adapter pattern: a future protocol version can fill in the full MPP or AP2 receipt shape under a new schema_version (e.g., prism.report.v1). v0 consumers will reject enriched MPP or AP2 receipts with unknown fields — this is intended behavior to prevent silent misinterpretation. A v0 consumer encountering a protocol: "mpp" or protocol: "ap2" receipt should:
- Validate that
protocolis one of the known reserved values. - Treat the receipt as unverifiable beyond schema conformance (since no verification logic is implemented).
- Skip the receipt without rejecting the entire report.
MPP and AP2 are not implemented in v0. They are adapter-only future slots reserved to avoid namespace collisions when Prism adds support for additional payment receipt protocols.
For a complete end-to-end verification of a prism.report.v0 report:
- Schema validation. Validate against
prism-report-v0.schema.jsonusing a JSON Schema Draft 2020-12 validator. - Schema version. Confirm
schema_version == "prism.report.v0". - IPFS CID. Resolve
trace.ipfs_cidfrom a public gateway; confirm content matches. - Trace content hash. Recompute
trace_json_hashfrom canonical JSON; confirm match. - Verdict content hash. Recompute
verdict_json_hashfrom canonical JSON; confirm match. - Report content hash. Recompute
report_json_hashfrom canonical JSON; confirm match. - Evidence receipts. For each evidence receipt, confirm
source_urlis well-formed andsource_content_hashis a valid 64-hex digest. - x402 payment. Look up
payment_receiptsx402tx_hashon Base Sepolia; confirm settlement. - Arc validation tx. Look up
onchain_receipts.validation_arc_txon ArcScan testnet; confirm presence. - ERC-8004 request hash. Confirm
erc8004_request_hashmatches the ValidationRequest event. - Capital gate. Confirm
capital_gate.statusis a valid enum value and consistent with the verdict. - Issue ledger. Review
issue_ledgerfor unresolved blocking issues; confirm tool receipts. - Banned content. Confirm no raw prompts, scraped pages, secrets, or chain-of-thought appear in onchain-anchored fields.
- Protocol spec:
prism-protocol-v0.md - JSON Schema:
prism-report-v0.schema.json - Guarantees page: Verification guarantees
- Receipts documentation: Receipts