Skip to main content
An attestation proves that a device signed some bytes. An operation record makes those bytes useful: a structured, canonical JSON line describing one unit of the machine’s work, such as one vend, one pick, or one soil reading, where the attested 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.
A plugin package can ship its schema as 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 calls monad_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.
For example, both of these inputs:
produce the same stored and signed line:
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 host stores exactly the fields the builder declared, and nothing else. It does not add chat ids, wallet addresses, Telegram usernames, or access codes. Do not declare fields for personal data. Anything in a record can end up in a listed dataset.
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 compute keccak256(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.