@veritasacta/verify
v0.2.0
Published
CLI tool to verify signed artifacts (receipts, manifests, tickets). Works offline.
Maintainers
Readme
@veritasacta/verify
Verify signed artifacts offline. No accounts. No API calls. No ScopeBlind dependency.
MIT licensed. Works offline. Requires zero trust in ScopeBlind or anyone else.
Prove It
npx @veritasacta/verify --self-test@veritasacta/verify — self-test
✓ Sample receipt: VALID (decision_receipt, kid: kPrK_qmx...)
✓ Sample bundle: VALID (3/3 receipts)
All self-tests passed. The verifier is working correctly.
No ScopeBlind servers were contacted. No accounts required.That's it. The verifier works. Now verify your own receipts:
Usage
# Verify a receipt with a known public key
npx @veritasacta/verify receipt.json --key d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a
# Verify a receipt, fetching key from JWKS
npx @veritasacta/verify receipt.json --jwks https://example.com/.well-known/jwks.json
# Verify an audit bundle (receipts + embedded keys)
npx @veritasacta/verify bundle.json --bundle
# Read from stdin (for piping)
cat receipt.json | npx @veritasacta/verify --stdin
# Machine-readable output (for CI/scripting)
npx @veritasacta/verify receipt.json --key <hex> --jsonWhat Gets Verified
The verifier:
- Strips the
signaturefield from the artifact - Canonicalizes the remaining JSON (sorted keys, deterministic — JCS-style)
- SHA-256 hashes the canonical bytes
- Verifies the Ed25519 signature against the hash using the public key
If the signature is valid, the artifact has not been tampered with since signing.
Supported Formats
| Format | Detection |
|--------|-----------|
| v2 artifact | { v: 2, type, algorithm, kid, signature, ... } |
| v1 artifact | { algorithm, signature, hash, ... } |
| Passport SignedEnvelope | { payload, signature: { alg, kid, sig } } |
| Audit bundle | { receipts: [...], verification: { signing_keys: [...] } } |
Options
| Flag | Description |
|------|-------------|
| --key, -k <hex> | Ed25519 public key (64 hex chars) |
| --jwks <url> | JWKS endpoint URL for key discovery |
| --bundle | Verify all receipts in an audit bundle |
| --stdin | Read artifact from stdin |
| --json | Machine-readable JSON output |
| --verbose, -v | Show detailed verification info |
| --self-test | Verify bundled sample artifacts |
| --help, -h | Show help |
Exit Codes
0— signature valid (all artifacts valid for bundles)1— signature invalid, missing key, or error
Where Do Receipts Come From?
Receipts are generated by protect-mcp, which wraps MCP tool servers and signs every decision (allow, deny, rate-limit, require_approval) as a v2 artifact.
# Generate receipts
npx protect-mcp --policy policy.json -- node your-mcp-server.js
# Later, verify them
npx @veritasacta/verify receipt.json --key <gateway-public-key>Conformance Testing
# Run the full conformance test suite (20 tests)
npm testTests verify:
- All known test vectors pass (4 vectors with hash match)
- Tampered artifacts are correctly rejected
- Wrong public keys are correctly rejected
- Sample receipt and bundle verify
- Format detection works
Why Trust This?
- MIT licensed — no restrictions, no vendor lock-in
- Open schemas — the artifact format is public
- Test vectors — deterministic keypairs with known-good signatures
- Works offline — no API calls, no accounts, no ScopeBlind servers
- Verification is independent — you don't need to trust ScopeBlind
Any platform can log what its agents do. Very few will let you verify those logs without trusting them.
License
MIT — veritasacta.com
