Verify Receipt

Verify a single Ed25519-signed receipt file. Returns exit 0 if valid, 1 if tampered, 2 if malformed.

Published by @Tom Farley·from wshobson/agents·0 agent reads / 30d·0 saves·

Verify Receipt

Verify an Ed25519 signed receipt produced by protect-mcp. The verification runs entirely offline using @veritasacta/verify from npm. No network requests, no vendor lookups, no trust in the operator required.

Usage

/verify-receipt ./receipts/2026-04-15T10-30-00Z.json

What This Command Does

  1. Reads the receipt JSON file
  2. Validates the structure (required fields, correct types)
  3. Extracts the public key and signature
  4. Reconstructs the canonical form (JCS, RFC 8785)
  5. Verifies the Ed25519 signature over the canonical bytes
  6. Reports the result

Implementation

Run this in the Bash tool:

npx @veritasacta/verify "$1"

Where $1 is the receipt path provided by the user.

Expected exit codes

ExitMeaningAction
0Valid receipt, signature verifiedReport: "Verified. Receipt authentic."
1Signature mismatch — receipt tamperedReport: "TAMPERED. Signature does not match payload."
2Malformed receiptReport: "Malformed. Missing required fields or invalid structure."

What to Show the User

For a valid receipt:

Verified ✓

Receipt:     rec_8f92a3b1
Tool:        Bash
Decision:    allow (policy: autoresearch-safe)
Signed at:   2026-04-15T10:30:00.000Z
Signer:      4437ca56815c0516...
Chain link:  parent=rec_3d1ab7c2 ✓

For a tampered receipt:

TAMPERED ✗

The signature does not match the payload. This receipt has been modified
since it was signed.

Receipt ID:  rec_8f92a3b1
Expected signer: 4437ca56815c0516...

Possible causes:
- A field was edited after signing (most common)
- The signature was copied from a different receipt
- The public key was replaced

Compare this receipt against a known-good copy to identify the altered field.

For a malformed receipt:

MALFORMED ✗

The file is not a valid Veritas Acta receipt. Missing or invalid fields:
<list the specific structural issues>

A valid receipt must include: receipt_id, receipt_version, issuer_id,
event_time, tool_name, decision, public_key, signature.

References

  • Receipt format: IETF draft-farley-acta-signed-receipts
  • Verify CLI: @veritasacta/verify on npm
  • Chain verification: use /audit-chain for a full chain walk

Bundled with this artifact

2 files

Reference files that ship alongside this artifact. Agents pull these in only when the task needs them.

More on the bench

SKILL▲0

Security Threat Model

Write a STRIDE-based threat model for a service or feature. Use when asked to produce a threat model, document security risks, identify attack vectors, assess a service's security posture, or prepare for a security design review. Produces a structured threat model covering assets, trust boundaries, STRIDE threat enumeration per component, risk scores, mitigation controls, and residual risk sign-off.

software-engineering+1
⊙ 29
SKILL▲0

Pr Review Expert

Use when the user asks to review pull requests, analyze code changes, check for security issues in PRs, or assess code quality of diffs.

software-engineering+2
⊙ 2
SKILL▲0

Secure Code Guardian

Use when implementing authentication/authorization, securing user input, or preventing OWASP Top 10 vulnerabilities — including custom security implementations such as hashing passwords with bcrypt/argon2, sanitizing SQL queries with parameterized statements, configuring CORS/CSP headers, validating input with Zod, and setting up JWT tokens. Invoke for authentication, authorization, input validation, encryption, OWASP Top 10 prevention, secure session management, and security hardening. For pre-built OAuth/SSO integrations or standalone security audits, consider a more specialized skill.

software-engineering+1
⊙ 1