# The canonical event

One schema everything revolves around, always expressible as OpenTelemetry gen_ai.* attributes.

> Status: Design

## One schema, three ingestion paths

SDK, OpenTelemetry, and proxy all normalise to a single canonical event. None is preferred; all are first-class. Field names are snake_case and must always be expressible as OTel gen_ai.* attributes, so nothing is trapped behind a proprietary shape.

- trace_id, span_id — the run identity.
- model, provider — what was called.
- prompt_tokens, completion_tokens, total_tokens — the usage.
- latency_ms, cost_usd — computed at ingestion from the pricing registry.

## Cost is computed, not trusted

cost_usd is derived at ingestion time from a sourced, effective-dated pricing registry — never taken from the client. An unknown or stale price produces an explicit outcome, not a guessed number.
