What ax knows about your agent.
A tour of the data ax keeps on your laptop - the transcripts it indexes, the graph it builds, the stages it derives, the interventions it proposes, and the hooks it watches in real time.
Everything your agent already wrote down.
Your agent leaves a paper trail in five places. ax reads all of them.
A LaunchAgent (com.necmttn.ax-watch) tails your Claude and Codex transcript directories and runs ax ingest --since=1 in the background within seconds of a new turn. A weekly cron does a deep-scan backfill for anything the watcher missed. Nothing is uploaded, queued, or phoned home - every read stays on the same filesystem your agent already writes to.
A typed graph of who did what, where.
Transcripts become nodes and edges. Sessions own turns. Turns invoke tools. Tools touch files. Files end up in commits.
sessionone agent conversation, start → endturna single user-assistant exchangetool_callRead, Edit, Bash, MCP - one invocationskillan installed Claude/Agents skillfilea path the agent read or wrotecommitgit commit attributed to a sessioninvokedturn → tool_calleditedtool_call → file (Edit/Write)touchedtool_call → file (Read)producedsession → commitaddressedturn → skill (mentioned/loaded)Raw events become findings.
Once the graph is built, ax runs a chain of small derive stages. Each one writes back into the same database, so every later query can ask the typed question instead of the raw one.
Proposals, lifecycle, and safety gates.
Patterns that recur in your graph turn into Intervention proposals. Each one moves through a tracked lifecycle, and any change to your harness ships with a written rollback contract.
~/.claude/agents/settings.jsonrecovery_pathwritten rollback steps. Required on every hook + automation.smoke_test_commandone shell command that proves the agent still works after.disable_commandkill switch you can paste from memory in a panic.failure_modefail_open (let through if hook errors) or fail_closed.settings.json, hooks, LaunchAgents, cron, or shell scripts directly. An accepted intervention emits a task brief at .ax/tasks/<id>.md with the safety contract on top. You - or your agent - apply it. ax improve lint reads the marker you left behind to reconcile the proposal back to accepted state.--- form: hook experiment: experiment:chk_skip_test_runner recovery_path: Remove the matching block from ~/.claude/settings.json, restart Claude Code, run smoke test. smoke_test_command: bun test src/ingest/turns.test.ts disable_command: jq 'del(.hooks.PreToolUse[] | select(.matcher=="Bash"))' \ ~/.claude/settings.json > /tmp/s.json && mv /tmp/s.json ~/.claude/settings.json failure_mode: fail_open --- # Hook: block `bun test` without the wrapper Add to ~/.claude/settings.json → hooks.PreToolUse: { "matcher": "Bash", "hooks": [{ "type": "command", "command": "echo 'ax:chk_skip_test_runner' && ax-hook check-test-runner" }] } The echo line is the marker ax improve lint looks for.
Watch tool fires in real time.
Claude Code and Codex call hook handlers around every tool invocation. ax ships handlers that record each fire as a row, and lets you backtest a candidate hook against your last 7–30 days before turning it on for real.
import { recordHook } from "ax/hooks"; export default async function handler(event) { // every pre-tool fire becomes one row await recordHook({ phase: "pre_tool", tool: event.tool_name, session: event.session_id, inputs: event.tool_input, at: new Date(), }); }
pre_tool, post_tool, and stop are all captured. Hook rows link back to the turn and tool_call that fired them.ax hooks shows fire counts, marker reconciliation, and who-installed-what. ax hooks backtest ./my-hook.ts --days 14 replays the last two weeks of tool calls through a candidate before you ship it.One CLI, seven verbs.
Everything ax knows is reachable from ax. The dashboard and TUI are the same queries with different paint.
127.0.0.1:8520 with the same data the TUI sees.One process, one database, one laptop.
ax is a single binary that runs as a LaunchAgent, talks only to localhost, and stores everything in a SurrealDB instance you own.
ax, db main.ax install. Survives reboots.brew uninstall ax removes it.“Your transcripts are already on your laptop. ax just reads them where they sit.”