Deterministic enforcement and cryptographic evidence for AI agent actions
Project description
Stipul
Your agents act. Can you prove what they did?
What Stipul does
Stipul is a runtime authorization and evidence layer for AI agents. It intercepts tool calls, enforces policy, and produces a cryptographic proof chain around each decision. Writ enforces the Charter, records every decision in the Chronicle, and produces a cryptographic Seal. One command shows enforcement, evidence, verification, and tamper detection.
See it work
pip install stipul
stipul demo proof
═══ Stipul Proof Demo ═══
Session: proof-demo
seq 1 allow filesystem.read reason: allowed_tool
seq 2 deny web.search reason: not_in_egress_allowlist
seq 3 deny shell.exec reason: never_allow_tools
seq 4 close session_close
Trust: VERIFIED
Chain: INTACT
Seal: VALID
Decisions: 3
Fingerprint: proof-demo | INTACT | VALID | 3 decisions | ca7fe08a
═══ Tamper Challenge ═══
To test tamper detection, modify the sealed evidence:
(Verify will show the internal session ID, not "proof-demo". This is the same session.)
1. Open: /tmp/stipul-proof-demo-6htukemj/session/seal.json
2. Find the field "terminal_sequence_id"
3. Change its value (e.g., change 4 to 999)
4. Save the file
5. Run: stipul verify /tmp/stipul-proof-demo-6htukemj/session
Watch Trust: VERIFIED become Trust: REJECTED.
Proof complete: enforcement decisions recorded, chained, and sealed.
Follow the tamper challenge, rerun stipul verify, and watch the trust verdict flip.
This demo runs locally with no external dependencies or framework integration.
Architecture
Writ intercepts tool calls at the runtime boundary and applies policy before execution.
Charter defines what an agent is allowed to do, expressed as declarative rules.
Chronicle records every enforcement decision as a tamper-evident event chain.
Seal binds the recorded evidence to a cryptographic attestation that verification can check.
When you need this
If a support agent can read local files and call web tools, you need a record showing which reads were allowed, which outbound requests were denied, and whether that evidence changed after the run. If a coding agent can touch the filesystem and invoke shell commands, you need policy enforcement and a sealed session trail before you let it operate in CI or against a shared repository. If an internal ops agent can inspect tickets, secrets, or deployment tooling, you need verification that the observed tool trace is the same one the runtime authorized.
Claude Code Integration
Use Stipul to put Claude Code in read-only review mode — allow file reads, block writes and shell commands, verify the session afterward with a sealed receipt.
See the full walkthrough: Claude Code Quickstart
Links
PyPI: https://pypi.org/project/stipul/ GitHub: https://github.com/miadco/stipul
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file stipul-0.1.1.tar.gz.
File metadata
- Download URL: stipul-0.1.1.tar.gz
- Upload date:
- Size: 168.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8fe98cfdabafde37f6445dd2eed7a965a9b5e1b5efd5be9aabb90c6aa56cad1c
|
|
| MD5 |
db3cae609af7bc93690c7d0a87020e01
|
|
| BLAKE2b-256 |
bb1abeb6dca8d5fd37b039b14c5c886dd414d363cc0c0fb2c878c3386bd25f20
|
File details
Details for the file stipul-0.1.1-py3-none-any.whl.
File metadata
- Download URL: stipul-0.1.1-py3-none-any.whl
- Upload date:
- Size: 134.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b77df4388268bb9689db86f5e8e1eeff86b8a2f0a132f60eeaa6d9b35b50775d
|
|
| MD5 |
286fd84651821b60ee8cb6ed7d802518
|
|
| BLAKE2b-256 |
420ac45511cca3c1081db50ee72e41278002c99100f2a554d410e064cc1ea156
|