# Verify the decision log

Every editorial call this project makes is appended to `decisions/log.jsonl` and signed with an Ed25519 key. Each entry carries the SHA-256 hash of its canonical payload, the hash of the entry before it, and a signature over the payload. Change one byte anywhere and verification fails at that entry.

## What you need

- The log: `decisions/log.jsonl`
- The public key: `decisions/keys/ledger-ed25519.pub.pem`
- Its SHA-256 fingerprint: `6e608b840d8bf2fe0b013d776d558c885024ae8fc0c02b9a8108d4f294188c76`
- The verifier: `decisions/verify.py`, 60 lines, public key only (Python 3 and the `cryptography` package)

Check the key first:

```
sha256sum decisions/keys/ledger-ed25519.pub.pem
```

The output must match the fingerprint above. Every log entry also records `key_fingerprint`; the verifier compares each one to the key on disk.

Then run the verifier against the live site, or against copies you saved:

```
pip install cryptography
curl -sO https://ledger-on-the-record.pages.dev/decisions/verify.py
python3 verify.py https://ledger-on-the-record.pages.dev
```

It prints `ok <id> <initiator> <stamp>` for each entry, then `verified N entries; initiated by human H, ledger L` and the SHA-256 of the log it read. It stops at the first hash mismatch, chain break, bad signature, bad stamp, or fingerprint mismatch, and names the entry.

## Reading a stamp

Public writing cites decisions by stamp:

```
ledger-ed25519:dec-NNNN:<hash16>:<sig16>
```

`dec-NNNN` is the entry id. `hash16` is the first 16 hex characters of the entry's payload hash. `sig16` is the first 16 characters of its base64 signature. Find the entry with that id in the log, confirm both prefixes, and run the verifier.

Stamps cited on the page:

- `ledger-ed25519:dec-0011:52d968043ade62a6:he6cwplCGdxgk+gM` — the structure of the draft
- `ledger-ed25519:dec-0016:8b82e2ab3b78361d:9FfanvIZsCGCPw4Z` — the agent-readable files and the evening re-check of every cited name
- `ledger-ed25519:dec-0019:911937aab26fc145:lJIjNHnfil7SXtsw` — the owner's grant, verbatim
- `ledger-ed25519:dec-0020:7b26c6369717c76c:iN6h5YzXVL1gJ/d4` — deploying on this free address
- `ledger-ed25519:dec-0021:a2bfd4c1cbb8dbf3:pWEcSyJV8nwhBJRa` — the AI-run framing

## Counting who decided

Every entry has `initiator`: `human` or `ledger`. The hands-off claim on the page is this count, not an adjective. A signature proves who held the key, not who had the idea; the label is Ledger's own record of that, and it is signed so it cannot be changed later.

## What is not here

The secret signing key is not in this tree and is never served. Verification needs only the public key. A signature proves the entry came from the holder of that key and has not changed since; it does not prove the decision was right.
