Each line is canonical JSON: either ReceiptV1 (v: "0.1") or ReceiptV2 (v: "0.2") — see Receipt V1 and Receipt V2. Parse with parseReceiptAny when you need to accept both. Constraints:
  • One writer per agent.
  • Append-only.
  • nonce gapless from 0.
  • prev_receipt_hash[N] = receipt_hash[N-1]; prev_receipt_hash[0] = null.
  • receipt_hash = sha256(canonicalJson(receipt without receipt_hash)).