← All packs

What to log when an agent acts autonomously — building a reconstructable audit trail

When a person makes a bad call, you can ask them why. They remember, roughly, what they saw and what they were thinking. An agent has no such memory once the session that made the call is gone — the context window that produced a decision is not a durable record, and by the time someone notices the outcome was wrong, the reasoning that led there may be unrecoverable unless it was captured on the way out. Debugging an autonomous agent after the fact is entirely a function of what got logged during the run, not what could theoretically be inferred later. That makes the logging design a first-class part of building an agent system, not an operational afterthought bolted on once something has already gone wrong.

Log the triggering context, not just the action taken

"Deleted branch feature/x" is not an audit trail; it's an action record. What makes it reconstructable is the context immediately before it: what prompt or event triggered this run, what the agent's plan or stated intent was, and what it observed that led to this specific call rather than a different one. Without the trigger, every downstream action looks arbitrary even when it wasn't — you end up trying to reverse-engineer intent from a bare list of side effects, which is much harder than reading the intent that was already stated at decision time.

Log every tool call's inputs and outputs, not just that a call happened

A log line that says a tool was called tells you the agent took an action. It doesn't tell you why the action looked the way it did. If a query returned zero rows and the agent proceeded as though it returned one, the only way to see that after the fact is to have logged the actual response, not just the fact of the request. The same applies to errors: a caught exception that gets summarized as "handled" in the log is a dead end for debugging, while the actual error text and the agent's next action based on it is a trail you can follow.

What "action happened" logging missesWhat full input/output logging preserves
Why the agent picked this branch of logicThe exact tool response that triggered the branch
Whether a retry was a fresh decision or a loopRepeated identical inputs across consecutive calls, visible directly
Whether stale state caused the mistakeThe state the agent actually read, timestamped, not the state that existed later when someone checked

Correlate everything to one run ID

An agent that makes twelve tool calls across three minutes needs all twelve tied to a single identifier that also appears on the triggering event and the final outcome, so a person reconstructing what happened can pull one thread and get the whole sequence in order — not grep across unrelated log streams hoping timestamps line up closely enough to guess which calls belonged together. This matters more, not less, once multiple agents or multiple concurrent runs share the same logging destination, which is the normal case once an agent system is doing real work rather than running one task at a time.

Separate the durable trail from the ephemeral context window

The context window is where the agent reasons; the log is what survives after that context is gone. Treating chat transcripts as the audit trail is a common shortcut that works right up until the conversation is summarized, truncated, or the session ends — at which point whatever wasn't written to durable storage is gone for good. The fix is the same discipline used for any system whose in-memory state is not trustworthy long-term: write the parts that matter to a log or database as they happen, and treat the interactive session as disposable scratch space that produced them.

Retention and access are part of the design, not an afterthought

A trail that exists but is deleted after a day, or that only the agent's own process can read, isn't useful for the case it exists for — someone investigating an incident after the fact, possibly well after the fact. Decide retention based on how long it plausibly takes for a bad outcome to surface, which for anything touching production data or money is usually longer than the default log-rotation window most systems ship with. And make sure the log is readable by someone other than the agent itself; a trail only the agent can query is not independent evidence of what it did.

This is the same trust-boundary question as reviewing an agent's diffs and designing tools safe to call twice, applied one step earlier: a diff tells you what changed in the code, an idempotent tool tells you a retry won't compound a mistake, and an audit trail tells you why the agent decided to make the call in the first place. All three exist because trusting an agent's output without a way to verify it after the fact is not actually trust — it's just an absence of the question being asked yet.

The test for whether your logging is sufficient: pick a real action the agent took last week and try to answer "why did it do that" using only the log, without access to the original session. If you can't, the log isn't an audit trail yet — it's an activity feed. Note this is a different bar than debugging performance or a redundant tool call, which is what tracing an agent's decision path covers — an audit trail answers "why," a trace answers "where did the time go."