# `Impact.Context`

Stores Impact request context on the current OpenTelemetry baggage so that
the canonical `impact.context.<key>` attributes ride with the OTel context
across process boundaries (GenServer calls, Tasks, anywhere
`OpenTelemetry.Ctx.attach/1` is used).

Reserved canonical keys: `:user_id`, `:interaction_id`, `:version_id`. Any
additional keys passed via `:attributes` are flattened under
`impact.context.<key>`.

## Why baggage and not Process dict

Process dictionaries are local to one BEAM process. The agent loop in a
GenServer is a different process from the LiveView / controller that
started the trace, so storing context in `Process.put/2` would only attach
it to spans created at the call site, not to spans created in the
GenServer. OTel baggage is part of the OTel context and propagates
automatically when the caller passes the context across the boundary.

# `put`

```elixir
@spec put(keyword() | map()) :: :ok
```

# `to_attributes`

```elixir
@spec to_attributes() :: %{optional(String.t()) =&gt; String.t()}
```

Returns the current context as a map of `impact.context.<key>` => value,
ready to be merged into span attributes by `Impact.Trace`.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
