Provenance · Audit ledger

Cryptographic audit ledger

Every change to the dataset is committed to an append-only, SHA-256 hash-chained log. Each dated entry hashes the entire published dataset and links to the previous entry's head, so altering any past figure — or the order in which we recorded it — breaks every entry after it. Priority of discovery becomes something you can verify, not just trust.

Chain length
140
Tracking since
June 2026
Last entry
2026-10-20
Integrity
✓ verified

Current head

The head digest commits to all history before it. Quote it to pin the dataset's exact state on 2026-10-20.

68416918667fc7098e2776f915e0a6e9bd55b76a96bd676aa3457d4f2ddeef32

Verify it yourself

  1. Download the chain: /data/ledger.jsonl (one JSON entry per line: d, n, filesHash, prevHash, headHash).
  2. For each entry, recompute headHash = SHA256(prevHash + ":" + filesHash + ":" + d + ":" + n) and confirm it matches, and that each prevHash equals the previous entry's headHash (the first is GENESIS).
  3. To check the data itself, recompute filesHash: SHA-256 every .json file under data/products, data/sections, data/catalog, data/changes and data/snapshots, plus data/price-history.jsonl, join as path:sha lines sorted, and SHA-256 the result. The first four stores are flat; data/snapshots nests one level (data/snapshots/<scope>/<date>.json), so the walk descends into subdirectories. Paths are relative to the repository root, as written here. The build script is scripts/build-ledger.mjs.
  4. The change wire's evidence — the dated captures a move was diffed from, and the change records themselves — joined the digest when the wire started publishing. Adding a store cannot alter an entry already written: each entry keeps the filesHash it was computed with, so the chain above still verifies end to end, and the new inputs take effect from the first entry appended after the change.