Last week one of my research agents handed back a nine-section report. Technical. Tokenomics. Market. Ecosystem. Regulatory. Team. Risk. Narrative. Supply chain.
Every cell was filled in. Every cell said the same thing: N/A — insufficient information.
No error thrown. No red banner. Job status: complete.
That green checkmark is the most expensive thing I’ve looked at all quarter. Not the blanks. The checkmark.
I’ve run automated execution since 2025 — a few hundred grand routed through Flashbots bundles, north of 10,000 fills, roughly 98% success. The failures that cost money are never the ones that scream. They’re the ones that return a plausible artifact and let you stack a position on top of it. A null pointer in a trading bot is a bad afternoon. A null pointer wearing a lab coat is a liquidation. The code doesn’t know the difference between “no signal” and “signal processed to zero.” You have to teach it.
A blank report is not a finding. It’s a crash with a bow on it.
Everyone in this bull market is running something. Retail running a scraper and a GPT wrapper. Funds running forty-node pipelines that ingest nine hundred articles a day. The architecture is identical, and it’s three steps: fetch, extract, analyze. Then a downstream consumer — a trader, an investment committee, a content queue — acts on whatever comes out.
The failure happens at step one. The page was JavaScript-rendered, or behind a paywall, or the URL 404’d, or the scraper got served a bot-block. Doesn’t matter which. What matters is that the extractor returned an empty object and the pipeline did not notice.
What came out the other end was still a report. Nine dimensions. Risk matrices. A Howey test. A glossary. A disclaimer. A polite request for supplementary input. A beautiful piece of intellectual furniture with nothing inside it.
And here’s the part that should worry every desk that runs one of these: the diagnosis was right, and it was still useless. The report correctly identified that its own input was empty. It even correctly flagged the meta-risk — that silent pipeline failure is more dangerous than an explicit error, because the output looks like work. It ranked “decision basis is zero” as its top risk. It recommended broadcasting “this batch is invalid” to every downstream consumer.
A human read that. A machine did not.
The anatomy of a false negative
Here’s the bug, stripped down.
function extract(html) { const points = parse(html); // returns [] return buildReport(points); // returns a full 9-section report }
Nothing throws. parse returned an empty array, buildReport was happy to consume it, and every downstream stage received a well-formed object with points.length === 0. The pipeline is not broken. It is doing exactly what it was told. It was told to always return a report.
The fix is one line, and almost nobody ships it:
assert(points.length > 0, 'EMPTY_EXTRACTION');
That’s it. That’s the whole difference between a pipeline and a liability. In 2018 I spent six months in a dorm in Istanbul auditing lending contracts, and I submitted three reentrancy patches to early Compound and MakerDAO interfaces. Every one of those bugs was the same shape: a function that returned successfully in a state it should have reverted in. The Solidity compiler doesn’t stop you from writing it. The audit stops you.
Your research pipeline has no audit. So it has no compiler-level guarantee that “empty” is treated as an error rather than a result.
False precision is worse than N/A
LLMs are trained to be helpful. Ask one to fill a risk matrix with zero inputs and it will fill the risk matrix. You’ll get “medium risk, moderate probability, monitor closely.” You’ll get a number where a hole should be.
The report I got did the honest thing. It refused to rate technical value, investment value, and timeliness value as one star, because one star implies “the content is bad” when the truth was “the content was never read.” It called that false precision, and it was right.
I’ll go further. A confident “medium risk” is a lie with better formatting than a blank field. It propagates. It gets into a memo. It gets compared against another project’s “medium risk.” Two holes get averaged into a decision. Nobody ever audits a hedge.
The batch poison threshold
One empty result is an anecdote. Five percent is a systemic fault.
The report got this right too: if empty extraction exceeds 5% of a batch, the extractor logic is broken for a class of page structures, and every other article in that batch is suspect. That’s not a content problem, it’s an infrastructure problem, and it silently degrades your entire signal set.
I’ve traded this exact failure before. Not in a scraper — in an oracle. When TerraUSD unwound in May 2022 I didn’t sell anything for the first six hours; I sat and read the oracle path, because the interesting question was never “why did it break” but “how long did the feed keep reporting a number.” It kept reporting. That’s the whole mechanism. The price feed didn’t go dark, it went wrong, and every contract reading it behaved perfectly according to a lie.
Cross-chain verification has the same shape. A bridge that reports “message delivered” through an oracle-relayer pair isn’t delivering truth, it’s delivering a trusted assertion — and it will keep asserting right through the failure. You’re not removing the trust assumption. You’re choosing who holds it and hoping they never return an empty array.
The three checks that don’t need the narrative
My whole workflow reduces to three divergences, and none of them require reading the marketing.
One: self-reported TVL versus third-party TVL. The project says one number, DeFiLlama says another. The gap is the story. A four-hundred-million delta is either a counting methodology or a wrapper double-counting its own deposits. Pull the address, don’t read the blog.
Two: roadmap commitments versus shipped commits. Not the announcement. The repository. A protocol that raised on a Q1 deliverable and hasn’t pushed since September has told you everything, and it took ninety seconds to learn.
Three: raise valuation versus circulating market cap. An inversion here — private money at a higher mark than public money will pay — is the single cleanest exit-liquidity read available. It’s public data. It’s free. Almost nobody checks it before buying the token.
Notice what these three share: they need an address and a timestamp, not a thesis. And notice what the failed pipeline had: neither. The hundred-million RWA pilot that never touches a public explorer has already failed check one; it just hasn’t told you. A whitepaper is a claim. A contract address is a fact. When the two disagree, the fact wins, and it wins before the crowd finishes reading the claim.
Timestamps or it didn’t happen
The report asked for exactly two things as mandatory: publication time and fetch time. Everything else is a decorative field.
Market-side analysis decays brutally. Thirty days in crypto is a geological era — funding rates, open interest, and stablecoin flows all roll over. An analysis of a March article running in June is fiction with footnotes.
If your pipeline can’t stamp published_at and fetched_at on every artifact, you’re not running research. You’re running a random number generator with a citation style.
Everyone’s scared of the wrong model failure. They fear the agent that hallucinates a two-billion TVL and market-buys on it. That one is safe — it produces a falsifiable claim, and falsifiable claims get checked, because somebody downstream wants to be right.
The dangerous agent produces nothing and says so politely.
It’s the intern who files a flawless memo titled No Findings. Nobody audits a negative. Nobody re-runs the scraper on a quiet Tuesday. The empty result gets logged, the desk moves on, and the actual signal — the one sitting in a JavaScript-rendered page behind a soft paywall — never existed.
I didn’t build defenses against hallucination. I built defenses against silence, because silence scales.

In a bull market, anyone can be a genius. Volume is up, everything prints, and the pipeline that returns garbage gets bailed out by beta. Then the tape turns and the desk discovers that eight percent of its research artifacts were structurally empty for eleven weeks. Alpha isn’t in the length of the report. It’s in the assertion at the top of the file. Alpha is extracted from the chaos, not from the formatting.
There’s also a quieter embarrassment in that report: it’s better produced than most human research I read this month. Glossary. Howey test. Position-disclosure request. Three named divergence checks. All of it correct. All of it aimed at nothing. We reward the shape of rigor because the shape is legible, and legible is what gets funded.
The next cycle’s edge won’t be a better model. It’ll be better assertions — an empty-output gate at every stage, a five-percent batch scan, a mandatory timestamp pair, and a hard refusal to let a model rate a risk matrix it has no inputs for.
Restaking is leverage, but sleep is priceless. So is research. Write the assert before you write the alpha.
How many of your last ten “no signal” days were actually no signal?