Metadata-Version: 2.5
Name: runback-verify
Version: 2.1.0
Summary: Verify tamper-evidence and integrity of Runback audit cassettes (runback.cassette/v1). No account required, no dependencies.
Project-URL: Homepage, https://runback.dev
Project-URL: Specification, https://runback.dev/spec
Project-URL: Source, https://github.com/letsRunback/runback
Author-email: Runback <contact@runback.dev>
License-Expression: MIT
Keywords: ai-agents,audit,cassette,ed25519,eu-ai-act,governance,runback,tamper-evident,verification
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Legal Industry
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Security :: Cryptography
Classifier: Topic :: Software Development :: Quality Assurance
Requires-Python: >=3.9
Description-Content-Type: text/markdown

# runback-verify

Verify the integrity of a Runback audit record — offline, with nothing installed.

```bash
pip install runback-verify
runback-verify record.json
```

```python
from runback_verify import verify_json

result = verify_json(open("record.json").read())
print(result["verdict"])   # "valid" | "unverified" | "invalid"
```

## Zero dependencies, on purpose

This package is separate from `runback-sdk` because the SDK needs `requests` and
`python-ulid` to do its job, and an auditor needs neither. Ed25519 verification
is implemented here from RFC 8032 in plain Python, so the package installs and
runs on a stock interpreter in a locked-down environment.

## What the verdicts mean

| verdict | meaning |
|---|---|
| `valid` | integrity holds **and** the signer is a key you pinned |
| `unverified` | self-consistent, but the origin is unproven |
| `invalid` | something failed — it is not the record it claims to be |

The chain algorithm is public, so anyone can author a self-consistent record
from nothing, or edit a real one and re-chain it. Integrity alone proves only
internal coherence; provenance is a separate question, answered only by a
signature that verifies against a key you pinned **out of band**.

Exit codes: `0` valid, `1` invalid, `2` unverified.

## The format

`runback.cassette/v1` is specified at <https://runback.dev/spec>. The reference
implementation is [`@runback/verify`](https://www.npmjs.com/package/@runback/verify)
on npm; this package is a port held to the same generated conformance fixture,
and where the two disagree the reference is authoritative.
