Ordinary software, when it breaks, usually breaks in a way you can reproduce. You read the error, you find the line, you run it again and watch it fail the same way twice, and the path from symptom to cause is a matter of patience. An agent is not like this. When an agent does something wrong — takes a step that made no sense, called a tool it should not have, talked itself into a conclusion no one wanted — the first question is not how to fix it but what actually happened, and for a system whose behavior emerges from a model reasoning over a context you only partly controlled, that question is genuinely hard to answer. Observability is the discipline of being able to answer it.
This is a different thing from knowing whether the agent works. Tests and evaluations tell you, in aggregate, how often the system succeeds and fails, and they are indispensable for that, but they speak in averages and they speak before deployment. Observability speaks about the single run that just went wrong in production, the specific instance a real user just hit, the one trajectory out of thousands that veered off in a way no benchmark anticipated. It is the difference between knowing your agent succeeds eighty percent of the time and being able to explain why it failed this particular time, and only the second kind of knowledge lets you actually improve the thing.
The argument of what follows is that observability is not an accessory you bolt onto an agent once it is built but a precondition for building one you can trust at all. An agent you cannot see inside is an agent whose failures are mysteries, whose improvements are guesses, and whose behavior in the world you are simply hoping is fine. Making the system observable — instrumenting it so that what it did and why is recoverable after the fact — is what turns operating an agent from an act of faith into an act of engineering, and it is worth understanding as its own discipline rather than as a footnote to building the agent itself.
What observability actually means
It is worth separating observability from monitoring, because the two are often confused and the distinction matters. Monitoring is watching a set of known signals for known problems — is the service up, is the error rate normal, is latency within bounds — and it answers questions you decided to ask in advance. Observability is the broader property of being able to ask new questions of a system after the fact, questions you did not anticipate when you built it, and to answer them from the data the system already emitted. Monitoring tells you that something is wrong; observability lets you figure out what, even when the what is something you never thought to watch for.
For ordinary software the gap between the two is often narrow, because the failure modes are mostly known and a handful of dashboards covers them. For agents the gap is enormous, because the ways an agent can go wrong are open-ended in a way that resists enumeration. You cannot list in advance every bad trajectory a reasoning system might take, every odd interaction between a prompt and a piece of retrieved data, every way the model might misread a situation, and so you cannot rely on having set up exactly the right alert ahead of time. You need the deeper property: enough recorded detail that when something surprising happens, you can reconstruct it and understand it without having predicted it.
The working definition, then, is this: a system is observable to the degree that you can reconstruct what it did and why from the data it emitted, without having to reproduce the failure and without having anticipated the specific question. The phrase to dwell on is what it did and why, because for an agent the why lives inside the model's reasoning over its inputs, and reconstructing it means having captured not just the actions the agent took but the information it was acting on. An agent that emits only its outputs is barely observable at all; an agent that emits the full record of what it saw and chose at each step is one you can actually understand.
Why agents are harder to observe than ordinary software
Figure 1. The behavior of an agent does not live in the code; it emerges where code, model, and data meet, and the same input can branch many ways.
The reason agents demand more of observability than conventional software is that their behavior is not written down anywhere you can read it. In ordinary code, the logic is the code — you can study the source and know, in principle, what the program will do with any input, because the behavior is fully determined by instructions a person wrote. An agent's behavior is not in its code in this way. The code sets up a loop and hands control to a model, and what the agent does emerges from the model's reasoning over a context assembled at runtime, which means you can read every line of the agent's source and still not know what it will actually do when it runs.
This makes the runtime, not the source, the place where the truth lives, and it is why instrumenting the running system is not optional. The same agent given what looks like the same task may take different paths on different runs, because the model is probabilistic and small differences in context steer it differently, and so behavior you need to understand cannot be recovered by inspecting the program at rest. It exists only in the particular execution, in the specific sequence of reasoning and action that happened that one time, and if you did not capture that execution as it happened, it is gone — there is no line of code you can go back and read to learn what the model was thinking.
The consequence is that the burden shifts from understanding the program to recording its behavior. Where a conventional system can often be debugged by reading and reasoning about its code, an agent must be debugged by reading the record of what it actually did, because the code does not contain the answer. This is a genuine inversion: the most important artifact is no longer the source you wrote but the trace the system emitted, and a team that treats the trace as an afterthought is trying to understand a non-deterministic system through the one lens that cannot show its behavior. Observability for agents begins with accepting that the runtime is where the truth is, and building to capture it.
The trace as the unit of truth
Figure 2. A trace is the complete, ordered record of one run, decomposed into nested spans — the model calls, tool calls, and retrievals that the agent performed.
If the runtime holds the truth, the trace is how you hold onto it: the complete, ordered record of a single run from the request that started it to the result it produced, with every step in between. A trace is to an agent what a stack trace and a log together are to a crashing program, except richer, because it must capture not only what the agent did but what it saw at each point — the inputs to every model call, the outputs, the tool invocations and their results, the retrievals and what they returned. The trace is the ground truth of a run, the artifact you reach for first when something has gone wrong, and the quality of your observability is largely the quality of your traces.
What makes the trace so central is that it is the only thing that can answer the question you most often need answered, which is where, in a long sequence of steps, the run went off course. An agent failure is rarely a single obvious error; it is usually a trajectory that was fine for a while and then diverged, and finding the point of divergence means walking the run step by step. Without a trace you are reduced to guessing — re-running the agent and hoping it fails the same way, reasoning about what might have happened from the wreckage of the final output — and with non-deterministic behavior that guessing is often hopeless. With a trace you simply read what happened.
The discipline this implies is that the trace must be complete enough to stand in for the run entirely, because a trace with gaps is a trace that will be missing exactly the step you need. It is tempting to record only the headline events — the final answer, the obvious actions — and to skip the intermediate reasoning and the unglamorous details, but the step you skipped is precisely the one where the failure will turn out to have started. A trace earns its place as the unit of truth only when it is faithful, when reading it is genuinely equivalent to having watched the run happen, and building toward that fidelity is the foundational work of making an agent observable.
Spans, steps, and the anatomy of a trace
A trace is not a flat list but a structure, and understanding that structure is how you read it. The natural decomposition is into spans, each span a unit of work with a beginning and an end — a single model call, a single tool invocation, a retrieval, a call to a sub-agent — and spans nest, because work contains work. A run is a span; inside it, the agent's first turn is a span; inside that, the model call is a span and the tool call it produced is another. The nesting mirrors the agent's own structure, and a well-formed trace is a tree whose shape tells you at a glance how the run unfolded.
Each span carries the detail that makes it useful, and deciding what to record on a span is where observability is won or lost. At minimum a span needs its timing — when it started, how long it took — because latency problems are read off the trace by finding the span that took too long. It needs its inputs and outputs — what went into the model call and what came back, what arguments the tool was given and what it returned — because correctness problems are read off the trace by finding the span where the output stopped making sense. And it needs enough identity to place it in the tree, so that you can see not just that a tool was called but where in the run, after what reasoning, in service of what.
The reason this anatomy matters is that it turns a run from an opaque event into something you can navigate. A trace structured into nested, well-described spans can be explored the way you explore a stack trace, drilling from the top-level run down into the particular step you suspect, expanding it to see exactly what the model saw and produced there. A run recorded as an undifferentiated blob of text, by contrast, has to be read linearly and searched by hand, and the structure that would have led you straight to the problem is missing. The span tree is what makes a trace queryable rather than merely stored, and queryability is what makes it fast to debug.
Logging what the model saw, not just what it did
There is one principle that separates observability for agents from observability for ordinary software more than any other: you must capture what the model saw, not only what it did. An agent's action is a function of its input — the context window the model reasoned over — and if you record only the output, a wrong action becomes uninterpretable, because you cannot tell whether the model reasoned badly over good information or reasoned reasonably over bad information. The same mistaken tool call means two completely different things depending on what the model was looking at when it made the call, and you cannot know which without the input.
This makes the exact context assembled for each model call the single most valuable thing to log, and also the most often neglected. It is easy to record the model's output, because the output is what your code receives and acts on, but the input — the full prompt, the retrieved documents, the conversation history, the tool results folded back in — is assembled inside your system and then handed off, and it is tempting to treat it as ephemeral. Yet the input is where most agent failures actually originate, in a retrieval that returned the wrong passage, a piece of history that crowded out what mattered, an instruction that conflicted with another, and none of these is visible unless you captured exactly what the model was given.
The payoff of logging the input is that it collapses a whole category of debugging from speculation into reading. When an agent does something inexplicable and you have its exact context, the explanation is usually right there — you see the misleading document it was fed, the ambiguous instruction it followed literally, the stale fact it reasoned from — and the fix becomes obvious because the cause is visible. When you have only the output, you are left to theorize about what the model might have seen, to reconstruct the input by guesswork, and the debugging becomes an exercise in imagination rather than observation. Capturing the input is the difference between an agent whose mistakes explain themselves and one whose mistakes remain forever mysterious.
The three signals: traces, metrics, and logs
Figure 3. Three kinds of signal answer three kinds of question: traces describe single runs, metrics summarize many, and logs record discrete events.
Classical observability is often described in terms of three signals, and the framing transfers usefully to agents as long as you reinterpret each for what an agent actually does. Traces, as discussed, describe individual runs in full detail and answer the question of what happened in this specific case. Metrics aggregate across many runs and answer the question of how the system is behaving overall and over time. Logs record discrete events — something happened, here is a note of it — and answer the question of whether a particular thing occurred. Each addresses a class of question the others cannot, and a system instrumented with all three can be interrogated from every direction.
The reason you need all three rather than one is that the questions they answer are genuinely different and you will need to ask all of them. When a single user reports a bad experience, you reach for the trace of their run, because you need the full detail of that one case. When you want to know whether the agent has gotten worse since last week's change, you reach for metrics, because the question is about a trend across thousands of runs that no single trace can show. When you want to know whether a rare condition ever fires, you reach for logs, because you need a searchable record of discrete occurrences. Reaching for the wrong signal — trying to spot a trend in individual traces, or trying to debug one case from aggregate metrics — is slow and often impossible.
What ties the three together in practice is the ability to move between them, and the best observability setups make that movement easy. A spike in an error metric should lead you to the traces behind it, so you can see what those failing runs actually did; a suspicious log event should link to the trace it occurred in, so you can see its context; a puzzling trace should let you ask how common its pattern is across the metrics. The signals are most powerful not in isolation but as a connected whole, where a question that starts in the aggregate can be chased down to the specific and a detail found in the specific can be checked against the aggregate, and building those connections is part of building observability that actually gets used.
Metrics that actually mean something for agents
The metrics inherited from conventional software — uptime, error rate, latency — remain necessary for agents but are badly insufficient, because they measure whether the system is running, not whether it is doing its job. An agent can be perfectly up, throwing no errors, responding quickly, and still failing most of the tasks it is given, because its failures are not crashes but bad answers and wrong actions that the infrastructure registers as complete successes. To observe an agent meaningfully you need metrics that capture the quality of its work, and those have to be designed around what the agent is actually for.
The metrics that matter are the ones that track task outcomes and the shape of the agent's behavior. Task completion rate — how often the agent actually accomplishes what it was asked — is the headline, even though it is harder to measure than uptime because it requires judging success. Around it sit metrics that reveal how the agent is working: steps taken per task, which rises when the agent is struggling; tool-call success rate, which falls when the agent is misusing its tools; retry and self-correction frequency, which signals where the agent keeps getting things wrong; and human intervention or escalation rate, which measures how often the agent has to hand off to a person. These numbers describe the agent's competence, not merely its availability.
What makes these behavioral metrics valuable is that they move before disasters do, giving you warning rather than postmortem. A creeping rise in steps per task or in retry frequency often signals that something has degraded — a model update, a drift in the kind of inputs arriving, a prompt change with unintended effects — well before that degradation shows up as outright failures users complain about. An agent watched only through uptime and errors looks healthy right until it visibly is not; an agent watched through metrics tuned to its actual work shows the strain early, while there is still time to investigate. Choosing metrics that mean something is what turns monitoring from a smoke alarm into an instrument panel.
Token cost and latency as first-class signals
Two signals deserve singling out because they are peculiar to how agents work and easy to neglect until they hurt: the token cost and the latency of each run. An agent's reasoning is not free — every model call consumes tokens that cost money and time, and an agent that loops, retrieves liberally, and reasons at length can consume a great deal of both — and unlike a conventional system, where cost and speed are mostly fixed properties of the code, an agent's cost and speed vary with its behavior run to run. This makes them not just operational concerns but signals about what the agent is doing.
Watching cost and latency per task surfaces a class of regression that functional tests miss entirely, because the agent can get more expensive or slower while remaining perfectly correct. A prompt change that improves answers but doubles the tokens consumed passes every quality check while quietly doubling the bill; a new tool that the agent calls more often than expected adds latency that no correctness test would flag; a subtle change that sends the agent into longer reasoning loops degrades the experience without ever producing a wrong answer. None of these is a failure in the sense a test would catch, and all of them are exactly the kind of thing you want to know about, which is why cost and latency deserve to be watched as first-class signals rather than noticed only when the invoice arrives.
Treating them as first-class also disciplines the agent's design, because what you measure you tend to manage. A team that tracks tokens per task notices when a change makes the agent profligate and asks whether the extra reasoning was worth it; a team that tracks latency per task notices when the agent has become sluggish and looks for the step that slowed it down. These signals tie the agent's behavior to its real-world costs in a way that keeps the system honest, ensuring that the pursuit of better answers does not silently produce an agent too expensive or too slow to actually use. Observability here is not only about catching failures but about keeping the agent's appetite proportionate to its value.
Debugging a run after the fact
The payoff of all this instrumentation shows up at the moment something has gone wrong and you need to understand it, and the workflow that good observability enables is fundamentally different from the one it replaces. Without traces, debugging an agent means trying to reproduce the failure — re-running it with the same inputs and hoping the non-determinism cooperates, which it often will not — and reasoning backward from the final output about what might have happened. With a faithful trace, debugging means reading: you pull up the run, you walk its steps in order, you find the point where the trajectory first went wrong, and you look at what the model saw at that point. The failure stops being a mystery to reproduce and becomes a record to inspect.
The structure of the trace turns this from a slog into something close to navigation. You start at the top, see the overall shape of the run, and form a hypothesis about which phase went wrong; you drill into that phase, expand its spans, and narrow to the specific step; you open that step and find the model's exact input and output, where the cause usually reveals itself. Because the trace is a tree of well-described spans rather than a wall of text, you can move quickly from the symptom at the top to the cause buried deep in the run, and the time from a reported problem to an understood one collapses from hours of speculation to minutes of reading.
The most powerful version of this workflow is replay — taking the exact captured input to a step and running it again in isolation, so you can test a fix against the precise conditions that produced the failure. Because you logged what the model saw, you can reconstruct that moment perfectly, feed it to a revised prompt or a different model, and see whether the change actually fixes the case without having to wait for the failure to recur naturally in production. Replay closes the loop between observing a failure and confirming its repair, and it is only possible because the trace captured the input faithfully in the first place — another reason that logging what the model saw is the foundation everything else is built on.
Observability and evaluation: two halves of one loop
Observability and evaluation are often treated as separate concerns — one about production, one about testing — but they are most powerful understood as two halves of a single improvement loop, each feeding the other. Evaluation tells you, before you ship, how well the agent performs against a set of cases you have assembled; observability tells you, after you ship, what actually happened in the cases you did not anticipate. The connection is that the failures observability surfaces in production are precisely the raw material evaluation needs to grow, because every real failure is a case your eval suite did not have and should.
The loop runs like this: observability catches a failure in the wild, the trace lets you diagnose it, and then — this is the step that compounds — you turn that diagnosed failure into a permanent evaluation case, so that the specific way the agent went wrong becomes something every future version is tested against. The fix you make is verified against this new case before it ships, and the case stays in the suite forever, guarding against that failure ever silently returning. Production becomes a discovery mechanism for the gaps in your evaluation, and evaluation becomes the memory that ensures discovered gaps stay closed.
This is why investing in observability pays off far beyond the immediate debugging, and why the two disciplines should be built to connect. An agent instrumented so that any production trace can be lifted into an eval case has a flywheel the agent without it lacks: real usage continuously sharpens the test suite, the test suite continuously protects against regression, and the agent's reliability ratchets upward rather than drifting. Treating observability and evaluation as a connected loop rather than separate boxes is what turns the steady stream of production failures from a source of recurring pain into a source of permanent improvement, each failure paid for once and then defended against forever.
Detecting failure before a user reports it
Figure 4. Detection turns raw signals into action: events are aggregated, checked against expectations, and surfaced to a human when something looks wrong.
Reading traces works when you know which run to read, but at any scale you cannot read them all, and the failures you most need to catch are the ones no one has reported yet. This is the problem of detection — automatically noticing that something has gone wrong among a flood of runs, so that a human's attention is directed to the few that need it. Detection is what stands between an agent whose problems surface only when users complain and one whose problems surface while there is still time to fix them quietly, and it is built from several kinds of signal layered together.
Some signals are explicit and cheap. Errors and exceptions, guardrails tripping, tools returning failures, runs exceeding their step or token budgets — these are unambiguous markers that something went wrong, and every one of them should raise its trace for inspection. Other signals are statistical: a metric moving outside its normal range, a sudden rise in retries or escalations, a distribution of outputs shifting in a way that suggests the agent's behavior has changed. And some require judgment that only a model can apply at scale — running an automated judge over a sample of runs to flag those whose quality looks poor, catching the failures that are not errors but simply bad answers, the kind no exception will ever mark.
The art of detection is calibrating it so that the alerts mean something, because a detector that fires constantly trains everyone to ignore it and a detector that never fires is not watching the right thing. Tuned well, detection turns the unmanageable problem of overseeing thousands of runs into the manageable one of reviewing the handful the system has flagged as suspicious, concentrating human attention exactly where it is most likely to be needed. The goal is not to replace human judgment but to direct it — to ensure that of all the runs an agent performs, the ones a person actually looks at are the ones most likely to be teaching you something, rather than a random or merely complained-about sample.
The signals users give you for free
Among the richest sources of failure detection is one that costs nothing to collect because users produce it spontaneously: the signals embedded in how people respond to the agent. When an agent does poorly, users rarely file a report, but they almost always react — they retry the same request, they rephrase it in frustration, they correct the agent, they abandon the task halfway, they escalate to a human, they thumb the response down. Each of these is a signal that the agent fell short, supplied not by an evaluator you paid but by the natural behavior of someone who wanted something and did not get it.
These implicit signals are valuable precisely because they reflect real dissatisfaction rather than a proxy for it, and capturing them turns ordinary usage into a continuous stream of quality feedback. A spike in retries on a particular kind of request points to a category the agent handles badly; a pattern of users rephrasing before they succeed reveals where the agent misunderstands; a rise in mid-task abandonment marks where the agent loses people. None of this requires asking users anything, because they are already telling you through their actions, and an agent instrumented to capture these reactions has a detector for failure that is both cheap and grounded in genuine user experience.
The discipline is to capture these signals deliberately and to read them honestly, because they are easy to collect and easy to ignore. It takes intention to log not just what the agent did but how the user responded to it, to connect a thumbs-down or an abandonment back to the trace that earned it, and to treat the accumulation of these small negative signals as the early warning it is. An agent team that watches its implicit user signals closely learns about its failures faster than one that waits for explicit reports, because most dissatisfied users never report anything — they simply leave, and the only record of their disappointment is the behavioral trail they left behind, which you either captured or lost.
The human in front of the dashboard
All of this instrumentation ultimately serves a person trying to understand the system, and observability that forgets this produces data no one can use. The measure of an observability setup is not how much it records but how quickly a human can find the answer they need in it, and those are very different things — a system can capture everything and still be useless if finding the relevant detail means wading through an ocean of noise. The goal is comprehension, not volume, and designing for comprehension means thinking about the questions a person will actually ask and making those questions fast to answer.
This puts a real burden on how signals are surfaced, because the same information can be presented in a way that illuminates or in a way that buries. A dashboard that shows fifty metrics with equal weight tells you nothing about which one matters right now; a trace view that dumps raw text forces you to read linearly what a structured view would let you navigate; an alert that fires without context sends you hunting for the run it refers to. Good observability does the work of foregrounding what is likely to matter — the metric that moved, the step that failed, the trace behind the spike — so that the human arrives at the relevant detail in seconds rather than assembling it by hand.
The test worth applying is to imagine the person who will use this at the worst moment — woken at night because something is wrong, with little context and high stakes — and to ask whether the observability they have will let them understand the problem quickly. That person does not need more data; they need the right data surfaced clearly, a path from the symptom they were alerted to down to the cause they must fix. Building toward that moment, designing the dashboards and trace views and alerts around the question a stressed human will actually need answered, is what separates observability that gets used from observability that merely exists, recording faithfully while helping no one.
Privacy, retention, and what you must not keep
The same property that makes traces valuable makes them dangerous: a faithful trace captures everything the agent saw, and what the agent saw often includes things you should be careful about keeping. User messages, retrieved documents, personal data folded into the context, occasionally secrets that slipped into a prompt — all of it lands in the trace, because the trace records the input faithfully and the input contained it. An observability system logging agent runs is therefore also, inadvertently, a system accumulating sensitive data, and treating that accumulation casually is how a debugging tool becomes a liability.
The tension is real and cannot be wished away, because the data you most need to debug is often exactly the data you should be most careful with. You want the full context to understand failures, but the full context may contain personal or confidential information you have an obligation to protect; you want to retain traces long enough to spot trends, but indefinite retention of sensitive data is a growing risk the longer it sits. Resolving this means making deliberate choices rather than defaulting to logging everything forever — redacting or masking the most sensitive fields before they are stored, limiting how long traces are kept, controlling who can read them, and deciding consciously what genuinely needs to be captured versus what is being captured merely because it was there.
The principle worth holding is that observability data deserves the same care as any other sensitive data the system handles, and often more, because it concentrates in one place everything the agent ever touched. It is easy, in the rush to instrument thoroughly, to build a trace store that quietly becomes the most sensitive database in the system, comprehensively logged and loosely guarded, and that is a failure of design as much as any missing metric. Building observability responsibly means weighing the debugging value of each piece of captured data against the risk of holding it, and accepting that the most observable possible system is not the goal — the goal is a system observable enough to operate while disciplined enough to be trusted with what it records.
The overhead of watching
Observability is not free, and pretending otherwise leads to systems that either skimp on it or drown in its cost. Capturing full traces of every run consumes storage that grows without bound, adds latency as data is recorded and shipped, and produces volumes of detail that themselves cost money to keep and to query. An agent instrumented with no regard for overhead can find that its observability costs rival its operating costs, and the natural but wrong response — to record less of everything — tends to drop exactly the detail you needed while keeping the bulk you did not.
The better approach is to spend the observability budget where it returns the most, which usually means sampling rather than recording uniformly. Failures are worth capturing in full every time, because a failure you did not trace is a debugging opportunity lost, but successes are repetitive and a representative sample of them is often enough to track the metrics and spot the trends that matter. Keeping every error and a fraction of the successes preserves the detail you need for debugging while cutting the volume dramatically, and tuning that sampling — heavier where runs are risky or costly, lighter where they are routine — lets you match the depth of observation to the value of what is being observed.
What makes this tractable is recognizing that the overhead must stay proportionate to the system it watches, and treating that proportion as something to manage rather than ignore. Observability that costs as much as the agent is not serving the agent; observability so thin it misses the failures is not serving it either, and the right point sits between, found by deciding deliberately what each kind of run is worth recording. The aim is not to watch everything but to watch enough — to capture the failures completely, sample the successes representatively, and keep the whole apparatus light enough that it remains a help to running the agent rather than a second system whose own weight becomes a problem.
Building observability in from the start
The final lesson is that observability is far easier to build in than to bolt on, and an agent designed from the beginning to be observable is a fundamentally different thing from one instrumented in a panic after it has started failing in production. When the agent's loop is built with tracing as part of its structure — each step emitting its span, each model call recording its input and output, each tool invocation logged as it happens — the trace falls out naturally from how the agent runs, faithful because it was never an afterthought. When observability is added later, it is always partial, threaded awkwardly through code that was not built to emit it, missing exactly the steps no one thought to instrument.
This argues for treating observability as architecture rather than as tooling, a property designed into the shape of the agent rather than a layer applied to its surface. The decision of what a span is, what each step records, how the trace is structured — these are design decisions about the agent itself, and making them early means the agent grows up observable, with the instrumentation woven into its loop rather than draped over it. An agent built this way is one whose every run is legible by construction, where understanding what happened is never blocked by a step that failed to record itself because recording was always part of what a step does.
The cost of getting this wrong is paid at the worst possible time, which is when the agent is already in production and already failing and you discover that the very runs you most need to understand were the ones least instrumented. Retrofitting observability under that pressure is slow and incomplete, and the failures that prompted it are often gone by the time the instrumentation arrives, never to be understood. Building observability in from the start is the unglamorous discipline that pays off precisely when you most need it — when the agent is acting in the world, something has gone wrong, and the question of what happened has a clear answer because you built the system, from the beginning, to be able to tell you.
Seeing is trusting
The thread running through all of this is that an agent you can see inside is an agent you can trust to act, and an agent you cannot see inside is one you are merely hoping about. The trace is the foundation — the faithful, structured record of what each run did and saw, the ground truth you read to understand any single failure. Metrics and detection scale that understanding from the single run to the whole system, telling you how the agent behaves in aggregate and directing your attention to the runs that need it. And the human in front of it all is who the apparatus serves, which is why comprehension, not mere recording, is the measure of whether it works.
None of this is exotic, and that is rather the point: observability for agents is mostly the patient application of old operational wisdom to a new kind of system whose behavior is harder to see. The signals are the familiar traces and metrics and logs, reinterpreted for a system whose truth lives in what a model saw and chose; the practices are the familiar sampling and retention and dashboard design, weighed against the peculiar sensitivity and expense of recording an agent's every thought. What is new is the urgency, because a probabilistic system acting in the world fails in ways you cannot anticipate and cannot reproduce, and only what you recorded as it ran will ever explain it.
Build an agent observable and its failures become lessons, its behavior becomes legible, and its growing capability becomes something you can extend with confidence because you can always find out what it did. Build it opaque and every increase in what the agent can do is an increase in what can go wrong invisibly, until you are operating a powerful system on faith, unable to explain its mistakes or trust its successes. The goal was never observation for its own sake; it was the trust that observation makes possible — the trust that lets you hand real capability to a system that acts, knowing that whatever it does, you will be able to see it, understand it, and make it better.