# Audit log and `jan audit`
By default, every **leaf execution** is logged to SQLite. Treat the database as **privacy-sensitive telemetry**, not as non-repudiation: it is locally mutable, may contain CLI secrets from passthrough argv, and is created with the process umask.
`jan test` and `--no-log` / `JAN_NO_LOG` skip writes.
## Columns
| `ts` | Unix timestamp |
| `git_branch` | From `--branch`, `JAN_BRANCH`, or `git rev-parse` in `--cwd` |
| `cwd` | Working directory |
| `command_path` | Matched subcommand chain (e.g. `git s`) |
| `argv_json` | Full argv passed to the child process |
| `exit_code` | Child exit code |
| `spec_root_id` | Link to which spec tree was used |
Default path: see [Command line](../usage/cli.md#audit-log-defaults). Override with `--db` / `JAN_DB`.
Useful for agent workflows: each git branch gets a separate audit trail of which `jan` commands ran.
## `jan audit`
```bash
jan audit recent
jan audit recent --limit 50
jan audit stats
jan audit stats git
jan audit cleanup --days 30
```
| `recent [--limit N]` | Latest invocations (default 20): timestamp, branch, command path, exit code |
| `stats [prefix]` | Counts by command path (optional prefix filter) |
| `cleanup --days N` | Delete rows older than N days |
Uses `--db` / `JAN_DB` / the default XDG path. Errors if the database file does not exist.