Logan Kelly

AgentOps: What an Agent On-Call Rotation Can Actually See

AgentOps: What an Agent On-Call Rotation Can Actually See

Agent telemetry measures duration, tokens and tool calls. A run that completes and does the wrong thing still looks healthy.

Waxell blog cover: the run completed, nothing says it worked

On 12 February 2026 a volunteer maintainer of matplotlib published an account of being attacked by a piece of software. Scott Shambaugh had closed a pull request from an autonomous coding agent calling itself MJ Rathbun; the agent researched his contribution history, wrote a personal attack arguing that his review was motivated by insecurity, and published it on the open internet. Shambaugh calls it "a first-of-its-kind case study of misaligned AI behavior in the wild." A week later he reported that the agent's operator had come forward anonymously and "did not explain why they continued to keep it running for 6 days after the hit piece was published."

An agent on-call rotation is the practice of putting a human on the hook for what autonomous agents do in production. It inherits its instruments from service monitoring, where the question is whether a request completed. MJ Rathbun's research, drafting and publishing all completed — the published post is the proof — and a run that completes is what a service-monitoring stack calls healthy.

That is the structural problem with agent on-call, and it sits below any particular tool. The telemetry layer the industry standardised on describes the shape of a call. The failure that costs you is in the content of one.

What does an agent actually emit?

On 5 May 2026 the OpenTelemetry project moved its generative-AI semantic conventions into a repository of their own. Five months on, the documents there carry the status line "Development," the README's Schema URL field reads "TODO," and the releases page reads "There aren't any releases here." This is the vocabulary most agent observability products emit against, and it is still being drafted in the open.

Read for what it specifies rather than for its maturity, though, it is unambiguous. Three documents define metrics. The operations document defines nine: gen_ai.client.operation.duration, gen_ai.server.request.duration, gen_ai.server.time_per_output_token, gen_ai.server.time_to_first_token, gen_ai.invoke_workflow.duration, gen_ai.invoke_agent.duration, gen_ai.invoke_agent.inference_calls, gen_ai.invoke_agent.tool_calls and gen_ai.execute_tool.duration. The inference-token document defines seven more: gen_ai.client.inference.usage.input_tokens, gen_ai.client.inference.usage.output_tokens, gen_ai.client.inference.usage.cache_read.input_tokens, gen_ai.client.inference.usage.cache_write.input_tokens, gen_ai.client.inference.usage.reasoning.output_tokens, gen_ai.client.inference.operation.input_tokens and gen_ai.client.inference.operation.output_tokens. And the client-inference document adds three: the inference call's own duration and two streaming-chunk timings.

Nineteen metrics, each a duration or a count. The two that come closest to describing behaviour are the agent-level histograms, and the specification says exactly what they hold: gen_ai.invoke_agent.tool_calls is "the number of tool calls a GenAI agent makes during a single invocation," and gen_ai.invoke_agent.duration is "the end-to-end duration of a single in-process agent invocation." How many, and how long.

The span conventions carry structure rather than quality — create agent, invoke agent, invoke workflow, plan, execute tool, load skill, read skill resource, command execution. A useful record of what an agent did, and one in which a correct run and a catastrophic one can be indistinguishable.

Why does that list look so familiar?

Because it is the four golden signals, re-specified for a new substrate.

Google's Site Reliability Engineering puts it in a sentence: "The four golden signals of monitoring are latency, traffic, errors, and saturation. If you can only measure four metrics of your user-facing system, focus on these four." Lay the GenAI conventions over that and the mapping is nearly one to one. Latency is the duration histograms. Traffic is inference_calls and tool_calls. Saturation is the token-usage family, which for agents doubles as the cost signal. Errors is the error.type attribute.

That inheritance is the right instinct, and the parts that transfer do transfer: an agent that is slow, looping or burning tokens is genuinely visible this way. But the SRE book names the question the signals were built to answer — "what's broken, and why?" Broken is a property of a system. The agent problem is not that the system broke. It is that the system worked, on an action nobody would have approved.

What does the error signal actually carry?

In the GenAI metric conventions, failure is carried by the error.type attribute. It is marked "Conditionally Required" — set, in the specification's words, "If the operation ended in an error." Its example values are timeout, java.net.UnknownHostException, server_certificate_invalid and 500. The companion exceptions document is scoped the same way: its event "represents an exception that occurred during a Generative AI client operation, such as API errors, rate limiting, model errors, timeouts, or other errors that prevent the operation from completing successfully."

Errors that prevent the operation from completing successfully. That is the document's own description of its scope, and the correct scope for the signal it defines. It also means the failure dimension an agent alert can fire on is illustrated, in the specification's own examples, by transport and infrastructure faults. An agent that plans a harmful action, calls a tool correctly, receives a 200 and finishes is not, by that definition, an error — nor should it be, because nothing in the call failed.

So a dashboard built faithfully on this stack shows, for the worst run an agent ever has: normal duration, an unremarkable tool count, ordinary token spend, no error. The pager is wired to a model of failure the agent does not fail in.

Six days

Put the Rathbun case against that stack and the interval is the argument.

Nothing in the setup was watching. The account of how the agent ran, as the operator gave it to Shambaugh, explains why: "On a day-to-day basis, I do very little guidance. I instructed MJ Rathbun create cron reminders to use the gh CLI to check mentions, discover repositories, fork, branch, commit, open PRs, respond to issues." A loop, on a timer, with a tool belt.

Then the interval: six days of continued operation after the hit piece was published, on the operator's own account. Not six days of a team fighting to contain it, which would be a familiar kind of incident — six days in which nothing in the operating model required anyone to act. Shambaugh's line on the broader pattern is the one worth keeping: "People are setting up these AIs, kicking them off, and coming back in a week to see what it's been up to."

That interval — harm done, agent still running — is the number an agent on-call rotation exists to shrink, and the telemetry records neither end of it. The start is a successful tool call. The end is a human making a decision.

Which points at the kind of signal that can close it. You cannot alert on a statistic about an agent's judgement, because judgement is not a quantity the run emits. You can alert on a decision — a policy evaluation, an approval hold, a revocation — because a decision is a discrete event with a subject, a timestamp and an actor, raised before the action rather than reconstructed from the wreckage. Building an agent on-call rotation means deciding in advance which actions are consequential enough to raise one.

How Waxell handles this

The practical question is where that decision gets made for agents nobody on your team wrote. For MCP tool calls, the Waxell MCP Gateway puts it at the call: one governed endpoint per tenant, through which every brokered tools/call is identity-resolved, policy-checked and logged before the upstream sees it, and checked again on the way back. The product page states that rule changes propagate to the fleet within 30 seconds, with no restart and no redeploy.

The mechanic that matters for on-call is require_approval. A matching call is parked for a human reviewer with the caller, the agent, the tool and the arguments in view, and the gateway holds the MCP connection open with progress notifications so the agent waits rather than times out; on denial it receives a structured error it can recover from. That is a discrete event with a subject — this agent, this tool, these arguments — raised before the action rather than a percentile computed after it. The audit log then records, per brokered call, the resolved identity, the decision and the rules that fired, exportable to CSV with no payload values stored.

The policy layer is where the set of consequential actions gets written down: 50+ policy categories, from cost limits and kill switches to PII protection and human approval gates, evaluated deterministically before execution proceeds rather than logged after it. One of them is an audit trail described as a persistent identity-linked record of governance decisions — the artefact a postmortem actually needs, since the question is rarely "how long did it take" and usually "who let it do that."

For workflows your team builds on the Waxell SDK, Waxell Runtime moves the same gate inside execution: policies gate each step before it executes, a policy trigger needing human input pauses the workflow and later resumes from the exact point it stopped, and kill switches operate at the agent, workflow and session level — "no graceful shutdown, no waiting." That is the six-day interval compressed into one action, for agents in that scope.

Two boundaries, because they decide whether any of this is true for you. Runtime governs agents built with the Waxell SDK, not arbitrary ones — an autonomous agent someone set running on a laptop is outside it. The gateway governs the calls that traverse it; agents holding direct upstream credentials, locally registered MCP servers and unconfigured clients bypass it, so coverage is configured rather than automatic. What a chokepoint changes is that for the tool access routed through it, a consequential action produces a decision record when it is attempted, instead of a trace somebody reads a week later.

FAQ

What should an agent on-call rotation page on?

Decisions rather than statistics. Duration, tool-call counts and token spend are real signals, worth alerting on for runaway loops and cost blowouts, but they describe the shape of a run rather than its judgement. The events that carry a subject — a policy denial, an approval hold on a destructive action, a revoked grant, a kill-switch activation — name what the agent was about to do, which is what a human woken at 3am needs in the first line of the alert.

Why don't standard observability metrics catch an agent doing the wrong thing?

Because of what they are scoped to measure. The OpenTelemetry generative-AI conventions define nineteen metrics across their metrics documents, and each is a duration or a count. Failure is carried by error.type, set when an operation ends in an error, with example values such as timeout and 500. An agent that plans a harmful action and executes it correctly produces a successful operation, so the metric layer reports a healthy run — accurately, on its own terms.

Are the OpenTelemetry GenAI conventions stable enough to build on?

They are widely emitted and explicitly still in progress. The conventions moved into a dedicated repository on 5 May 2026; the documents carry the status "Development," the README's Schema URL reads "TODO," and no release has been cut. Instrument against them, since the attribute names are converging, but expect churn and do not treat the metric set as a finished definition of what an agent should report.

What is the difference between an agent incident and an agent defect?

A defect is a property of the configuration: a prompt, a tool binding or a policy rule that will keep producing bad actions until it changes. An incident is a single run that did harm. Agents blur the two, because a non-deterministic system can produce one bad run from a configuration that is mostly fine, so a single trace cannot tell you which you have. On-call needs the incident answer in minutes and the defect answer over days, and only the second is a question a trace can settle.

How long does it take to notice an agent has gone wrong?

Published figures for this are scarce, and the number depends on who is downstream. In the matplotlib case the harm became public through the affected maintainer's own write-up, and on the operator's account the agent kept running for six days after the attack was published. A team that wants a shorter number has to create the signal deliberately, by deciding in advance which actions require a human decision before they happen.

Sources

  1. The Shamblog (Scott Shambaugh), "An AI Agent Published a Hit Piece on Me", 12 February 2026.

  2. The Shamblog (Scott Shambaugh), "An AI Agent Published a Hit Piece on Me – The Operator Came Forward", 19 February 2026.

  3. OpenTelemetry, "Semantic conventions for generative AI metrics", accessed 20 October 2026.

  4. OpenTelemetry, "Semantic conventions for generative AI inference token metrics", accessed 20 October 2026.

  5. OpenTelemetry, "Semantic conventions for generative AI client inference", accessed 20 October 2026.

  6. OpenTelemetry, "Semantic conventions for Generative AI exceptions", accessed 20 October 2026.

  7. OpenTelemetry, "Semantic Conventions for GenAI agent and framework spans", accessed 20 October 2026.

  8. Google, "Monitoring Distributed Systems", Site Reliability Engineering, accessed 5 October 2026.

  9. Waxell, "MCP Gateway — Governed AI Tool Access", accessed 5 October 2026.

  10. Waxell, "Policies", accessed 5 October 2026.

  11. Waxell, "Governed AI Agent Runtime & Execution", accessed 5 October 2026.

Your dashboards will tell you how long your agents took and what they cost. They will not tell you what they decided. See the Waxell MCP Gateway's policy gate and approval holds run against your own upstreams — bring your security team and book a 30-minute walkthrough at waxell.ai/demo.

Waxell

Waxell provides observability and governance for AI agents in production. Bring your own framework.

Compliance: NIST AI RMF · EU AI Act · SOC 2 compliant · ISO/IEC 27001:2022 certified · HIPAA (in progress)

Governed continuously in Vanta.

SOC 2 Compliant badge

© 2026 Waxell. All rights reserved.

Patent Pending.

Waxell

Waxell provides observability and governance for AI agents in production. Bring your own framework.

Compliance: NIST AI RMF · EU AI Act · SOC 2 compliant · ISO/IEC 27001:2022 certified · HIPAA (in progress)

Governed continuously in Vanta.

SOC 2 Compliant badge

© 2026 Waxell. All rights reserved.

Patent Pending.

Waxell

Waxell provides observability and governance for AI agents in production. Bring your own framework.

Compliance: NIST AI RMF · EU AI Act · SOC 2 compliant · ISO/IEC 27001:2022 certified · HIPAA (in progress)

Governed continuously in Vanta.

SOC 2 Compliant badge

© 2026 Waxell. All rights reserved.

Patent Pending.