Audit trail

Everything that happens on a task is recorded as an event on an append-only timeline: the agent’s requests, the human’s decisions, agent actions, exceptions, notes, and lifecycle changes. It’s on from the first event, on every plan — the record of who decided what, and why.

What’s recorded

Every event carries who fired it (source), whose step it occurred in (owner), any step transition, and — for decisions — a snapshot of the decider’s authority. Approvals additionally snapshot the agent’s recommendation onto the decision, so the record is self-contained.

TypeWhat it records
approval_requested / approval_decidedAn approval and the human’s outcome.
elicitation_requested / elicitation_providedAn elicitation and the human’s answers.
actionAn agent (or human) advanced the case or asserted a fact.
exceptionSomething broke during agent execution.
noteA plain annotation, from any source.
task_created / task_closed / assignment / timeoutLifecycle and routing, emitted by the platform.

Recording agent activity

Beyond requests, your agent can write to the timeline directly — to record what it did, flag an exception, or leave a note:

1import uuid
2
3client.events.agent_action(
4 idempotency_key=str(uuid.uuid4()),
5 project_name="claims",
6 task_id=task_id,
7 description="Auto-classified the claim as low-risk",
8)
9
10client.events.note(
11 idempotency_key=str(uuid.uuid4()),
12 project_name="claims",
13 task_id=task_id,
14 message="Customer called to confirm bank details",
15)

An action can also carry governed metadata_patch and a step transitions_to — it’s how the agent advances the task and asserts state. Decisions and notes never carry governed data.

Reading the timeline

Tail a task’s events with an ascending cursor — the catch-up read a fresh agent session uses to learn the human decisions, notes, and actions it wasn’t party to:

1page = client.tasks.events(id=task_id) # optional cursor= / limit=
2for event in page.items:
3 handle(event)
4# resume later from page.next_cursor

Each event mirrors its typed payload, so you can switch on the event type to handle decisions, answers, and actions.

Linking your own traces

Pass an external_trace_id on any request or event to link the Pump Up record to your agent’s observability tool — the timeline stays the accountability record, not an execution trace.