# CAIN-42 Independent Verification Pack

A small, self-contained pack that lets a reviewer reproduce CAIN-42's public evidence
**without trusting CAIN's servers or running CAIN's code**. Read every script before running
it; none requires root, none executes a remote installer, none uploads anything, and none
sends telemetry.

## Contents

| File | Purpose | Class |
|---|---|---|
| `verify_all.py` | Runs every offline check and prints a verdict. | OFFLINE |
| `verify_pbft_qc_bundle.py` | Standalone PBFT quorum-certificate verifier (no CAIN imports). | OFFLINE |
| `PBFT_QC_BUNDLE.json` | Sanitized sample quorum certificates from a disposable 4-node cluster. | OFFLINE |
| `verify_hourly_proofs.py` | Verifies the hourly signed proof chain. | OFFLINE / ONLINE |
| `verify_soak.py` | Verifies soak checkpoint signatures and hash-chaining. | OFFLINE / ONLINE |
| `formal/` | TLA+ models and raw TLC results; `reproduce.sh` re-runs TLC. | OFFLINE (TLC tool) |
| `requirements.txt` | Pinned Python dependency (`cryptography`). | — |
| `MANIFEST.json` | SHA-256 of every file in this pack. | — |
| `README.md` | This file. | — |

## Run

```
python3 -m pip install -r requirements.txt
python3 verify_all.py            # offline checks only
python3 verify_all.py --online   # also fetch read-only public endpoints
```

## What reproduction proves — and what it does not

- **Proves:** the published bytes are internally consistent, the Ed25519 signatures verify
  against the published keys, quorum thresholds are actually enforced, hash-chains are
  contiguous, and deliberately tampered fixtures are rejected.
- **Does not prove:** that the operator is trustworthy, that the keys were not
  self-generated, that the machines are independent, that the implementation is correct, or
  that the live deployment is healthy. Those cannot be established by a third party from
  signed evidence alone.

## IP / disclosure policy

This pack contains **verification** artefacts only. CAIN's proprietary implementation source
is withheld as a trade secret; there is no public git remote. That limits full reproduction
of the platform (for example, re-running the 1,978-test suite) and the limitation is stated
in `../known-limitations.md`.

## Check classification

- **OFFLINE:** runs with no network.
- **READ-ONLY ONLINE:** unauthenticated HTTP GET against a public endpoint.
- **SOURCE REQUIRED:** cannot be reproduced without the withheld repository.
- **SIDE-EFFECTING / DISRUPTIVE:** requires explicit operator approval; not included.
