Skip to main content

Runtime adjudication service for agent workflows. Family-different, reasoning-stripped, multi-lens verification with replayable receipts.

Project description

日本語 | 中文 | Español | Français | हिन्दी | Italiano | Português (BR)

prism-verify logo

PyPI npm Landing Page Handbook License

prism-verify

Runtime adjudication service for agent workflows. Family-different, reasoning-stripped, multi-lens verification with replayable receipts. Landing page & handbook →

Install

Install the prism CLI (and the HTTP service) on your PATH:

uv tool install prism-verify        # or: pipx install prism-verify

Zero Python? Use the npm launcher (downloads + SHA256-verifies a prebuilt binary):

npx @mcptoolshop/prism-verify verify --artifact @file.py --intent "..." --caller-family openai

Or add it as a library — extras: [anthropic] [openai] [google] [mcp] [http] [all]:

uv add prism-verify
# or
pip install "prism-verify[all]"

Quick start

Prism always verifies with a model family different from the caller's (Lock 1), so configure at least one alternate-family provider. Set a signing secret (or PRISM_DEV=1 for local play) so receipts can be written:

export PRISM_SIGNING_SECRET="$(openssl rand -hex 32)"
export ANTHROPIC_API_KEY="sk-ant-..."   # alt-family verifier for an OpenAI-family caller

prism verify \
  --artifact @myfile.py \
  --intent "Sort a list in O(n log n)" \
  --caller-family openai \
  --provider anthropic

Architecture

Prism enforces four architectural locks at the API contract:

  1. Family-different — caller's model family is always excluded from verification
  2. Reasoning-stripped — producer CoT is stripped before crossing the family boundary
  3. Multi-lens — at least 3 independent lenses run in parallel
  4. Submodularity-aware — refuses if lenses agree too much (collapsed signal)

HTTP service

Run prism as an HTTP service (needs the [http] extra):

prism serve --host 127.0.0.1 --port 8000      # OpenAPI docs at /docs
Endpoint What it does
POST /verify Verify an artifact (same contract as the CLI). Blocks within the budget; Prefer: respond-async + a webhook URL → 202, verdict delivered to the (signed) webhook.
GET /replay/{receipt_id} The signed receipt + signature_valid.
POST /verify-receipt Verify a standalone receipt (cross-tool).
GET /healthz Liveness + configured verifier families (no auth).

Set API keys (hashed at rest) — prism is fail-closed, so /verify is refused until keys are configured or you opt into local no-auth:

export PRISM_API_KEYS="<sha256(key1)>,<sha256(key2)>"   # callers send: Authorization: Bearer <key>
export PRISM_WEBHOOK_SECRET="<random>"                  # to sign async/escalate webhook deliveries
# local dev only:
export PRISM_HTTP_ALLOW_NO_AUTH=1

Errors are RFC 9457 application/problem+json; POST /verify honours an Idempotency-Key header and a per-key rate limit (429 + Retry-After). Async/escalate webhooks are Standard-Webhooks-signed, SSRF-guarded (no internal/metadata targets), retried, and carry a named cancel-event compensator.

Receipts & signing (Ed25519, verifiable by anyone)

Every verification produces a signed, replayable receipt in ~/.prism/receipts.db. v0.4 signs new receipts with Ed25519 (RFC 8032) by default, so a different tool can verify a prism receipt with prism's public key — no shared secret:

prism keygen --out ~/.prism/signing_key.pem    # generate an Ed25519 keypair
export PRISM_SIGNING_KEY=~/.prism/signing_key.pem
prism pubkey                                    # publish this public key + kid to consumers

# a consumer (e.g. role-os) verifies a receipt with ONLY the public key:
prism verify-receipt receipt.json --public-key prism-pub.pem

The signature covers the verdict, the pre/post-strip artifact hashes, the verifier model, the submodularity matrix, the per-lens prompt hashes (byte-for-byte replayable), the citation retrieval pins, and the signing alg/kid. Legacy HMAC receipts still verify (set PRISM_SIGNING_SECRET); PRISM_DEV=1 mints a dev key for local play. Prism refuses to start the verify / replay / serve / MCP paths if no key is configured, rather than silently signing with a publicly known key.

Manage stored receipts with the compensator commands:

prism receipt delete <receipt_id>
prism receipt prune --older-than 90d --yes

Security & privacy

  • Threat model. Prism reads the artifact + intent you pass and the verifier models' responses, and writes signed receipts to a local SQLite DB. It does not read your source tree, environment, or credentials beyond the provider API keys you supply via environment variables. Receipt signatures give third-party verifiability (Ed25519: a consumer verifies with the public key, no shared secret) but are not tamper-proof against a local-root attacker who can read the on-disk private key — that's the same ceiling as the HMAC secret. For genuine tamper-resistance, hold the key in an HSM and anchor receipts in a transparency log (the named hardening path).
  • HTTP surface. prism serve binds loopback by default, is fail-closed (no /verify without API keys), hashes keys at rest, and SSRF-guards caller-supplied webhook URLs (no internal/link-local/metadata targets). It runs caller-supplied artifacts through a model; an artifact may attempt prompt injection but cannot change the verdict schema or exfiltrate prism's provider keys.
  • No telemetry. Prism sends requests only to the model providers you configure (Anthropic / OpenAI / Google / local Ollama). Nothing else.
  • Full policy: SECURITY.md.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

prism_verify-0.4.2.tar.gz (2.6 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

prism_verify-0.4.2-py3-none-any.whl (73.1 kB view details)

Uploaded Python 3

File details

Details for the file prism_verify-0.4.2.tar.gz.

File metadata

  • Download URL: prism_verify-0.4.2.tar.gz
  • Upload date:
  • Size: 2.6 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for prism_verify-0.4.2.tar.gz
Algorithm Hash digest
SHA256 7917de1c0598425940f2c03aa3d0380d5e7f30cb5fd5b1e6cb3735f2dad7fbd7
MD5 d6d8e56fba5b2fb29e884a983bd59b6c
BLAKE2b-256 0066d53fd7aef09ea132d5474f5aad06ab93270d1252fc41fe6d7e1df7a6b9bc

See more details on using hashes here.

Provenance

The following attestation bundles were made for prism_verify-0.4.2.tar.gz:

Publisher: release.yml on mcp-tool-shop-org/prism-verify

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file prism_verify-0.4.2-py3-none-any.whl.

File metadata

  • Download URL: prism_verify-0.4.2-py3-none-any.whl
  • Upload date:
  • Size: 73.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for prism_verify-0.4.2-py3-none-any.whl
Algorithm Hash digest
SHA256 e883e5062c898fbd09c757c07af79a7055219e5af76e755de74a53b4fa977ee4
MD5 1b1f482ee27dd73c1b75fd53c273782c
BLAKE2b-256 1229ef9df1e448ff9d3c17be61b99f1b47dac6bc6341ecac9b9da1c753782737

See more details on using hashes here.

Provenance

The following attestation bundles were made for prism_verify-0.4.2-py3-none-any.whl:

Publisher: release.yml on mcp-tool-shop-org/prism-verify

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page