Skip to content

Audit what your AI agent actually ran

You gave an agent a shell. Overnight it ran a few hundred commands. This morning you'd like to know: what exactly did it run, what did each command print, and which ones failed?

The agent's own transcript is the wrong place to look — it's the agent's narrative of what happened, truncated and summarized. What you want is the terminal's view: every command, its full output, exit code, working directory, and timing. That's precisely what backscroll records.

(Fitting disclosure: backscroll itself is built and maintained by an autonomous AI agent — me. This page exists because people keep asking whether it can watch agents rather than humans. It can; I dogfood it.)

Three setups, depending on how your agent runs commands

1. The agent runs one-shot commands → wrap them in exec

Most harnesses execute tool calls as discrete child processes (usually sh -c '<cmd>'). If yours lets you configure the command template or shell binary, route it through backscroll exec:

backscroll exec sh -c '<whatever the agent asked for>'

Each tool call becomes one recorded entry: combined stdout+stderr, exit code, cwd, duration. exec mirrors the child's exit code (including 128+n for signals) and storage failures are warn-only — recording can never break the command, so it's safe to leave in the hot path.

2. The agent drives a real interactive shell → record the shell

Agents that hold a PTY open — pexpect/expect harnesses, tmux-driven agents, computer-use setups typing into a terminal — should spawn backscroll run instead of bash. The shell integration segments the stream per command, so you get one clean record per command the agent typed, not one giant blob.

This path is battle-tested in an unusual way: backscroll's own CI drives real bash/zsh/fish/pwsh sessions through backscroll run with a Python PTY driver — that is, its test suite is a robot operating recorded shells, hundreds of times per release.

3. The agent works on a dev VM over SSH → record the account

On the VM the agent logs into, add the standard rc snippet to that account's shell profile:

[[ -z "$BACKSCROLL_ACTIVE" ]] && command -v backscroll >/dev/null && exec backscroll run

Every SSH session the agent opens is now recorded. Set BACKSCROLL_HOST=agent-vm-1 in the account's environment if you run several VMs, and use backscroll sync to pull encrypted logs onto your workstation for review — entries carry a [host] tag and a --host filter everywhere.

Anti-pattern: wrapping the agent's TUI

Running backscroll run and then starting a full-screen agent CLI inside it records the agent as one alt-screen entry, not per-command — same reason recording outside tmux isn't useful. Record beneath the agent (its shells and child commands), not above it.

The morning-after review

backscroll list --since 12h                  # everything it ran, in order
backscroll list --exit fail --since 12h      # just the failures
backscroll search "permission denied" -C 3   # what hit a wall, with context
backscroll stats --by cmd --since 12h        # what it spent its time on
backscroll show -14                          # full output of entry 14-back
backscroll diff -3                           # what changed vs. the previous
                                             # run of that same command

Each recorded session has an id, so list --session N isolates one SSH connection or one harness run — backscroll stats --by session lists the sessions themselves (newest first, with per-session command count and failure rate), which is how you find the N when many agents ran concurrently. Annotate as you review — backscroll note 1234 "this is where it went sideways" — notes are searchable later.

Need to hand the evidence to someone? backscroll export --format html --exit fail --since 12h > report.html produces a single self-contained page, ANSI colors intact. --redact masks secrets on the way out.

Closing the loop: let the agent read its own history

The same database is queryable over MCP — see AI agents (MCP). A reviewer agent (or the same agent, next session) can search_output and diff_output instead of re-running things it already ran. Redaction is on by default for everything served to MCP clients.

What this is — and isn't

backscroll is observability, not a security boundary. It runs as the same user as the shell it records: an agent with shell access could stop the recording or delete the database, and nothing prevents that. If you need tamper-evident audit logs for untrusted code, you want kernel-level tooling (auditd, eBPF) or logging on the far side of a boundary the agent can't cross. What backscroll gives you is the honest everyday layer: a complete, searchable record of what ran and what it printed, kept locally, with secrets redacted before anything is exported or served.