{"product":"coil-board-proof","algorithm":"sha256","commitments":[{"date":"2026-07-13","sha256":"967604ab107ebc6d3e2dcd8312a4f83479b3fd971d5de4e8cd870a7fbfc46681","names":563},{"date":"2026-07-14","sha256":"1ac36897ac0538224781f933c8cff9bbb41235d474df56ac6d7d4db07a85ef0c","names":563},{"date":"2026-07-15","sha256":"79e3ca7c431d2338b87a2b5316e0b67c4af32147f630163dce01fb4a900cc659","names":563},{"date":"2026-07-16","sha256":"af28b04675e4486678d30fc8f3b55236d25b60e4c0b97ceb8d7fb1fbb8742286","names":565},{"date":"2026-07-17","sha256":"0c0ea456419e53903f9b56cae54d63f7059106f96d6710a222ee86048cc3ce67","names":565},{"date":"2026-07-20","sha256":"999b85ce18bba166757f9e28167c8b643e6c472e6163da4ac03c5553b1b6d648","names":565},{"date":"2026-07-21","sha256":"ea9a060eaae62e35cbdf66ff5b5a4c14c8b066330b0e90b6c2f5cefa326d9ef3","names":565},{"date":"2026-07-22","sha256":"4e384cd504ceb20a5a0db3748e5ca790cc28362cb3ea9d4cc28e044973b20b35","names":565},{"date":"2026-07-23","sha256":"d7d3207567dcc845bb24b6aeca46e97aae7fc682b35e739d214e5acb090feaea","names":565},{"date":"2026-07-24","sha256":"72e1040542dac612c0c5ddb9e982d86abc561fbe247b4af735869916e0fa78b7","names":565},{"date":"2026-07-27","sha256":"612340d0d8dbae59750e381bdfb8576ce72ae5d37430be8087f124a7cc3b6a57","names":565},{"date":"2026-07-28","sha256":"bc8fc1eb1250d7920c390581befbd78dd4bb444ae26a85d31e63564d830c3343","names":565},{"date":"2026-07-29","sha256":"7bc47e7611f201204899bf0f1cd24c3b0e8f8133e041ca67e1805d27c09a9b4f","names":565}],"count":13,"convention":"Append-only. Each entry is the sha256 of that day's published board as it was served. Corrections append a new entry referencing the prior date; nothing is ever rewritten or removed. A hash published before the outcome was known cannot be back-fitted, which is the point.","archive":"https://coil.trade/api/board/asof?date=YYYY-MM-DD","verify":{"basis":"sha256 over the UTF-8 bytes of {\"date\":<date>,\"names\":<names>} taken from the /api/board/asof?date= payload, serialised as canonical JSON.","canonical_json":["keys sorted recursively","no whitespace between tokens","a number equal to its integer value is written WITHOUT a decimal point (40, not 40.0)"],"note":"The integer rule exists so Python and JavaScript produce identical bytes. Both implementations below are tested against the published digests."},"verify_example":{"python":"import json,hashlib\ndef norm(x):\n    if isinstance(x,bool): return x\n    if isinstance(x,float) and x==int(x): return int(x)\n    if isinstance(x,dict): return {k:norm(v) for k,v in x.items()}\n    if isinstance(x,list): return [norm(v) for v in x]\n    return x\nbody=json.dumps(norm({'date':p['date'],'names':p['names']}),separators=(',',':'),sort_keys=True).encode()\nprint(hashlib.sha256(body).hexdigest())","javascript":"const sortDeep=v=>Array.isArray(v)?v.map(sortDeep):(v&&typeof v===\"object\")?Object.fromEntries(Object.keys(v).sort().map(k=>[k,sortDeep(v[k])])):v;\nconst body=JSON.stringify(sortDeep({date:p.date,names:p.names}));\ncrypto.createHash(\"sha256\").update(Buffer.from(body,\"utf8\")).digest(\"hex\")"}}