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_idThe first two inputs are the recipe id and the previous row’s hash; the remaining twelve are receipt fields.
Genesis
0000000000000000000000000000000000000000000000000000000000000000The 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.