Repository navigation
Webhooks
Experimental: this works and is tested, but may change and gets less hardening than the stable core.
The v2 signer can send its security-relevant records to a SIEM or any HTTPS endpoint as OCSF 1.3 events:
# signer.yaml
webhook:
- url: https://siem.example.org/tracekit # https, or http to loopback
format: ocsf
events: [deny, approval, gap, tamper] # any of decision, deny, approval, gap, tamper, incident
secret_file: webhook.secret # relative paths are from signer.yaml
- format: slack # incidents as Slack messages
events: [incident]
secret_file: slack.url # holds the Slack incoming-webhook URL (https)events |
Records | OCSF class |
|---|---|---|
decision |
every policy.decision (a deny too) |
API Activity (6003, activity Other); a deny is a Detection Finding |
deny |
policy.decision with decision: deny
|
Detection Finding (2004), severity Medium |
approval |
approval.request, approval, approval.consumed, approval.expired, approval.abandoned; approval.refused, approval.binding_mismatch
|
API Activity (Create for a request, Update for the rest); refusals and mismatches are Detection Findings |
gap |
capture.gap |
Detection Finding, severity Medium, titled capture.gap <kind>
|
tamper |
trace.tamper |
Detection Finding, severity Critical |
incident |
incident.opened, incident.updated, incident.capped, incident.resolved, incident.response, run.held, run.resumed, run.quarantined, identity.suspension (incidents) |
Incident Finding (2005): finding_info_list[0].uid the incident id, related_events the record and the records it cites, each with its event_hash as uid; activity Create (opened), Close (resolved) or Update; severity High for a hold or quarantine |
Each POST carries a JSON array of events (up to 100). Every event has time, metadata (uid: the record's event
id, correlation_uid: the run id, log_name: the log id, product) and unmapped.tracekit: the tenant, run id,
run_seq, log seq, event type and event_hash (the record's hash, to find it in a bundle), plus the ids, verdicts,
identities, rule ids, digests and commitments the record holds. Agent content (arguments, results, reasons) never
leaves: arguments only as their salted commitment (args_commitment).
Every body is signed with the secret in secret_file:
X-Tracekit-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256(secret, "<t>." + body)>
Recompute the HMAC over the raw body, compare in constant time, and refuse a t far from your clock to stop replays.
The signer's writer only queues events; one thread per webhook sends them. A post that fails (unreachable, 5xx, 408
or 429) is tried 5 times in all, waiting 0.5, 1, 2 and 4 s between tries; another 4xx is not retried. Events not delivered are
dropped and counted in tracekit_signer_webhook_dropped_total by reason: queue_full (more than 10000 waiting),
failed, shutdown (still queued when the signer stopped) (observability). Delivery is best
effort: the signed log, not the webhook, is the evidence.
incident events don't go through that queue. Each webhook subscribed to them has an outbox: a cursor over the
signer's log (<data_dir>/outbox-<id>.json) that moves past a batch only once the endpoint answered 2xx, so an outage
or a restart resends rather than loses. Receivers deduplicate by incident id and record uid. A failed post is retried
with backoff from 0.5 s to 30 s for as long as it takes (tracekit_signer_incident_outbox_failures_total{reason="retry"});
a 4xx other than 408 or 429 skips the batch (reason="refused"); a log it can't read or a record it can't map is
tried again every second (reason="error": a rising count means delivery is stalled). A new webhook starts at the
log's end. Operator notes never leave: reason is not in any event.
A Slack webhook gets one message per batch, a line per record (incident id, trigger, rules, scope, run, actions, and the tools of the records it cites), every value escaped so that a tool name or principal can't mention, link or format.
Tested in tests/test_webhook.py: events from a real signer validated against the OCSF subset they use
(tests/data/ocsf/), the signature, retries and drops.
Generated from docs/ at v1.4.1. Edit the docs in the repository, not here.
Get started
- Quickstart: the v2 signer
- Quickstarts
- Quickstart: Claude Agent SDK
- 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
- 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
- Findings
- 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
- MCP gateway
- LLM gateway
- Egress observation
- Witnesses
- Log monitor
- Record-key issuer
- Signer observability
- Viewer
- tracekit why: causal investigation and replay
- Migrating
- Platforms
Verify the evidence
- Reading a v2 verify report
- Evidence format v2
- Auditor guide
- Sample evidence bundle
- Signing
- 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
- 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
Demos
- Demos
- Agent approvers within bounds
- Completeness and tamper evidence
- Detection and containment
- Network coverage: an egress observer
- Guardrails: allow, deny, or ask a person
- MCP tools, gated and recorded
- Prompt injection held by provenance
- Why: which input caused the action
Help