{"version":"sensebeen-ledger-v1","storage":"Append-only JSON Lines, one entry per line, seq starting at 0.","entry_hash":{"hash_function":"SHA-256","output":"lowercase hex, 64 characters","input":"UTF-8 bytes of the canonical JSON of the hashed fields","hashed_fields":["category","content_sha256","created_at","event","label","node_region","path_hash","pq_alg","pq_key_id","pq_sig_b64","pq_statement","prev_hash","public","size_bytes"],"excluded_fields":["seq","entry_hash"],"serialization":{"format":"JSON object containing exactly the hashed_fields","key_order":"lexicographic by UTF-16 code unit (JavaScript default sort), which is the hashed_fields order above","whitespace":"none","strings":"JSON.stringify escaping: quote, backslash and control characters escaped, other characters as raw UTF-8","numbers":"size_bytes is a JSON integer","booleans":"true or false","nulls":"null (pq_alg, pq_key_id, pq_statement, pq_sig_b64 are null when there is no co-signature)"},"field_types":{"category":"string","content_sha256":"lowercase hex sha256 of the file bytes","created_at":"ISO 8601 UTC with microseconds, ending in Z","event":"created | written | deleted | signed | manual","label":"string","node_region":"string","path_hash":"lowercase hex sha256 of the vault path (the path itself is never stored)","pq_alg":"string or null","pq_key_id":"string or null","pq_sig_b64":"base64 string or null","pq_statement":"string or null","prev_hash":"entry_hash of seq - 1, or 64 zeros for seq 0","public":"boolean","size_bytes":"integer"},"jq_one_liner":"jq -cjS '.entry | del(.seq, .entry_hash)' record.json | shasum -a 256"},"private_entries":{"note":"A private entry's label is part of the hashed record and is visible to anyone holding the file hash, so new private entries use a generic label. Signer identity details are never stored in the ledger."},"chain":{"genesis_prev_hash":"0000000000000000000000000000000000000000000000000000000000000000","rule":"entry[n].prev_hash == entry[n-1].entry_hash; entry[0].prev_hash is 64 zeros"},"pq_cosignature":{"alg":"ML-DSA-65","status":"in testing","statement_format":"sensebeen-{esign|proof}-v1\\nsha256:{content_sha256}\\ntime:{created_at}\\n","public_key":"/api/ledger/pubkey","public_keys":"/api/ledger/pubkeys","key_selection":"Verify each entry with the key from /api/ledger/pubkeys whose key_id equals the entry's pq_key_id."},"anchoring":{"method":"OpenTimestamps","digest":"entry_hash of the covering entry (32 bytes)","rule":"An anchor on seq N covers every entry with seq <= N through the prev_hash chain.","proof_download":"/api/ledger/anchors/{seq}.ots","verify_command":"ots verify -d {covering_entry_hash} sensebeen-ledger-{seq}.ots"},"endpoints":{"verify":"/api/ledger/verify/{content_sha256}","chain":"/api/ledger/chain","spec":"/api/ledger/spec","pubkeys":"/api/ledger/pubkeys"}}