Skip to main content
Everything your agents do with your resources happens on the plane, so Steerholm sees every tool call. It records one decision per call: which agent asked, which resource (by its MCP server) and tool, and whether policy allowed it, denied it, or the server failed. Read it with holm log.

Where it lives

The log is split into numbered files in the config directory:
Each file is owner-only (0600), like config.json and the policy files. Files are never renamed — rotating just starts writing the next number — so a reader tailing one is never pulled out from under it.

Record format

One JSON object per line (JSON Lines), oldest first, so the log streams into jq or a log shipper without a parser:
decision separates policy from infrastructure: denied means Steerholm refused the call, error means it could not be carried out — the server was down, unreachable, or failed. Filtering for refusals means --status denied, not both.
Argument values and failure reasons are recorded as they were, not scrubbed — that is what makes the log an audit rather than a summary. Agents rarely pass secrets (server credentials are injected by the daemon via --env and never travel through an agent), but the files are owner-only for a reason: treat the log as sensitive if you copy or export it.

Retention

Old files are deleted, so the log does not grow without bound. Two limits apply, and a file goes when it passes either: The file count bounds disk use; the age sets how long history is kept. With the defaults that is a 50 MB ceiling and no time limit — so on a busy install the oldest entries are dropped once the ceiling is reached.
Age is taken from the timestamps inside the files, not their modification time. Restoring a backup with tar -x or rsync -a preserves old modification times and would otherwise delete a restored audit trail; copying with cp -r resets them and would keep it for ever.
Writes are best-effort: a failure to record is logged and never breaks the tool call it was describing. The log is not fsynced, so an abrupt power loss can lose the most recent lines.