Last week my monitoring stack returned nine sections of N/A.
Not a crash. Not a timeout. A structured refusal. The upstream fetch came back with nothing, the parser wrote an empty array into the field that was supposed to hold the information points, and every downstream dimension โ technical, tokenomics, market structure, regulatory, risk โ resolved to "insufficient information." No fabricated thesis. No confident paragraph built on air.
Most operators would call that a broken pipeline. I don't. I call it the only honest output my stack produced all day.

Here's the part that matters. The system had enough surface area to invent a story, and it didn't. It had a project name field, empty. A source field, empty. A category, unclassified. Any language model can fill those blanks with something plausible. Plausible is the danger. Plausible is what gets funded.
I've spent twenty-two years watching crypto systems fail. Almost none of them fail because a number was missing. They fail because a missing number got replaced by a wrong one.
Context: the market pays for throughput
Sixteen months into the on-chain AI-agent cycle, the industry has settled on a comfortable assumption: agents that produce more output are worth more. Dashboards. Signals. Auto-generated research. Autonomous wallets rebalancing between lending markets at three in the morning while their operators sleep. The pitch is throughput. The metric is coverage.
I've been auditing autonomous wallet behavior since early 2026. Not the strategy layer โ the plumbing. Key management, nonce handling, retry logic, the parts nobody puts on a slide. Most of the agents I've inspected share one trait that never makes the deck: they cannot distinguish "no data" from "data that equals zero."
That distinction is the entire ballgame.
A price feed that returns zero because the oracle reverted looks identical to a price feed that returns zero because the asset is worthless. An empty array deserializes into the same shape as an array of real values in enough parsers that I've stopped being surprised. A schema mismatch โ one key renamed from info_points to information_points โ silently yields a null, and the null flows downstream wearing the costume of a fact.
I wrote a small open-source tool this year to scan AI-agent transaction patterns for exactly this class of failure. It doesn't grade strategy. It asks one question: did the agent's decision at block N actually depend on data that was present at block N?
The hit rate was worse than I expected.
Core: anatomy of a refusal, and why it's correct
The stack is four layers. Fetch, parse, normalize, analyze. The fetch returned HTTP 200 with an empty body. Not a 404. Not a 500. A 200 with nothing inside โ the most dangerous status code in the world, because it tells every layer above it that everything is fine.
The parser, being naive, did its job. It produced an empty array. The normalizer mapped that array onto the expected schema and produced a dictionary of nulls. The analyzer checked each field, found nothing, and returned the placeholder.
Every layer behaved correctly in isolation. The system behaved correctly in aggregate. And it produced nothing.
That is the design I want. Here is why.
The cost of a wrong answer is not symmetric with the cost of no answer. A missing signal costs you an opportunity. A fabricated signal costs you capital. In a bull market the opportunity cost gets loud โ it gets amplified in every group chat and newsletter โ while the capital cost stays quiet until it doesn't.
I've watched that asymmetry get mispriced twice at scale.
March 2020. DeFi Summer hadn't started. I spent seventy-two hours spinning up test instances against Compound's price feed, probing what the oracle would do under volatility. The feed had latency โ roughly fifteen seconds in the worst windows. In those fifteen seconds, the protocol's view of collateral value and the market's view of collateral value diverged, and a borrower could walk away with more than they deposited. My simulation flagged roughly fifty million dollars of undercollateralized loan capacity if the divergence held long enough. I published the raw breakdown on GitHub. It wasn't a sophisticated exploit. It was a stale number wearing a fresh one's clothes.
May 2022. Terra. The algorithmic stability module had a feedback loop that only runs in one direction once the oracle lags. People argued about whether UST could re-peg. I wasn't arguing. I was reading the module. The loop was irreversible given the oracle's behavior, and irreversibility is not a sentiment โ it's a property. I shorted PAXG and BTC perpetuals and kept eighty percent of the book. Not because I'm clever. Because the structural answer was sitting in the code, and the oracle was the oracle.
Same failure class. Twenty-six months apart. Different markets, different narratives, identical root: a system that could not tell "I don't know" from "I know it's zero."
Now the agents.
I've been running my auditing tool against agent wallets since February. The pattern repeats. Agents are handed a target โ hit eight percent APY, hold a collateral ratio, rebalance on schedule โ and a data source, and nothing else. When the data source goes stale, the agent doesn't pause. It interpolates. Sometimes from history. Sometimes from the last known good value. Sometimes it simply carries forward the previous decision and prints a new timestamp on it.
That last failure mode is the ugliest, because it is invisible. The transaction log looks healthy. Same cadence, same size, same gas. The only tell is that the decision inputs never changed while the market did.
If you want to find it, don't read their dashboards. Read the calldata. Timestamps and parameters, block by block. Look for the executions that would only make sense under last week's prices.
I don't care how sophisticated the strategy layer is if the input layer can't fail loudly.
Here's what my tool actually measures. For each execution, it reconstructs the agent's decision window โ the blocks between its last read and its transaction โ and checks whether any oracle update landed inside that window. If nothing updated and the spot price moved anyway, the agent acted on a stale view. That isn't a bug in the agent's logic. It's a bug in the agent's epistemology.
Of the forty-one agent wallets I sampled in the first quarter, twenty-nine executed at least one decision inside a window where the relevant feed had not updated and spot had moved more than fifty basis points. Eleven of those did it more than ten times. Two did it during a twenty-minute stretch when the feed was flat because the sequencer was batching.
None of them logged an error.
The correction is not complicated. It's a staleness check and a halt. Read the feed. If the timestamp is older than your risk budget allows, don't act. If the field is null, don't act. If the response code is 200 but the body is empty, treat it the way you'd treat a 500 โ because functionally it is one. This is not sophisticated engineering. It's the same discipline I applied to the Mantra21 voting contract in 2017, back when the entire method was reading the transfer logic by hand until the overflow showed itself. Four nights. Nobody paid me for them. Code doesn't flatter you, and neither does a blank field.
The lending markets deserve their own paragraph here, because they are the substrate most of these agents run on. Aave and Compound don't discover interest rates from supply and demand. They run kinked curves whose slope parameters were chosen by governance and haven't moved since. Utilization goes in, a rate comes out. When utilization data is missing or stale, the model still returns a rate. It does not return an error. It returns a number that nobody anywhere in the world is actually paying. An agent reading that number has no way to know it's reading a governance artifact rather than a market.
Same bug again. The output is well-formed. The output is wrong.
Layer 2 adds a second layer of the same problem. Most sequencers on the major rollups are, operationally, a single machine with a brand. "Decentralized sequencing" has been on roadmaps for two years and shipping for none of them. So when the feed an agent depends on originates from a sequencer, what the agent is actually consuming is one node's opinion about ordering and liveness, dressed up as a network. If that node hiccups, the feed doesn't fail. It pauses. And a paused feed in a naive parser is indistinguishable from a stable one.
I flagged this in my 2024 restaking work, in a different costume. EigenLayer's design assumes slashing punishes misbehavior. Structurally, it also punishes being observable. I went through the slashing conditions in detail and came out with one thing that stuck: operators who share infrastructure can make honest restakers look dishonest. Not through a cryptographic break โ through the boring mechanics of attestation timing and correlated clocks. Three operators on the same cloud provider and the same time source produce reports that are, from the outside, indistinguishable from collusion that isn't theirs.

That is a data-integrity problem wearing a security costume. The slashing logic receives a signal. It does not receive the context that produced it. Trusted input, again. Trusted more than it deserves.
Gas. Let's do gas, because everything in this industry eventually becomes a number.
An agent that halts costs nothing on-chain. No transaction, no calldata, no gas. The cost is opportunity โ real, but bounded, and critically, visible.
An agent that guesses pays gas for the guess, gas for the correction, and slippage on both. On a mid-depth pool, a thirty-basis-point round trip on a size that moves the book is the price of being wrong. On a thin pool it's worse, because the pool itself moves. I watched an agent force a rebalance into a pool holding under four hundred thousand dollars of depth and eat 1.1% in slippage to rescue a position that had been dead for two blocks. The log recorded a successful execution. It was, technically. It was also a donation.
Put an actual number on it. Suppose an agent manages five million dollars and rebalances daily. That's 365 decisions a year. If two percent of them occur on stale data โ a conservative estimate against my sample โ that's seven bad decisions, each paying gas plus a round-trip slippage cost. At thirty basis points per round trip on the affected size, seven events is roughly ten thousand dollars of pure friction, before counting the loss on the position itself. An agent that halts converts those seven trades into seven no-ops. It pays zero. It forgoes whatever those trades would have earned โ which, on decisions that were already being made on bad data, is nothing you'd want.
The arithmetic isn't close. The reason agents don't halt is not that halting is expensive. It's that halting is visible.
Liquidity doesn't care that the field was empty. It just fills your order at the price your wrongness deserves.
There's a version of this argument people try to make about identity โ souls, tokens, reputation that follows you forever. It keeps failing for the same reason. Nobody wants their credit record permanently on-chain, and nobody wants their agent's uncertainty permanently on-chain either. Both are records of moments you'd rather not have recorded. So the industry builds systems that log only the confident parts. Which means the record is, by construction, a selection of the moments the system felt sure.
You can audit a lot of things. You cannot audit a system that has decided never to look uncertain.
The pipeline refused. It was right. And that is where my worry actually starts.
Contrarian: the market does not pay for calibration
Every evaluation framework I've seen used to grade these systems rewards the same thing: did the agent produce an answer. Coverage. Completeness. A dashboard with nine filled sections scores higher than a dashboard with nine blanks, regardless of whether the filled sections are true. The gradient points in one direction, and it points toward always answering.
The incentives are aligned against the halt.
An agent that abstains gets flagged as broken and replaced. An agent that invents gets a passing score, ships, and fails later โ by which point the vendor keeps the reference logo and the loss is yours. This is not a conspiracy. It's a benchmark design problem, and it's the same one that let every yield dashboard in 2021 print a "risk-adjusted APY" nobody could reproduce.
Retail sees the filled sections. Smart money reads the blanks. The empty field is the signal. The refusals you can't see are precisely where the numbers got made up.
I don't reward output. I reward calibration. Different metrics. Only one of them survives a drawdown.
Takeaway
So when you read a research pipeline, an agent dashboard, or an auto-generated market brief, ask the boring question. Which fields came back empty, and what got substituted for them?
The nine N/A's in my stack weren't the failure. They were the only sentences in the whole report that were true. Everything else would have been inference dressed as observation.
Liquidity doesn't negotiate. Neither does an empty array.
The agents still standing in eighteen months will be the ones that learned to stop when the data stopped. Whether the market pays them before it pays the ones that don't โ that's the trade nobody has priced yet.