Three grades
Every surface that talks about integrity should name one of these:| Grade | What is true | What is not true |
|---|---|---|
| unsealed | The log is not on yet. Old rows could have been edited before seal. | Nothing about later edits. |
| chained | The row is in the hash-linked log. A lazy edit of one hashed field fails assay verify. | Someone who rebuilds every hash in the file still passes a local walk. |
| anchored | A witness outside this file has a receipt for a head that covers this row. | Root on the machine can still delete the disk. They cannot make an old receipt match a new history. |
chained is what you get on the way there. It still catches accidents.
What is hashed
Each new span or turn is hashed onto the previous head. The hash covers the fact as stored: who, when, which sitting, tokens, cost, and a hash of the message text. Not hashed:- The sealed ciphertext of the conversation (you may rotate keys; the hash of the plaintext still binds the words)
- Labels you add later (type, objective, product, cost correction)
Seal
A new empty store from 0.49.0 writes genesis on first open. A store that already had rows stays unsealed until you say so:--yes is required.
If a binary older than 0.49.0 kept writing after seal, those rows sit outside the chain and assay verify fails. Chain them without a new genesis:
assay --version is the check.
These verbs are SQLite. Pass --db. They do not walk a Postgres store.
Verify
| Result | Exit |
|---|---|
| Chain matches | 0 |
| A hashed field was edited, or post-seal rows were not chained | 1 |
Unsealed, without --strict | 0 (warning) |
Unsealed, with --strict | 1 |
Witness (assay attest)
Local verify is necessary and not enough. The operator who owns the file can rebuild the chain.
assay attest builds a checkpoint of the current head (store id, sequence, head hash) and sends it to a witness you configure.
witness | What happens |
|---|---|
none (default) | No network. Grade stays chained at most. Never printed as anchored. |
https | POST { "digest" } to attest.url. Nothing else: no content, no meta, no principal, no session. |
ots | Digest to public OpenTimestamps calendars. A calendar receipt that has not confirmed on Bitcoin is not anchored. Until then the grade is chained. |
--dry-run prints the digest and sends nothing. Sweep submits when witness is not none.
An old receipt binds the head at that sequence. History after that seq is chained-only until the next attest.
What this does not do
- Stop someone with root from destroying the disk.
- Recover conversation text after shred. Lose the key and the words are gone.
- Force every install onto the network. Default witness is
none. - Make pre-seal rows retroactively anchored.
attest.