Last week, a report landed on my desk with 2,000 words in it. Nine sections. Forty-one tables. Every field labeled, every cell filled. The schema validated cleanly and the pipeline returned exit code zero. The total information payload was zero.
I have read Solidity functions that do exactly this. They return true, they emit an event, they consume gas, and they move nothing. The ABI is satisfied. The caller's require() passes. The user's balance is unchanged. Every automated check in the stack reports success.
That report is the analytical equivalent of a no-op transaction that pays gas to say nothing. It is the most instructive document I have encountered in months — not for what it claims about any protocol, but for what it reveals about how we validate claims at all.
Here is the mechanism. The report was generated by a nine-dimension framework: technical, tokenomics, market, ecosystem, regulatory, team, risk, narrative, supply-chain transmission. Each dimension is a template. Each template holds sub-tables — innovation, maturity, security assumptions, performance metrics. The framework itself is well-built. It exists to prevent the most common failure in crypto research, which is selective attention: analysts who cover tokenomics and ignore governance, or who discuss narrative and never touch the unlock schedule.
The problem started upstream. The first-stage extraction — the step that feeds the framework — returned an empty information-point list. No title, no protocol name, no thesis, no facts. A null set.
A naive pipeline would have thrown an exception. It would have said: no input, no output. Instead it did something far more dangerous. It honored the contract. It walked every branch of the template and filled each one with the string 'N/A — insufficient information.' It produced a document that is, at the level of form, indistinguishable from a completed analysis. Forty-one tables, all correct, all empty.
This is not a bug in the ordinary sense. It is a design decision about what 'done' means. And that decision is everywhere in this industry.
The first thing to understand is that schema validation and semantic validation are different operations, and almost every system I have reviewed conflates them. Schema validation asks: does the object carry the required fields, of the required types, in the required positions? Semantic validation asks: do the values in those fields mean anything?
A JSON object reading {"price": 0} passes schema validation. It fails semantic validation, because zero is not a price. It is the absence of a price wearing a price's clothes.
I learned to respect that distinction the hard way in late 2017, during the ICO rush in São Paulo. I was a junior developer at a fintech marketing an 'Ethereum-based remittance' token. My job was to audit the core Solidity contract before mainnet. Forty hours in, I found the classic: a withdrawal function making an external call before updating state. Reentrancy. The function signature promised a withdrawal; the function body permitted a drain of roughly $2M in user funds.
What stuck with me was not the vulnerability. It was how the team's test suite passed. Every unit test called withdraw(), checked that the return value was true, and moved on. The tests validated the schema. They never validated the state.
That is the same failure mode as the 2,000-word report. The framework ran. The function returned. The invariant — information in equals information out — was never checked, because it was never a field in the template.
Logic is binary; intent is often ambiguous. A contract that returns true is logically a contract that succeeded. What it intended — to move funds, to record a state change — is a separate question the return value does not answer.
On-chain, this pattern has a name in every subsystem, and the names rarely get connected.

In token standards, it is the ERC-20 transfer that returns true without decrementing the sender's balance. The interface is satisfied. Wallets that trust the return value display a successful transfer that never happened. This is not theoretical; it is the backbone of an entire class of fake-token scams, and it survives because so much infrastructure checks the boolean and not the Transfer event.
In oracles, it is the stale price with a valid signature. The signature verifies. The timestamp sits within tolerance. The number is real — it is simply the number from three hours ago, while the market has moved 12% since. The consumer contract's require() passes. The liquidation engine fires on a fiction.
In data availability, it is the sampling round that proves the availability of nothing. I ran Celestia node tests from São Paulo in 2024, measuring DAS latency against monolithic alternatives, and the lesson that stayed with me was structural: sampling can prove a blob exists without proving the blob contains data anyone needed. Availability is a property of bytes, not of meaning. Rollups cut data costs by roughly 90% by renting that blob space — and the same mechanism that makes the cheapness real makes the emptiness cheap too.
In governance, it is the proposal that reaches quorum with 60% abstentions. The vote is valid. The mandate is empty.
Now consider the compliance stack, which is the most template-driven machine we have built. A stablecoin that markets itself as compliance-first has constructed an apparatus of address screening. The freeze function is the return value. An issuer can freeze an address within 24 hours, and the token contract reports success — the transfer is blocked, the schema is honored, and the user is told nothing. The compliance report is complete. Whether the freeze was justified is a field that does not exist in the template.
The same shape governs licensing regimes. Hong Kong's virtual asset framework is extensive in form. Every applicant fills the fields. The substantive question — whether the regime is designed to protect investors or to reposition a jurisdiction within a regional competition for financial flows — is not a field either.
Four subsystems, several jurisdictions, one invariant violation. The system checked the shape of the thing and called it the thing.
Now the part that took me years to articulate, and that the Uniswap V2 work finally forced out of me.
In August 2020, I wrote a Python script to simulate 10,000 ETH/USDC price paths against the constant-product formula, x * y = k, to quantify impermanent loss net of fees. The script ran cleanly. The output had confidence intervals, distributions, percentiles. It looked like science, and it was science — conditional on the model being right.

I have since watched that same script pattern justify conclusions the model could never support. Ten thousand paths through a wrong assumption do not produce truth. They produce a tight, well-bounded, statistically confident error. A confidence interval measures precision. It says nothing about accuracy. A measurement can be arbitrarily precise and completely wrong, and the more precisely wrong it is, the more convincing it looks.
This is the deep problem with template-driven analysis. A framework with forty-one tables is a precision machine. It will report 'N/A' in cell after cell with total consistency. The consistency is not evidence of rigor. It is evidence of nothing, arranged neatly.
I audited fifteen ERC-721 minting contracts in early 2021, at the NFT peak. Two had open minting — no access control whatsoever. One generated randomness from block.timestamp, which a miner can nudge. In all fifteen, the pattern was identical: the contracts passed review because the checklist asked whether the functions existed, not whether they were safe. Completeness is a cheap virtue. It scales. It is the virtue a template can always deliver.
I spent three weeks in May 2022 dissecting Lido's stETH depeg, comparing the trust assumptions of liquid staking derivatives against native staking and against Rocket Pool. The node-operator concentration in Lido's model is a populated field in any serious template. The risk it encodes — that a small set of operators becomes a de facto consensus bottleneck — is a semantic judgment the field cannot carry. The table was full. The insight lived somewhere else.
The industry's stated fear about automated analysis is hallucination — the model inventing facts. That is a real risk, and it is the wrong one to prioritize.
Hallucinated facts are detectable. They contradict the world. A wrong address, a wrong TVL, a wrong date — these fail against reality eventually. They are loud.
The quieter failure is structural hallucination: output correct in form and empty in substance, passing every automated gate we have built. Compliance departments love it because it can be filed. Dashboards love it because it renders green. A 2,000-word report full of 'N/A' is not a failed report in any system that measures word count, section coverage, or schema conformance. It is a perfect report.
And note the rhetorical move inside it. 'N/A — insufficient information' performs epistemic humility. It reads like the most honest sentence in the document. It signals that the analyst knows the limits of their data. That is exactly what makes it dangerous: it borrows the credibility of rigor while delivering none of its substance.
Logic is binary; intent is often ambiguous. The document intended to inform. It only managed to conform.
Watch the metric nobody publishes: information density per byte. Not accuracy — accuracy can be gamed by refusing to make claims. Not coverage — coverage can be gamed by templates. Density. How many claims per thousand words could be falsified by a single observation?
My forecast for the next cycle: the provenance machinery we built for on-chain data gets dragged into off-chain analysis. Signed data feeds. Attestations. Receipts proving an output was derived from a non-empty input. Semantic validation layers that reject a 'complete' report the way a good oracle reverts on a stale price instead of silently returning one.

The contracts that hurt people were never the ones that failed. They were the ones that returned true.