There are three ways to get an agent’s work into Rotascale. Two of them require
a deliberate act: import the SDK, or route through the MCP
proxy. This one requires neither.
If your estate already emits OpenTelemetry, point a collector at the receiver and
your existing spans become trajectories — with
taint propagated and authority context intact.
This is the path for agents you already run, rather than ones you are
adopting us for. It is often the fastest way to see which agents in an
organisation are ungoverned, because it needs nothing deployed alongside them.
Point a collector at it
The receiver speaks OTLP/JSON at the standard OTLP HTTP path:
Name the agent
One attribute is required. Set it once on the resource and every span inherits
it:
A span that names a different agent overrides the resource, because being
specific on one span is deliberate.
What becomes a step
Two step kinds are inferred from standard OTel GenAI attributes, and the
asymmetry between them is the design:
llm_call is inferred freely because it introduces no taint — guessing wrong
costs a row in a trajectory. tool_call is inferred only from an unambiguous
signal, because it introduces taint and
taint gates authority.
retrieval and delegation are never inferred. They taint, and no standard
OTel attribute identifies them unambiguously — a database span is not a
retrieval into an agent’s context, and guessing that it is fabricates authority
context. Say so explicitly:
A span we cannot map is skipped and reported, never guessed into a step. The
response names what was dropped and why.
The attributes
rotascale.* is a holding prefix. The mapping belongs upstream at
OpenTelemetry rather than in a vendor’s specification, and the
agent governance specification
deliberately declines to declare it. If it is accepted upstream, these names
change.
What it does not do
The receiver records; it does not authorise. Asking permission is a separate,
deliberate call — an OTLP receiver that quietly consumed budget would turn an
exporter misconfiguration into a spend event.
Retries are safe. Exporters resend on 5xx and timeouts, and duplicate spans are
recognised and ignored rather than appended twice.
Ordering is handled for you. OTLP makes no ordering promise and batch processors
flush on span end, so a nested trace arrives roughly inside-out; spans are
sorted by start time before anything is recorded. This matters more than it
sounds — appending a tool call after the action it should have tainted would
leave that action’s recorded context reading clean.
Closing a trajectory
The root span — the one with no parent — seals the trajectory when it ends. A
batch that does not contain it leaves the trajectory open on purpose: OTel
exports the root last, so a rootless batch is a trace still being written.