signed-agent-receipts
signed-agent-receipts is a small local POC for signed Agent Run Ledger receipts plus a Computer-Use QA Pack. It scans local agent runtime traces when present, normalizes them into versioned JSONL records, signs them with Ed25519, and renders Markdown receipts that a human can review without reading a full transcript.
Durable generated outputs default to a neutral local config path:
~/.config/signed-agent-receipts/output
Commands
Requires Python 3.10+.
Install locally:
python -m pip install .
# or
pipx install .
Packaging note: the PyPI distribution and installed CLI command are signed-agent-receipts; the Python import package remains agent_receipts for stable module imports.
Normalize recent local runs:
signed-agent-receipts normalize --limit 10
Render Markdown receipts:
signed-agent-receipts render --jsonl ~/.config/signed-agent-receipts/output/agent_run.jsonl
Run the end-to-end POC:
signed-agent-receipts dogfood --limit 10
Verify signed JSONL receipts:
signed-agent-receipts verify --jsonl ~/.config/signed-agent-receipts/output/agent_run.jsonl
Run tests:
python -m unittest
What It Scans
The normalizers are heuristic and defensive. Missing or unreadable sources are skipped or represented as warning records instead of crashing.
- Hermes:
~/.hermes, including readable SQLite, JSON/JSONL, and log/text files. - Codex:
~/.codex. - Claude Code:
~/.claude/projects.
For tests or local fixture runs, set:
AGENT_RECEIPTS_HOME=/tmp/fixture-home
AGENT_RECEIPTS_WORKSPACE=/tmp/fixture-workspace
Analytics
The CLI is instrument-ready for PostHog without adding a runtime dependency. Set a project-scoped key to enable capture; leave it unset for a complete no-op:
POSTHOG_KEY=phc_... python -m agent_receipts dogfood
# Optional; defaults to https://us.i.posthog.com
POSTHOG_HOST=https://us.i.posthog.com
Emitted events currently include agent_receipts_cli_started,
agent_receipts_normalized, agent_receipts_rendered, and
agent_receipts_dogfood_completed.
Signing
Every JSONL receipt written by the CLI is signed with Ed25519 over canonical
JSON: UTF-8 JSON with sorted keys and compact separators, excluding the
signature field itself. Markdown receipts include the same signature metadata
in a Signature section.
The default private key path is:
~/.config/signed-agent-receipts/ed25519_private.pem
The key is created automatically with 0600 permissions on first use. Override
the path with either --signing-key /path/to/ed25519_private.pem or
AGENT_RECEIPTS_SIGNING_KEY=/path/to/ed25519_private.pem. Local private-key
filenames are gitignored by default; do not commit private keys.
Schema Summary
Records are JSONL objects using schema_version: agent-run-ledger.v1. The schema lives at schema/agent_run.schema.json and includes:
- identity: run ID, runtime, source path, actor, profile, session, title
- timing: started, ended, duration
- normalized content: inputs, tool calls, file diffs, URLs
- QA support: evidence with local file hashes when available, costs, policy flags
- traceability: receipt path and raw source references
- signature: Ed25519 public key, key ID, canonicalization, and signature value
Evidence
The POC discovers recent local image files only from causally scoped roots such as the workspace and output directory, computes SHA-256 for local evidence, and records provenance for every evidence item. Shared caches such as ~/.hermes/cache/screenshots are not backfilled into unrelated runs; time-window matches are marked as heuristic.
Current Limitations
- Source formats are inferred, not runtime-specific contracts.
- SQLite support samples likely session/run/log tables but does not understand every vendor schema.
- Cost and token data are only populated when present in source traces.
- Markdown receipts are static review artifacts; they do not provide approval workflow state.
- JSON Schema validation is documented but not enforced at runtime.
Metadata
Release files for signed-agent-receipts 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| signed_agent_receipts-0.1.0.tar.gz | 26.1 kB | Without provenance | Details for signed_agent_receipts-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| signed_agent_receipts-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for signed_agent_receipts-0.1.0-py3-none-any.whl |
Total release size: 50.1 kB
Release files / signed_agent_receipts-0.1.0.tar.gz
| Download URL | signed_agent_receipts-0.1.0.tar.gz |
|---|---|
| Size | 26.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9ebbc49ab79ad7b41074f5ec234749f511373fc2b55d483cd87776d2efe9b14f
|
|
BLAKE2b-256 checksum How to use checksums |
d956d055198e627b47b47046ac8b14af8ab785469e549549b71b9aeeb512cc0a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.6
|
Release files / signed_agent_receipts-0.1.0-py3-none-any.whl
| Download URL | signed_agent_receipts-0.1.0-py3-none-any.whl |
|---|---|
| Size | 24.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
be961d9105a7236c1258914bb4b22fe44ccbbdfd5abeb47a4143a8fa2346d613
|
|
BLAKE2b-256 checksum How to use checksums |
4f52b7d78aa3b04676a503a734b52f7e94590e57c00e04d57b25a2ebfef34836
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.6
|
Security for signed-agent-receipts 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.
To learn more about protecting yourself from malicious actors, visit our package security documentation.