Observed since 20 Oct, 23:00 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Cryptographically signed, tamper-evident audit logs for autonomous agents
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.
pip install agentproofchain
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()
Generate a key:
agentproof keygen
# AGENTPROOF_SIGNING_KEY=<base64 string>
agentproof resolves a signing key in this order:
signing_key= passed directly to a function call (raw bytes or base64 str)AGENTPROOF_SIGNING_KEY environment variable (base64) — works on
platforms with no persistent filesystem (Render, Fly, Lambda, etc.)keyfile= passed directly (path to a JSON file: {"secret": [...]}
or a raw JSON array of 32 ints)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.
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
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
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.
MIT
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.1.0 | 14 Aug 2026 | 1 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 23:00 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:f024a9c68fc56f1e763fac876cde68d3beb14398f17f9b3d94217ed5e447dca6