paramsHash is exactly the keccak256 of that line.
Records are what turn a machine’s history into a dataset a stranger can buy and verify line by line.
Declaring a schema
A builder declares the fields of an operation in the device config under[records]:
config.toml
string
required
Letters, digits, and underscores. Must not start with a digit. At most 64 characters. Unique within the schema.
string
default:"string"
One of
string, number, boolean, object, array.boolean
default:"true"
Whether every record must include this field.
records.example.toml. kinetic plugin install writes it into the device config and replaces any existing record fields. See Plugins.
With no fields declared, recording is off.
monad_attest still attests, signing the params string exactly as given, but nothing is stored and nothing can be listed.From operation to line
When the agent callsmonad_attest and a schema is configured, the host prepares the record before anything is signed.
1
Parse
params must be a JSON object. Anything else is refused.2
Check against the schema
Every key must be a declared field. Every required field must be present. Every value must match its declared type.
3
Canonicalize
Keys are sorted, recursively inside nested objects, and the object is serialized as compact JSON on a single line. Whitespace and key order in the input no longer matter.
4
Attest
The device signs an
ActionProof whose paramsHash is keccak256 of that exact line, and submits it to KineticAttestor.5
Store
Only after the transaction succeeds, the line is appended to
records/operations.jsonl, and the attestation’s request hash is appended to the sibling records/operation-requests.txt.operations.jsonl
The two files
~/.kinetic
records
operations.jsonl
operation-requests.txt
The directory is created owner-only (
0700) and both files are 0600. Writes are append-only and locked, so concurrent operations never interleave.
Privacy
The record schema is also the privacy boundary: if a value is not a declared field, the agent cannot put it in a record, because the host refuses the whole record.Listing limits
When the owner sells data, the runtime reads both files and checks them before anything leaves the device:
A file that fails any check is not listed. The full flow is in Data listing.
Why canonical lines matter
Because the signed bytes and the stored bytes are the same line, a buyer does not need to trust the seller’s export. For each line they computekeccak256(line) and compare it to the responseHash stored in the ERC-8004 Validation Registry for that row’s request hash. One edited character breaks the match.