Repository navigation
Field Reports
Every number Tracekit publishes so far comes from us: our own agents, our evals and our demos. A field report is a week of your real use, as counts only, posted as a GitHub issue or a pull request. You use Tracekit as you always do and share the counts; we read from them which shipped rules to change (a rule people approve nearly every time is a false alarm). Each one is a measurement from outside our machines.
--share needs Tracekit 1.6.0 or later (pip install -U tracekit-ai).
tracekit init --dev --v2 # Claude Code's hooks and the dev signer; --agent codex, cursor, ...: coding-agents.md
# work as you always do, for a week
tracekit report --share --since 7d # the week's counts, to postCoding agents has the hooks for Codex, Cursor, Gemini CLI and the others, and the
quickstart has the SDKs and frameworks. tracekit report --share reads the dev signer's store as
tracekit report does (weekly report) and prints its counts alone:
Tracekit 1.6.0 field report (tracekit report --share): 7 days
Integrity: the store verified, 31 of 31 runs verify
Runs that verify, by agent: claude-code 27, codex 2, other 2
Tool calls: 18,204 allow 15,733, flag 2,318, ask 61, deny 92
Holds: 58 expired 41, approved · ran 12, rejected 5 (3 of the agent's retries of a held call, counted with it)
Gaps (signed records that something may be missing): 14 witness_late 9, tailer_lost 3, run_abandoned 2
Denied and flagged calls, by rule (one call can match several rules):
deny TK-D007 64
deny TK-D002 19
deny TK-SHELL-PARSE 2 (not placed)
deny custom rule 4
deny TK-F001 11 (also matched, not why)
flag TK-F011 1,402
flag TK-UNKNOWN-TOOL 377 (not placed)
...
Holds by rule: held, approved (by a person or the run's own user), rejected or expired:
TK-A015 31, 4, 27
TK-A001 22, 21, 1
...
(The numbers above are an example, not a measurement.) A rule marked also matched, not why is a rule of another
section that matched the call too; not placed is an engine check, or a rule of a policy the report can't read, which
may or may not be why (weekly report). The holds count a call held at once and the agent's
retry of it, which ran under its approval, as one hold, so the line says how many such asks it counted with their
held calls. Holds by rule reads the signed approval records: a hold counts as approved when its first answer
approved it, by a person or the run's own user (on a dev signer, every answer is the run's own user's), even if the
approval then expired unused; rejected or expired counts the holds never approved. A rule approved nearly every time
(TK-A001 above) is likely a false alarm, and one rejected or let expire is doing its job. It exits 1, as tracekit report does, when the store or a run fails to verify: post the report anyway.
tracekit audit --share --since 7d # Claude Code's transcripts in ~/.claude/projects, replayed through the policytracekit audit puts no hook in your agent's loop and starts no signer: it replays the tool calls in
Claude Code's past transcripts through today's dev policy pack and counts what it would have done. Its counts are a
replay, not a signed record, and a floor of what the signer would hold (limits).
--share prints the same kind of counts: the number of sessions, the calls by decision, and each rule by the decision
of the calls it matched, marked as report --share marks it.
--share prints |
It never prints |
|---|---|
| The Tracekit version, and the window's length in days (no date or time) | The store's or the transcripts' path, the policy file, the trust note, the tenant |
Whether the store verifies, and how many runs do (report) |
A run id, a session id, a user id or any identity |
The runs that verify, by agent: Tracekit's own names, every other as other (report); the number of sessions (audit) |
A tool's arguments, a command, a path or a URL it touched |
| Tool calls by decision: allow, flag, ask, deny | An example call, a rule's description, a hold's reason or who answered it |
Holds by outcome: approved · ran, rejected, expired, ... (report) |
What the model or the person said, a tool's result, a gap's reason |
The gaps by kind: the signer's own kinds, any other as other (report) |
An agent name that isn't Tracekit's own |
Each rule with its decision and its count: Tracekit's own rule ids, every other as custom rule (no rule for a decision no rule named, report); each rule's holds, with how many were approved (by a person or the run's own user, as on a dev signer) and how many never approved were rejected or expired (report) |
A rule id that isn't Tracekit's own; any record, hash or signature |
An agent name is printed only when it is one Tracekit's own hooks and tools give a run (claude-code, codex,
cursor, gemini-cli, opencode, goose, qwen-code, droid, antigravity, crush, agentsh,
tracekit-why). Any other is counted as other: an SDK or framework run is named by your code or after your script's
file (tracekit.instrument()), it can name a customer or a project, and an agent can register its run under any name
it likes. A rule id is printed only when it is one of the shipped packs', an engine check's or the signer's own; a rule
of a policy you wrote is counted as custom rule, all such rules together. tracekit report --share
says so on stderr. Read the block before you post it all the same; in the form, say in your own words what your
other agents and custom rule rules are, if you want to.
report --share reads no call's arguments from the dev signer's content vault, so it adds no content.accessed
record to your store.
- Run one of the commands above and read what it prints.
- Open a field report and paste it.
- Name the agent or framework and the kind of work. Anything else you'd like to tell us is optional.
tracekit feedback prints that form's link pre-filled for #385
(your Tracekit, OS, Python, which agents' hooks are installed, and the week's report --share counts when the dev
signer has a store) and exactly what the link holds; it sends nothing, and --open opens it in your browser. For one
false alarm, tracekit feedback --harmless <approval-id> [--why "one line"] fills in the held call's rule ids, tool
name, policy hash and verdict, and your Tracekit, OS, Python and hook names, never its command, arguments or paths;
it prints all of it before anything is submitted (tracekit approvals show prints the line).
To send a report as a pull request instead, so it stays in the repository and you show as a contributor,
tracekit feedback --file report.md writes one to fill in
(docs/field-reports says where it goes).
A way an agent could get a call past the policy is a security problem: report it privately, as SECURITY.md says, not in a field report.
None yet. Each report we receive is listed here with its issue, credited to its author as they want to be named.
Generated from docs/ at v1.6.0. Edit the docs in the repository, not here.
Get started
- Quickstart: the v2 signer
- Quickstarts
- Quickstart: Claude Agent SDK
- Quickstart: Claude Code
- Quickstart: a custom agent
- Quickstart: LangChain and LangGraph
- Quickstart: MCP client
- Quickstart: OpenAI Agents SDK
- Coding agents other than Claude Code
- tracekit doctor
- Walkthrough: Tracekit end to end
How it works
- How Tracekit works
- Overview
- The life of a tool call
- The evidence format
- Verification and assurance
- Witnesses and monitoring
- Policy
- Approvals
- Detection and containment
- Capture and completeness
- Custody
- Provenance and tracekit why
- Deployment and isolation
- Storage, durability and performance
- Integrations
- Security model
- Architecture
- tracekit why: architecture
Integrations
- Integrations
- Adapters
- OpenTelemetry
- Remote clients
- Kubernetes agent-sandbox
- agentgateway
- agentsh and Tracekit
- Browser Use
- Claude Agent SDK
- Claude Code's sandbox
- Codex's sandbox
- CrewAI
- Docker MCP Gateway
- E2B
- Falco
- Gemini CLI's sandbox
- Google ADK
- Haystack
- Hermes Agent
- LangChain v1
- LiteLLM
- LlamaIndex
- MCP client
- microsandbox
- Microsoft Agent Framework
- OpenAI Agents SDK
- NVIDIA OpenShell
- Pydantic AI
- sandbox-runtime's proxy on its own
- Strands Agents
- Tetragon
- Vercel AI SDK
- Wassette
Policy and approvals
- Policy reference
- Approvals
- Intent grants: approve costly payments once, with limits
- PCM 0.1: proof-carrying messages
- Findings
- tracekit audit
- Reading the model's reasoning
- Incidents and containment
- Webhooks
Deploy and operate
- Deploying the signer
- The signer as a container
- The signer on Kubernetes
- The compose stack
- Identity
- Tool executor
- A2A gateway
- Latent transfers and C2C
- MCP gateway
- LLM gateway
- Egress observation
- Witnesses
- Log monitor
- Record-key issuer
- Signer observability
- Viewer
- Event Horizon
- Viewer 1.4
- tracekit why: causal investigation and replay
- Migrating
- Platforms
- Deploy the public witness
Verify the evidence
- Tracekit for auditors
- Reading a v2 verify report
- Evidence format v2
- Auditor guide
- Sample evidence bundle
- Signing
- tracekit graph: what agents did across runs
- What Tracekit guarantees
Security and privacy
- Threat model: the v2 signer
- Threat model: the v1 laptop signer
- HTTP security checklist
- Threat-model review packet
- Privacy
- What the public witness sees
- Known limits and trade-offs
- What's stable
Compliance
- Compliance mapping
- EU AI Act
- ISO/IEC 42001
- NIST AI RMF and the Generative AI Profile
- OWASP Top 10 lists for LLM and agentic applications
Evaluation
Use cases and demos
- Use cases
- Demos
- Agent approvers within bounds
- A production bucket
- Completeness and tamper evidence
- Detection and containment
- Network coverage: an egress observer
- Guardrails: allow, deny, or ask a person
- MCP tools, gated and recorded
- A production volume
- Prompt injection held by provenance
- Why: which input caused the action
Help