Do you know what your agents are doing?
AER records the tools, programs, hosts, files and models your agents use, and signs each finished session so you can check later that the record has not changed.
Metadata only. Your prompts, completions, tool argument values and file contents are not sent to AER. Each event is reduced to metadata on your machine before it is posted. See what is recorded
Pilot access is reviewed by hand; pricing is custom. Checking a record needs no account.
Install the hooks for Claude Code
export AER_API_KEY=... AER_TENANT_ID=... AER_AGENT_ID=... AER_ENV_ID=... npx @adastracomputing/aer-hooks install claude-code
nix profile add github:Ad-Astra-Computing/aer#tools export AER_API_KEY=... AER_TENANT_ID=... AER_AGENT_ID=... AER_ENV_ID=... aer-hooks install claude-code
The hook records nothing until those variables hold your API key and IDs, which are issued when your pilot access is approved. Other harnesses are under Install.
A recorded run
A real agent session, as AER recorded it
This is the last public run we could reach: an agent making real model calls and real tool calls against a live registry, through the same session, ingest and completion path you would use, recorded on 24 Sep at 16:30 UTC.
| Time (UTC) | Event | Recorded | Not recorded |
|---|---|---|---|
| 16:30:07.188 | llm.requested | LLM → claude-haiku-4-5-20251001 | the prompt |
| 16:30:08.649 | llm.completed | LLM ← 66 tok | the completion |
| 16:30:08.649 | tool.selected | Select: npm_package_info | argument values |
| 16:30:08.649 | http.requested | HTTP GET registry.npmjs.org | path, query, headers, body |
| 16:30:09.712 | http.completed | HTTP 200 registry.npmjs.org | response headers and body |
| 16:30:09.712 | tool.completed | Done: npm_package_info | the result |
| 16:30:09.712 | llm.requested | LLM → claude-haiku-4-5-20251001 | the prompt |
| 16:30:10.630 | llm.completed | LLM ← claude-haiku-4-5-20251001 39 tok | the completion |
Recorded so far
- Model
- claude-haiku-4-5-20251001
- Tool
- npm_package_info
- Host
- registry.npmjs.org
- Tokens
- 1,323 in, 105 out
- Est. cost
- $0.0018
- Status
- Signed and anchoredCheck it
- Canonical hash
- 4b6e8b02…42e4ba14
- Signing key
- a721bb9bd8f31c8e
- Public timestamp log
- View the Sigstore entry
Install
Install the hooks or the collector
Coding agents are recorded through hooks, one command per harness. A Node agent is recorded by the collector with no change to its source. The client packages need Node 22 or newer. A Python SDK installs the same way: pip install "git+https://github.com/Ad-Astra-Computing/aer.git@sdk-py-v0.1.0#subdirectory=packages/sdk-py".
# configure AER with the standard environment, read by the hook process: export AER_API_KEY=... AER_TENANT_ID=... AER_AGENT_ID=... AER_ENV_ID=... npx @adastracomputing/aer-hooks install claude-code npx @adastracomputing/aer-hooks install codex npx @adastracomputing/aer-hooks install antigravity
# installed rather than run: the harness calls the hook binary # itself, so it has to stay on PATH after setup finishes nix profile add github:Ad-Astra-Computing/aer#tools export AER_API_KEY=... AER_TENANT_ID=... AER_AGENT_ID=... AER_ENV_ID=... aer-hooks install claude-code aer-hooks install codex aer-hooks install antigravity
The hook reads its key from the environment it runs under, so keep it out of a shell history and set it somewhere only you can read. Codex runs a hook only after you approve it with /hooks. Check what is wired with aer-hooks status.
opencode runs plugins in process, so it takes this file instead of an install command.
# wire the collector into a Node project npx @adastracomputing/aer init # then run your agent with the collector attached node --import @adastracomputing/aer-auto-node/register your-agent.js # confirm it is recording (exits non-zero if not) npx @adastracomputing/aer doctor
# wire the collector into a Node project nix run github:Ad-Astra-Computing/aer#aer -- init # then run your agent with the collector attached node --import @adastracomputing/aer-auto-node/register your-agent.js # confirm it is recording (exits non-zero if not) nix run github:Ad-Astra-Computing/aer#aer -- doctor
The Python SDK is installed from the public client repository, not from PyPI. Pin a release tag rather than the default branch.
The TypeScript SDK, @adastracomputing/aer-sdk-ts, wraps the same three calls and batches events off your request path.
Import a past Claude Code session
npx @adastracomputing/aer import claude-code \ ~/.claude/projects/<project>/<session>.jsonl
nix run github:Ad-Astra-Computing/aer#aer -- import claude-code \ ~/.claude/projects/<project>/<session>.jsonl
The command reads a transcript on your machine and sends only its metadata. The path to the transcript file is required.
The full quickstart walks through setting up your key and checking that recording works.
Privacy
The record holds metadata only
Prompts, completions, file contents, argument values and command lines are not recorded, so a record can be shared without disclosing your code or your conversation with the agent.
| Recorded by the collectors and hooks | Not recorded |
|---|---|
| Tool names and the names of their argument keys | Argument values and return values |
| Hosts contactedThe Node collector keeps the host, method and path, with any query string replaced by a marker. The hooks keep only the host and method. | Query strings, headers and bodies |
| Paths of files read or written | File contents |
| Every program a shell command runs, and the hosts it points curl, wget, git, ssh, scp and rsync at | The command line, its flags and arguments |
| Model names and token counts | Prompts and completions |
Enforced in the collector and again at ingest. The API discards any field outside a fixed list. An event you build yourself with an SDK or the raw API is otherwise stored as you send it.
Check the client code yourself. The code that decides what leaves your machine is open source, and each npm release carries provenance linking it to the commit it was built from, which npm audit signatures checks. Read the client source
Check it yourself
Verifier output for a signed record and an edited copy
You can check any record with the CLI, in a browser or offline with the verifier library. Below is the verifier's output for the run above as signed, and for a copy with one host name changed.
Record
Hooks, the collector or an SDK send metadata events.
Step 2Sign
When the session ends, AER signs the record with Ed25519 and, by default, enters it in Sigstore Rekor, a public log AER does not operate.
Step 3Check
Whoever holds the record can check it without an account.
aer verify <aer-id>
As signed verifyAerBundle(), fields trimmed
{
"ok": true,
"checks": {
"hash_match": true,
"signature_valid": true,
"anchor": { "status": "verified" }
},
"reasons": []
}One host edited verifyAerBundle(), fields trimmed
{
"ok": false,
"checks": {
"hash_match": false
},
"reasons": ["hash_mismatch"]
}The edited bytes no longer match the signed hash. Passing again would need a new signature from AER's key.
Tamper-evident, not tamper-proof. After signing and anchoring, any modification to the bytes above is detectable by anyone. AER does not claim to stop a malicious operator who strips instrumentation before it runs; for that boundary, protected resources verify a live attestation and deny an unattested caller, covered under For teams.
Evidence, not logs
Independent evidence, not better logs
LangSmith, Langfuse and Arize Phoenix exist to help you understand and improve your own agent: traces, evals, prompt comparison, cost and latency over time. AER exists to prove to someone who was not in the room what an agent did. The two jobs overlap in what they watch, not in what they are for, and a team running agents in production can reasonably want both.
| Property | Plain logs | Observability platform | AER |
|---|---|---|---|
| Tamper-evident | — | — | Ed25519 signed |
| Your prompts and data | in your logs | typically uploaded | never leave your process |
| What it is for | debugging | debugging your agent | proving it to a third party |
| Independently verifiable | — | — | SubtleCrypto, CLI, anywhere |
| Anchored to public log | — | — | Sigstore Rekor |
| Standalone bundle artifact | — | typically platform-specific export | single canonical.json |
| Baseline-driven detection | grep | eval rules, schema not published | rules.v1: deterministic and replayable, schema published |
| Schema is open | — | varies by platform | documented + zod-validated |
If your main goal is
| Goal | Reach for |
|---|---|
| Debug a wrong or low-quality answer | Langfuse, LangSmith or Phoenix. Tracing and prompt comparison are their job, not AER's. |
| Track cost and latency across many runs | An observability platform tracks it over time. AER estimates cost once per record, against a versioned price table. |
| Self-host so nothing leaves your network | Langfuse or Phoenix, which are open source and self-host on their free tiers. LangSmith self-hosts on its enterprise plan. |
| Prove a record was not modified after the fact | AER. That is what the signature and the public log are for. |
| Gate access to a resource on a live attestation | AER's admission control. |
More controls
Findings, usage policy and cost
Baseline findings
A session that uses a tool or contacts a host outside the baseline you trained raises a finding. Detection uses fixed rules and no language model.
Usage policy per agent
Set allowed models and per-session token and call caps for each agent. The Node collector enforces them in report or block mode.
Estimated cost
Each record estimates the run's cost from its token counts against a versioned price table, so it stays an estimate against list prices, not a bill.
For security and compliance teams
More agents than you can account for
01
The incident review
An agent deleted the wrong records at 2 a.m. The postmortem needs to know which tools it called, what it touched and where it sent data. Ordinary logs are scattered and easy to change after the fact. A signed record answers those questions and cannot be quietly edited.
02
The audit request
A customer audit asks you to prove what your agents did with their data. Screenshots of your own dashboard are not proof. AER exports an evidence pack for any run and the customer verifies it themselves.
Whoever holds an AER record checks it against AER's published key and a public log, so a change made after signing is detected. Because a record never held your content, you can share it widely.
Admission control
A protected resource can require a live AER attestation token before it serves a request. An MCP server behind the guard denies any request that does not carry a valid token; a Node agent's own collector enforces the same check in report or block mode. Guide
Pause an agent
An admin can pause one agent. AER then refuses its new sessions, events and tokens until it is resumed.
Evidence pack
Each record downloads as evidence.zip, which can be checked without contacting AER, or as a PDF report.
| canonical.json | The exact bytes that were signed |
| public-key.json | The signing key |
| anchor-evidence.json | Log inclusion proof for offline checking (when the run is anchored) |
| prov.json | W3C PROV export |
| README.md | The offline verification steps |
| manifest.json | SHA-256 of every file |
Storage and retention
- Location
- Cloudflare, isolated per tenant, with the primary database in Eastern North America.
- Retention
- From 1 to 3650 days, or indefinitely. Records can be public or private.
- Not deletable
- The public log entry, which holds a hash and a signature, not your data.
Privacy, Security and the Data Processing Agreement have the detail.
Pilot
Pilot access, reviewed by hand
A small group of users is being onboarded by hand. Say which agent you run and what you plan to record, and whether you run agents across a team.
Or write to support@aer.run.
Questions
What evaluators ask
What it is
How is this different from observability or logging tools?
What a record proves
What exactly does a signed record prove?
What won't a signed record tell you?
Is the record on the demo page a real agent run?
What does AER deliberately not capture?
Does deviation detection send anything to a language model?
Can I prove a specific prompt or output without revealing it?
Security and data
Where does my data live and how is it handled?
What if Sigstore Rekor goes down or rewrites history?
Integration
Does this slow down my agent?
emit() return as soon as the event is queued; flushing runs every 500ms by default. Signing and anchoring happen at complete() time, server-side, not in your hot path.What can I instrument?
@adastracomputing/aer-sdk-ts for TypeScript and Node, and aer-sdk for Python. The Python one is installed from the public client repository rather than PyPI, pinned to a release tag rather than the default branch: pip install "git+https://github.com/Ad-Astra-Computing/aer.git@sdk-py-v0.1.0#subdirectory=packages/sdk-py". Any other language can speak the raw HTTP API.Does it work with Claude Code, Codex CLI or coding agents?
npx @adastracomputing/aer-hooks install claude-code registers with the harness with no change to the harness itself, and codex and antigravity install the same way. Codex will not run a hook until you trust it, so run /hooks there and approve the entry. Antigravity does not fire its tool hooks in print mode, so a headless run there records the shape of the conversation rather than each tool call. opencode runs plugins in process rather than firing shell hooks, so it takes a small plugin file instead of an install command. The hooks record tool names and argument key names, every program a shell command runs, the hosts that curl, wget, git, ssh, scp and rsync are pointed at, the host and method of a web fetch, the paths of files read or written and, for Claude Code, the model and token counts from its transcript. They never record argument values, file contents or the path and query of a URL, and a hook that cannot reach AER never blocks a tool call.Can I install AER with Nix instead of npm?
nix run github:Ad-Astra-Computing/aer#aer -- init instruments a project without installing anything permanently, and nix profile add github:Ad-Astra-Computing/aer#tools puts the CLI, the hook binaries and the MCP recorder on your PATH. Recording a coding harness needs the profile form, because the harness calls the hook binary itself long after the setup command has finished. Every command box on this site offers both forms.Is AER open source?
How long are records retained?
Know what your agents are doing. Prove it to anyone who asks.