Skip to content

The record

The record answers four questions:

  1. What did Writ observe?
  2. Which policy checks ran?
  3. What decision did Writ make?
  4. Can another machine detect a changed export?

Writ adds one entry for each event. It does not update or delete entry rows. Entries can describe issuance, model turns, tool calls, tool results, checks, approvals, amendments, interruptions, and the terminal result.

Each entry contains its run ID, sequence number, time, actor, event, payload, checks, previous-entry hash, and entry hash.

The default redactor replaces common secret fields such as authorization, token, password, cookie, and private_key. It also removes bearer tokens, secret assignments, and private-key blocks from text.

A signed organization policy can add exact JSON Pointer rules. The replacement value is [REDACTED].

Signed rules can select only tool argument and result data. They cannot select record IDs, events, digests, approval state, call sequences, or organization policy identity. Writ validates the same restriction when it restores a pinned policy for a tool result.

Redaction happens before hashing and storage. The signed record therefore covers the redacted form.

A normal native tool-call entry stores normalized arguments. It stores a digest of exact provider arguments instead of the arguments. Exact provider arguments stay transient unless Writ creates an explicit approval request. The approval request can store those arguments after redaction.

The first entry has no previous hash. Each later entry contains the hash of the entry before it. The current entry hash covers its canonical content and that previous hash.

Changing, removing, inserting, or reordering an exported entry breaks the chain.

Writ signs the current chain root with a project record key. A checkpoint binds the run, sequence, root hash, time, policy hashes, run state, record version, and signer key ID.

The public key is stored separately from the database. Export it with the record and transfer it through a trusted channel. Keep the private key local.

Independent verification needs no database

Section titled “Independent verification needs no database”
Terminal window
writ record export <run-or-name> --out run.writ-record.json
writ record verify run.writ-record.json --trust record.public.json

The verifier reads only the bundle and public key. It checks the full chain and checkpoint signature.

A witness receives only the run ID, checkpoint sequence, root hash, record signer key ID, and a fresh nonce. It signs a receipt with its own key. It does not receive the record entries.

A verifier with both public keys can prove that the project signer created the checkpoint and that the witness observed that checkpoint. The witness does not prove that a tool produced its reported effect.

Use writ review to read a run. Use writ record to export or verify it.