Skip to main content
Availability. Record is not offered to customers yet. Today it runs only for Mnemom’s own organization, and the PR checks run only on six of Mnemom’s own repositories. This page describes the format so that anyone holding a record can check it.
A conduct record is a signed statement of what happened in one recorded conversation: what it cost, which goal it ran under, what Safe House did, and which integrity checkpoints it cites. A PR record is a signed statement that ties a pull request head to the conduct records behind it and says which of the PR’s commits Mnemom can bind to a recorded session. Both are signed with the AAP attestation key published in the same JWKS as the key for attestation tokens, and both can be checked offline with @mnemom/verify.

Record types

The typ field pins the domain. A conduct record can never pass as an attestation token, a transparency root or a PR record, because the verifier checks typ before anything else.

Conduct record fields

Every value is a hash, an enum, an id, a count, a duration, a money amount, a tool name or a timestamp. The builder checks every key and every string against a fixed allowlist before signing, and a statement that holds anything else is never signed. No prompt, response, file content or tool argument is ever in a record.

Lines

Every line comes from one claim table. The builder never writes a sentence of its own. Each line has exactly one class, from measured, verdict, estimate, benchmark or outcome, and a line never combines classes. The words “safe”, “correct” and “prevented” never appear in the claim table’s wording. A tool name is shown as it is, so a tool named safe-shell still reads “stopped safe-shell”. A Safe House line is only as strong as what happened: under enforce, only a block or quarantine verdict reads “stopped”, and a warn or nudge verdict reads “flagged”. The provisional µ amount appears only on the cost.mu line.

PR record fields

A commit that Mnemom cannot bind, for example one whose diff GitHub will not serve, is shown as bound: false. The record never claims a binding it cannot show.

Signing and keys

  • Algorithm. Ed25519 (EdDSA).
  • Signed bytes. Canonical JSON of the statement with signature removed: object keys sorted recursively, no whitespace, arrays kept in order, and primitives serialized as by JSON.stringify.
  • Signature encoding. Unpadded base64url of the 64-byte signature.
  • Key. The AAP attestation key, named by signing_key_id. The signer refuses to build a record when the key or its id is missing.
  • Public keys. Published at https://api.mnemom.ai/v1/.well-known/jwks.json. That document holds the active key and any key retired in the last 25 hours. A record signed by a key retired earlier fails against it with key_not_found, even though the record is genuine. The “Mnemom record” PR check verifies against every retired key except one retired as compromised, so it does not have this gap.

Digest chain

A record’s digest is the lowercase sha256 hex of its signed bytes. The digest is returned beside the record, never inside it, so anyone can recompute it from the record alone. Each new build of a conversation lineage names the previous build’s digest in previous_digest. A PR record names each conduct record it covers in conduct_digests. Inside a bundle, the verifier follows the previous_digest links and fails a statement whose link does not hold with chain_broken. That covers a missing build in the middle of a chain, a link to a statement of another type or lineage, and a fork. When the first record of a chain names a predecessor the bundle does not hold, because retention removed builds older than 30 days, the verifier reports the flag lineage truncated instead and the bundle can still be valid. A conduct_digests entry that names a statement of the wrong type fails with linked_statement_wrong_typ, and one that names nothing in the bundle is the flag linked statement not in bundle.

Record bundle

The PR checks place a bundle on the pull request:
statements holds the lineage’s conduct records in build order, followed by one PR record.
  • On a pull request from a branch in the same repository, the bundle is committed to the head branch at .mnemom/records/<pr-number>.json. The commit message carries [skip ci], a Mnemom-Record-Bundle trailer, and a Mnemom-Pre-Bundle-Head trailer naming the head the record was built for.
  • On a pull request from a fork, and on pull requests from Mnemom’s own automated workers, the bundle is never committed. It rides in the “Mnemom record” check summary instead, unless it is too large for that summary.

Verify a record

@mnemom/verify is a library. It makes no network calls, and you supply the public keys. Version 0.6.3 has no command-line entry point, so npx @mnemom/verify does not run a check. Call verify() from a script instead:
Pass the head the record was built for, which is the Mnemom-Pre-Bundle-Head trailer on the bundle commit:
valid is true only when every statement verifies and every bundle check holds. reasons says why not. A statement’s reasons carry its index as a prefix, for example 0:signature_invalid. flags are notes that never change valid.

Reason codes

The flags are card hash not recorded, card not bound, linked statement not in bundle and lineage truncated.

PR checks

The Record GitHub App posts two checks. The App also keeps one comment on the PR, updated in place, that says where the bundle is and how many of the PR’s commits are bound.

What verification does not prove

A valid result proves that the key named by signing_key_id signed these exact bytes, and that the links inside the bundle hold. It does not prove:
  • That the agent behaved well or the code is right. A record says what was measured and judged. Its own wording never says “safe”, “correct” or “prevented”.
  • That the inputs were right. The signature shows that Mnemom signed the cost, counts and verdicts. It does not check them against the conversation, which is never in the record.
  • That a checkpoint holds. The verifier only flags a citation with no card binding (card not bound) or no card hash (card hash not recorded). To check a checkpoint itself, verify its certificate as described in integrity checkpoints.
  • That the record is complete. Retention removes old builds (lineage truncated), and the chain is checked only inside the bundle you hold.
  • That an unbound commit came from no session. bound: false means Mnemom cannot show the binding. It is not evidence either way.
  • That the keys are Mnemom’s. The verifier trusts the JWKS you hand it. Fetch it from api.mnemom.ai over HTTPS and pin it yourself.
  • That the outcome line is signed. The “Mnemom outcome” check is a check run, not a signed statement.