Last week a research pipeline executed cleanly. Nine analytical dimensions. Technical architecture, token economics, market structure, ecosystem position, regulatory exposure, team and governance, risk matrix, narrative durability, supply-chain transmission. Every field returned. Every field read N/A.
That is the most honest document produced in this market all quarter.
I have spent a lot of time inside broken things. In 2017 I put three months into a forensic audit of the Waves IDEX contracts, hunting an integer overflow in the trading engine. What I found was worse than a crash: the engine would accept a state it could not represent, compute on it, and return a number that looked plausible. No revert. No event log. No alarm. The code didn't know what it hadn't been given, so it invented a value and kept going.
The empty-input report did the opposite. It refused. It marked all nine dimensions insufficient, flagged the evidence anchor as a fatal gap, and then listed three recovery paths with the exact JSON schema it needed. It told the operator what was missing instead of manufacturing what wasn't there.
Compare that to what your average crypto research agent does when the source text fails to load behind a paywall.
Context: the pipeline nobody audits
The architecture is now standard. Stage one is an extractor: fetch a URL, strip navigation and advertising, run a language model over the residue, emit structured claims. Each claim gets an id, a content string, and a source pointer. Call it the information-point list. Stage two is an analyst: consume the claims, map them onto a fixed analytical template, produce prose. Every downstream assertion is supposed to cite an id from stage one.
This design is correct in principle. It is an evidence-anchored system. The claim ids are the equivalent of a merkle proof — you can walk any sentence in the final report back to a specific span of source text and check it. When the anchoring works, an AI research report is more auditable than a human one, because a human analyst's citations are decorative and a machine's can be enforced.
The problem is what happens at the seam. Stage one fails constantly and fails quietly. Paywalled articles return a teaser paragraph. JavaScript-rendered single-page apps return an empty body element. Anti-bot layers return a challenge page that looks like prose. Deleted posts return a 200 with a tombstone. And schema drift — extractor version 1.4 emits a key called points, version 1.5 emits information_points, and stage two reads points, gets undefined, coerces it to an empty array, and proceeds.
Every one of those failures produces the same downstream artifact: a valid report with zero anchors.

Core: three failure modes, one root cause
The first failure mode is a type error masquerading as a null check. Consider the obvious guard:
