Skip to main content

agentproof

Cryptographically signed, tamper-evident audit logs for autonomous agents.

As more tools let AI agents run code, call APIs, and modify files autonomously, there's usually no way to verify — after the fact, or from outside the agent's own self-report — what it actually did. agentproof gives any agent a way to sign every action it takes into a hash-chained log, so the record can be independently verified by anyone, without trusting the agent's own summary of events.

Each log entry is signed with Ed25519 and references the SHA-256 hash of the entry before it. Editing, deleting, or inserting an entry breaks the chain in a way verify() will always catch.

Install

pip install agentproofchain

Quick start

from agentproof import sign_event, verify_log

sign_event(
    "agent.log",
    "tool_call",
    {"tool": "read_file", "args": {"path": "config.yaml"}},
)

ok, message = verify_log("agent.log")
print(ok, message)  # True, "1 entries verified, chain intact"

Or with the class wrapper, if you're signing many events against the same log and key:

from agentproof import ProofChain

chain = ProofChain("agent.log", signing_key=my_key_bytes)
chain.sign_event("tool_call", {"tool": "run_bash", "cmd": "pytest"})
chain.sign_event("model_decision", {"chose": "retry", "reason": "timeout"})
ok, msg = chain.verify()

Keys

Generate a key:

agentproof keygen
# AGENTPROOF_SIGNING_KEY=<base64 string>

agentproof resolves a signing key in this order:

  1. signing_key= passed directly to a function call (raw bytes or base64 str)
  2. AGENTPROOF_SIGNING_KEY environment variable (base64) — works on platforms with no persistent filesystem (Render, Fly, Lambda, etc.)
  3. keyfile= passed directly (path to a JSON file: {"secret": [...]} or a raw JSON array of 32 ints)
  4. AGENTPROOF_KEYFILE environment variable (path to the same format)

No placeholder key is ever silently substituted — if none of the above resolve, you get a clear ProofChainError.

Verifying someone else's log

If you didn't sign the log yourself, verify it against the signer's published public key instead of your own private key:

from agentproof import verify_log
import base64

pubkey = base64.b64decode("their-published-public-key==")
ok, msg = verify_log("their_agent.log", pubkey_bytes=pubkey)

Publish your own public key with:

agentproof pubkey

CLI

agentproof keygen                          # generate a new key
agentproof verify path/to/agent.log        # verify using your own resolved key
agentproof verify log.jsonl --pubkey B64   # verify against a specific public key
agentproof pubkey                          # print your public key to share

What this doesn't do

agentproof proves that a specific key signed a specific sequence of events, and that the sequence hasn't been altered since. It does not verify that the content of an event is true — if an agent lies about what a tool call returned and then signs that lie, the signature is still valid. Signing happens at the point your code calls sign_event, so the honesty guarantee is only as strong as what you choose to log and when.

License

MIT

Metadata

Release files for agentproofchain 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for agentproofchain 0.1.0
File Size Uploaded Provenance
agentproofchain-0.1.0.tar.gz 8.3 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for agentproofchain 0.1.0
File Interpreter ABI Platform
agentproofchain-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 16.7 kB

Release files / agentproofchain-0.1.0.tar.gz

Download URL agentproofchain-0.1.0.tar.gz
Size 8.3 kB
Tags Source
SHA-256 checksum
How to use checksums
6a05783bdcc94f7f1088ee761489d7a48fe39ef2d3bb83fdfcdfa46963c3aac4
BLAKE2b-256 checksum
How to use checksums
ec766bf49cb72aeeeda5b5f5b11a50f749c5fdf8db37d69de954989ba148e765
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.13

Release files / agentproofchain-0.1.0-py3-none-any.whl

Download URL agentproofchain-0.1.0-py3-none-any.whl
Size 8.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2adc33fb6b970e035208e7d8c876bb4c202ccf83cb42742fd4c00b14fb0892ae
BLAKE2b-256 checksum
How to use checksums
55c96f7ec33bb1d005278027c1b99f7e5b22f671316198df3fb27165fbffbded
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.13

Security for agentproofchain 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page