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.
@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 oneclass, 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
signatureremoved: object keys sorted recursively, no whitespace, arrays kept in order, and primitives serialized as byJSON.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 withkey_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 inprevious_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], aMnemom-Record-Bundletrailer, and aMnemom-Pre-Bundle-Headtrailer 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:
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 bysigning_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: falsemeans 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.aiover HTTPS and pin it yourself. - That the outcome line is signed. The “Mnemom outcome” check is a check run, not a signed statement.