Polign Recall · Use case

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

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.