An audit trail of what the agent knew and did
When a decision is disputed, you need to show what the agent knew when it acted, not what the database says today. Recall never updates or deletes a record: a correction is a new record that replaces an old one, a forget is a retraction record, and reads can be asked as of any earlier instant.
The code
Runs as written: pip install polign-recall brings the client, the recall
binary and a local polign_db. Swap local_dir for backend="polign" and a server
URL when the database should live in your bucket, or for PostgreSQL, MongoDB or Qdrant.
from polign_recall import Client with Client(local_dir="./recall-audit", typed=True, env={"RECALL_PREDICATES": "registry.json"}) as memory: memory.remember("patient-7", "warfarin_dose_mg", 5) memory.remember("patient-7", "warfarin_dose_mg", 3) # the doctor lowers it: replaces 5 memory.forget("patient-7", "warfarin_dose_mg", 3) # withdrawn, not deleted print(memory.recall("patient-7", "warfarin_dose_mg")) # [] : nothing is believed now for event in memory.history("patient-7", "warfarin_dose_mg"): # every statement, in order print(event.observed_at[:19], event.value, "retraction" if event.retraction else "") for step in memory.timeline("patient-7", "warfarin_dose_mg").changes: print(step.when[:19], step.change, step.ended, "->", step.began)
What it printed:
[]
2026-11-03T18:55:48 5
2026-11-03T18:55:48 3
2026-11-03T18:55:48 3 retraction
2026-11-03T18:55:48 stated () -> ('patient-7 warfarin dose mg: 5',)
2026-11-03T18:55:48 replaced ('patient-7 warfarin dose mg: 5',) -> ('patient-7 warfarin dose mg: 3',)
2026-11-03T18:55:48 withdrawn ('patient-7 warfarin dose mg: 3',) -> ()
What the record looks like
Three records, in the order they were written. The forget is the third one, with retraction: true; it withdraws the belief and leaves both earlier statements in place.
{"subject":"patient-7","predicate":"warfarin_dose_mg","value":"5","source":"user_stated","retraction":"false","observed_at":"2026-11-03T18:55:48.251Z"}
{"subject":"patient-7","predicate":"warfarin_dose_mg","value":"3","source":"user_stated","retraction":"false","observed_at":"2026-11-03T18:55:48.289Z"}
{"subject":"patient-7","predicate":"warfarin_dose_mg","value":"3","source":"user_stated","retraction":"true", "observed_at":"2026-11-03T18:55:48.312Z"}
recall(..., as_of=<instant>) answers from the records written before that instant, and diff(since, until) lists what ended and what began between two instants. An audit bundle exports the events, the registry they were read under and the as-of time, with a digest; the recall-audit verifier replays it offline, with no database and no model, to the same beliefs. The agent's own actions are records too: each tool call that touches the world is begun before it runs and ended with its result.
Evidence
The record section of the Recall page is driven by real recall history, recall ask -as-of and recall diff output, with a slider over the instants. The bundle format and what replay does and does not establish are in docs/audit.md. Audit is in every plan, including self-hosted at no charge (pricing).
Where to go next
- The record: history, as-of and diff on the Recall page
- Reproducible audit bundles
- Durable agent actions: every tool call as a record
- What is stored, what forgetting deletes, and what does not leave your account
Recall is typed, durable memory and state for AI agents. It stores corrections, decisions and task state as append-only records in your own object store (S3 or GCS), so an agent can be corrected without retraining and resumed after a crash, restart or pod replacement without snapshotting the process.
Try it
One pip install brings the client, the recall binary and the database. The snippet on
this page runs as written.