Why the schema exists
AI agent activity is emitted from many places: local developer machines, CI jobs, cloud-hosted coding agents, SDK integrations, OpenTelemetry exporters, and runtime-specific hook systems. Each source has its own event names, payload shapes, identifiers, and ideas about what counts as a prompt, tool call, command, approval, file change, or policy decision. Beacon’s unified telemetry schema turns those different signals into one normalized event model. The goal is to make agent activity searchable, detectable, and explainable across local, CI, and cloud environments without requiring every downstream rule, dashboard, or SIEM parser to understand each runtime’s native format.What normalization provides
The schema gives every event a consistent backbone:Provenance: how Beacon knows what it wrote
Normalizing many runtimes into one event shape has a cost: a field that reads the same for every source hides how differently the sources behave.event.action is the field where that matters
most. A Claude Code PermissionRequest hook hands Beacon a typed payload naming the operation. A
Codex OTLP log record hands it a body string that Beacon classifies by pattern, with a fallback for
records that match nothing. Both produce an event.action, and without a marker a detection cannot
tell a report from a reading.
Two optional fields carry that context.
harness.collection_method describes the mechanism that carried the event off the runtime:
event.fidelity describes the specific action on the event:
The two are independent. One OTLP stream carries both kinds: a record that declares its
event.name is observed, while a record carrying only prose is inferred. Both are
collection_method: otlp.
Both fields are optional, and omitted rather than written empty. Events Beacon emits about itself, such as health heartbeats and self-update results, have no collecting harness and no source action to be faithful to, so they carry neither.
Rules can match on both, so a detection that needs certainty can require it:
approval.allowed event so approval-shaped
detections still have something to match. Those events are inferred: nothing was gated, a tool
call was seen. Anything counting real operator decisions should exclude them.
Required fields
event.id is written alongside these: a deterministic UUID identifying the event, described under
event identity. It is not required, so events
written by earlier agent versions remain valid.
Event ordering
Two events can only be reasoned about together if you can tell which came first, so the schema carries two ordering fields.sequence numbers one writer’s stream, not the log as a whole. The hook adapter runs as a
fresh short-lived process per hook and the collector exporter runs as one long-lived export
loop, so neither can see the other’s counter, and a hook event numbered 1 may well have
happened after an exporter event numbered 900. Order by timestamp first and use
sequence only to separate events that tie on it, most often the datapoints of a single
metric export, which all carry that export’s collection instant.
Do not order events by their position in the log. Append order is not emission order: a
hook writes synchronously the moment it intercepts a tool call, while the exporter writes
on its export interval, so an event that happened earlier routinely lands in the file
later. beacon scan and the dashboard’s detection view sort the log by (timestamp, sequence) before evaluating correlation rules for exactly this reason.
How it extends OpenTelemetry
Beacon accepts OpenTelemetry attributes, including the GenAI semantic conventions, and projects them into fields that are easier to query across agent runtimes. OpenTelemetry context is preserved undergen_ai where available, while commonly investigated values are also normalized into Beacon fields such as model, tool.name, prompt.text, command.command, file.path, and gen_ai.usage.
This lets teams use OpenTelemetry-native data without giving up a security-focused vocabulary for agent behavior. A detection can ask for a normalized command, MCP tool, approval decision, or file operation instead of branching on every source runtime’s attribute names.
Why it matters
The normalized schema is the contract between collection, detection, investigation, and forwarding. It lets Asymptote:- Correlate agent activity across local endpoints, ephemeral CI jobs, and cloud agent sessions.
- Write detections once against stable fields instead of per-runtime payloads.
- Preserve source-specific OpenTelemetry and GenAI context without forcing downstream tools to parse raw traces.
- Keep prompt, tool, command, file, approval, policy, and token-usage telemetry comparable across supported harnesses.
- Say how each event was collected and how sure Beacon is of its action, so a consumer can weigh a runtime-reported fact differently from a derived one.
- Forward one predictable JSONL shape into customer-managed analytics, SIEM, object-storage, and review workflows.
Read next
Schema normalization
See how OTLP attributes and hook payloads map into Beacon fields and actions.
Schema fields
Review entities, optional context, and shared top-level fields.
Schema examples
Inspect example events and content handling behavior.
Data inventory
Review runtime coverage and the event fields Beacon can write when a source provides them.
Related
Core Concepts
Review the glossary behind events and entities.
Open Source Architecture
See how runtime telemetry becomes normalized JSONL.
Detections
See how events are evaluated by threat rules.
Wazuh
Configure Wazuh ingestion for Beacon events.
Datadog
Configure Datadog Agent custom log collection for Beacon events.
Sumo Logic
Configure Sumo Logic HTTP Source forwarding for Beacon events.

