A JSON object landed on my desk this morning. Every field was null.
Not wrong. Not biased. Null. title: empty. source: empty. domain_confidence: unassessed. information_points: an empty array. A pipeline that was supposed to dissect an article and grade its claims returned a placeholder — a struct-shaped ghost that looked like data and carried none of it. On a trading desk, a blank field is not a lull. It is an unbooked risk.
I have seen traders treat null as neutral. Null is not neutral. Null is a variable you failed to measure, and in a market that reprices on information continuously, an unmeasured variable is a loaded gun. The pipeline did not say "this article is worthless." It said nothing at all, in a format that mimics a conclusion.
That distinction — between a bad answer and no answer — is where most of the capital in this cycle will be lost.
Let me frame the architecture, because the failure only makes sense inside it.
Since 2024, the desk has been quietly rebuilt around large language models. Not for execution. For ingestion. Sentiment oracles, narrative scrapers, claim-extraction layers that feed risk engines. My own 2025 project, an AI-oracle hybrid, was built on exactly this premise: machine learning filters on-chain noise, decentralized oracles anchor the output, and the synthesis is supposed to predict sentiment with enough edge to trade against.
The standard architecture has four stages. Ingest the raw source. Extract the substantive body. Infer the semantic content — claims, stance, intent, time-sensitivity. Write the structured result back to a store the trading layer can read.
Four stages. Four places to fail. And the output above failed at the first one, then hid the failure by emitting a well-formed empty object.
Here is the uncomfortable part. This is not a low-quality result. This is an unexecuted one. The distinction matters because the remediation is completely different. A bad analysis needs a better model. A null result needs a plumber. Most teams, faced with a struct full of nulls, reach for the model. They are reaching for the wrong tool.
I learned this the expensive way, auditing extraction pipelines for an asset manager that wanted exposure to on-chain sentiment. The pipeline looked healthy. Dashboards green. Latency nominal. And every morning, a slice of the output was empty — and nobody noticed, because empty looked like "quiet." Quiet is a signal. Empty is not.
Let me run the diagnosis like a proof. Deductive, stage by stage, because the failure is structural and structural failures have fingerprints.
Failure mode one: empty input. The template was passed; the article was not. This is the most common cause and the most embarrassing. The orchestration layer invoked the analyzer with a schema but no payload. The model, being obedient, returned the schema back, blanked. Cost: zero. Consequence: total.
Failure mode two: fetch failure. The URL was unreachable — login wall, paywall, anti-bot challenge, or region lock. The scraper returned a 200 with a consent page as the body. The extractor dutifully parsed the consent page, found no article, and emitted nulls. The system believed it had succeeded.
Failure mode three: extraction miss. The page rendered. The body extractor did not find the main content — dynamic rendering, shadow DOM, or a layout the parser never saw. It returned boilerplate, and the inference layer, correctly, found nothing to infer.
Failure mode four: silent model failure. The call timed out or errored, but the wrapper caught the exception and returned a default empty struct instead of raising. This is the cardinal sin. It converts an error into a false negative and hides it from every downstream monitor.
Failure mode five: field-mapping error. The analysis actually ran, but the output was written to the wrong keys or overwritten by the next job. The data existed for a heartbeat and then evaporated.
Failure mode six: non-text source. Video, image, bare link, empty page. No text to parse. Not a bug — a category error.
Six modes. One symptom. And the symptom is always the same shape: a null where a value belongs.
Now map this to DeFi, because the pattern is not new. It is the oracle problem wearing a new coat.
An oracle's job is to answer "what is the price." When it fails, it does not usually return a wrong number. It returns a stale one, or nothing, and the consuming contract must decide what to do. Chainlink's staleness thresholds exist for this reason. Pyth's confidence intervals exist for this reason. The circuit breaker exists because "no data" and "bad data" are different failures with different blast radii.
The AI pipeline I described is an oracle. It answers "what does this text mean." And it fails in exactly the same ways. Stale cache equals failure mode five. Empty feed equals failure mode one. A 200 response with the wrong body equals failure mode two. The vocabulary differs. The mechanics do not.
Here is where it gets expensive. In a price oracle, staleness is bounded — you set a heartbeat, you set a deviation threshold, you revert if the feed is too old. In a sentiment oracle, nobody sets a heartbeat. The trading layer reads the store, finds a null, and — because the schema is well-formed — treats the absence as a neutral observation. Neutral is a position. Every null is an implicit trade.
I have run the numbers on this. In my 2020 yield rotation, the failures that cost me were never bad models. They were silent gaps — a pool I thought I was monitoring that had stopped reporting, a rebalance that fired on stale TVL. The loss was not in the signal. It was in the assumption that the signal was present.
The deeper issue is null propagation. In most of these stacks, a null flows upward without raising. The extractor returns null. The inference layer sees null, returns null. The scoring layer averages null as zero. The trading layer reads zero as "no sentiment." Four stages, and at no point does anyone say: we do not know. The system confidently outputs "we do not know" and the desk reads it as "nothing is happening."
That is the bug. Not the null. The confidence around the null.
A second-order failure: the pipeline that reports success. There is a variant of mode four that deserves its own line. The wrapper does not just return empty — it returns empty with a status: success flag. Every downstream monitor, built to alert on status: error, stays silent. This is the most dangerous configuration in the entire stack, because it is the only one where the monitoring itself is compromised. You have built a system that will never tell you it is broken. In DeFi terms, it is an oracle that reports answered: true with a price of zero. The number is wrong, the flag is a lie, and the liquidation engine trusts both.
Price the failure. A null is not free. Suppose the desk runs a $50 million directional book on the signal. Nine percent structural emptiness, clustered on volatile days, means the effective notional during the events you care about is closer to $45 million — and the missing five is missing exactly when the move is largest. Run that across a cycle and the drag is not a rounding error. It is the difference between a strategy that backtests at Sharpe 1.4 and one that realizes 0.9. The backtest never saw the nulls because the backtest never ran the pipeline live.
So what does a correct pipeline look like? Three properties. First, fail loud — an empty result must be a typed error, not a typed value. The analyzer should raise, not return a blank struct. Second, instrument the stages — you cannot monitor what you do not separate. Ingest health, extraction hit-rate, inference latency, write-back confirmation. Four metrics, four alarms. Third, distinguish absence from neutrality — the downstream consumer must be forced to handle "no data" as a distinct case, not coerced into treating it as zero.

This is not exotic. It is the same discipline that makes a liquidator bot safe: never act on a feed you have not verified is fresh. The AI stack simply never inherited the lesson, because it grew up in a world where the input was always assumed present.
I will put a number on it. In my audit of that asset manager's sentiment feed, roughly nine percent of daily outputs were structurally empty. Nobody had flagged it because the empty ones did not throw. Had they been trading a naive long/short on the signal, those nine percent — clustered, as it happens, around high-volatility news days when scraping failed hardest — would have systematically muted the signal precisely when it mattered. The gap was not random. The gap correlated with the events you most wanted to trade.

That is the tell. Failures cluster. They cluster on the days that break the pipeline: paywalls on breaking news, anti-bot walls during traffic spikes, extraction misses on new layouts deployed under load. The pipeline fails hardest exactly when the market moves fastest. A naive consumer of that feed is blind in a storm and thinks it is calm.
The consensus fix is wrong. When the output came back empty, the instinct was to upgrade the model — bigger context window, better prompt, fine-tune. That is treating a plumbing failure with a smarter pump. The model was never the problem. The model was never asked.
Retail reads AI output as a verdict. Smart money reads it as a pipeline with service-level agreements. The difference is not intelligence. It is where you place the burden of proof. Retail asks "is the answer right?" The desk asks "did the answer arrive, from a verified source, within the freshness window, and is the failure mode bounded?" One question. Two entirely different systems.
This is the contrarian position: in AI-driven trading, the model is the least important component. The model is a commodity — you can rent frontier intelligence by the token. What you cannot rent is ingestion integrity, extraction coverage, and write-back verification. Those are the moats, and they are boring, and that is why almost nobody builds them.
And notice what the empty struct reveals about intent. A system that returns a well-formed blank is a system optimized to look healthy, not to be healthy. That is a governance failure before it is an engineering one. Someone chose to catch the exception and return a default. That choice — made for uptime dashboards, probably — is the same choice that turns a bad oracle into a liquidation cascade. Risk is a variable, not a verdict. A null is a variable you forgot to price.
So watch the feeds, not the models. Over the next two quarters, the desks that survive the chop will not be the ones with the smartest inference layer. They will be the ones whose pipelines scream when they go blind — typed errors, stage-level telemetry, freshness gates that revert instead of guessing. If you are building an AI oracle, your first metric is not accuracy. It is null-rate, and your first alarm is the day it goes to zero because nobody is looking.
Buy the fear, code the future. But first — verify the feed is alive.