Docs

recovea-chain-v1

SHA-256 over fourteen fields in a published order, joined with U+001F. Each row hashes the row before it.

Field order

1. recipe_id
2. previous_hash
3. request_id
4. timestamp_ms
5. provider
6. model
7. route
8. tokens_in
9. tokens_out
10. tokens_cached
11. cost_micro_usd
12. price_list_version
13. basis
14. mandate_id

The first two inputs are the recipe id and the previous row’s hash; the remaining twelve are receipt fields.

Genesis

0000000000000000000000000000000000000000000000000000000000000000

The first row in a chain uses sixty-four zeros as its previous hash.

Canonicalisation

  • The hash input is the UTF-8 bytes of the fields in order, joined by U+001F.
  • The row hash is lowercase-hex SHA-256 of that input, and is never part of its own input.
  • Integers are base-10 decimal strings with no leading zeros.
  • timestamp_ms is Unix epoch milliseconds as a base-10 integer string.
  • cost_micro_usd is integer microdollars; 1000000 is one dollar.
  • The provider value is lowercased with separators removed, so open_ai hashes as openai.
  • basis is measured or applied. It is never verified in v1.
  • An absent mandate_id is the empty string.
  • lever and row_hash are not hash inputs.

Check it

The sample month’s ledger runs live on the proof page, re-derived in your own browser. Alter one field of one row there and watch every hash after it break.