{
  "license": "CC-BY-4.0",
  "licenseUrl": "https://creativecommons.org/licenses/by/4.0/",
  "attribution": "ChainChoice (https://chainchoice.io)",
  "url": "https://chainchoice.io/data/rankings-ledger.head.json",
  "ledger": "https://chainchoice.io/data/rankings-ledger.jsonl",
  "about": "Every change to the published order since the ledger began, one entry per line: the change lines and snapshot of each batch, why the order moved, and the rankings digest each published rankings.json had. Each entry carries the SHA-256 of the line before it, so changing or removing any entry changes every hash after it.",
  "entries": 4359,
  "head": {
    "seq": 4359,
    "hash": "6a5d1a18a02714835d27bd88465b0aadcdb6e9c5bbce24ccfe1ed510a8ea2099"
  },
  "newest": {
    "rankingsDigest": "bd9251be9ea43822deaf0888e637576ee2b8fec4d57115f9012a1ba40c6c2c08",
    "seq": 4359,
    "markerSeq": 4357,
    "state": "70ea02b9f0f0cbdb",
    "engine": "2026.10.18"
  },
  "counts": {
    "snapshots": 54,
    "changeLines": 4184,
    "causes": 54,
    "digests": 67,
    "snapshotsWithDigest": 46,
    "snapshotsNotRecomputable": 8
  },
  "observed": {
    "first": "2026-08-29",
    "last": "2026-11-04"
  },
  "entryKinds": {
    "change": "k is <category>/<product>/standing (rank, score, weightedTotal, boundBy) or <category>/_category/specVersion; snap names its snapshot.",
    "snapshot": "k is _snapshot/rankings/marker; v is the SHA-256 of the ranked state (ids, ranks, scores, weighted totals, bounds, spec versions), not the footer digest; rankingsDigest is the first footer digest recorded for that order, or null with the reason.",
    "cause": "k is _snapshot/rankings/cause; v names the kinds, the categories the batch changed and the records: methodology versions, category spec versions and data-changelog entries first published with that order.",
    "digest": "k is _snapshot/rankings/digest; v is the rankings digest of a rankings.json that held the snapshot named by markerSeq, recorded each time it changed. engine is the newest changelog version when that file was generated."
  },
  "sources": "src \"git:<sha>\" was recomputed from what that commit of the repository held, which is not a claim about what was deployed; src \"build\" was written by the build on the day in ob.",
  "causeKinds": {
    "baseline": "The first order on record: the ledger starts here, so there is no earlier order to have changed.",
    "methodology": "A methodology changelog version (/methodology/changelog) or a category spec version that changed with this order.",
    "review": "A data-changelog entry of kind refresh (/methodology/data-changelog): a value re-read from its source on review moved.",
    "correction": "A data-changelog entry of kind correction: a published value was wrong and was corrected.",
    "lifecycle": "A data-changelog entry of kind lifecycle: a product shut down, migrated or closed.",
    "universe": "A data-changelog entry of kind universe: a provider entered or left the assessed set.",
    "unrecorded": "No changelog entry published with this order names a category it changed. Nothing required one before 2026-09-06, when check-published-order-is-deliberate began failing an unexplained move."
  },
  "recipe": {
    "line": "Every line is one entry in canonical JSON: keys sorted, no spaces or line breaks, non-ASCII characters as UTF-8.",
    "chain": "seq counts from 1. prevHash is the SHA-256 (hex) of the previous line's bytes, null on the first. head.hash is the SHA-256 of the last line.",
    "digest": "SHA-256 of /data/rankings.json with its top-level generatedAt removed, written as compact JSON: every object's keys sorted, no spaces or line breaks, non-ASCII characters as UTF-8 (not escaped), no trailing newline.",
    "verifyPython": "python3 -c \"import hashlib,json,functools;L=open('rankings-ledger.jsonl','rb').read().splitlines();print(len(L),functools.reduce(lambda p,x:(lambda e:(e['seq']==x[0] and e['prevHash']==p and json.dumps(e,sort_keys=True,separators=(',',':'),ensure_ascii=False).encode()==x[1] or exit('broken at seq %d'%x[0])) and hashlib.sha256(x[1]).hexdigest())(json.loads(x[1])),enumerate(L,1),None))\"",
    "verifyNode": "node -e \"const c=require('crypto');let p=null,n=0;for(const l of require('fs').readFileSync('rankings-ledger.jsonl','utf8').split('\\n').filter(Boolean)){const e=JSON.parse(l);n++;if(e.seq!==n||e.prevHash!==p){console.error('broken at seq '+n);process.exit(1)}p=c.createHash('sha256').update(l).digest('hex')}console.log(n,p)\"",
    "findFooterDigest": "jq -c 'select(.k==\"_snapshot/rankings/digest\" and (.v|startswith(\"bd9251be9ea4\")))' rankings-ledger.jsonl"
  },
  "proves": "Anyone who saved an earlier copy of this file, or its head hash, can tell whether any entry up to that head has since been changed, removed or reordered: the chain from that entry to the head no longer verifies.",
  "doesNotProve": "The chain does not prove when an entry was written, and a reader who saved nothing cannot tell this file from a rewritten one. The signature, where present, says only that the holder of the receipt key published this head.",
  "signature": {
    "alg": "ed25519",
    "keyFingerprint": "855ac3c1851f81ed",
    "signatureHex": "68e9f569607542decc445ab81fa3a94278f9fe70baa9cd583c590ffbf4314a0300310116b2732cacb818e183b53700fdfe25906d2718f87dac7bbdea410a0c0d",
    "signedAt": "2026-11-04T06:32:47.817Z",
    "message": "rankings-ledger@4359:6a5d1a18a02714835d27bd88465b0aadcdb6e9c5bbce24ccfe1ed510a8ea2099",
    "keys": "https://chainchoice.io/api/terminal?route=receipt-keys"
  },
  "externalTimestamp": null,
  "externalTimestampNote": "Not externally timestamped: no third-party timestamp service anchors this head, so its date rests on this site alone."
}
