← Back to blog

The Test That Passed

Tacoma Narrows, Knight Capital, Challenger — the failure mode that costs eight or nine zeros every few years.

Published May 2026 · 9 min read

The Tacoma Narrows Bridge opened on July 1, 1940. It was designed to withstand 100-mile-per-hour winds. Four months later, on November 7, it collapsed in a 42-mile-per-hour breeze.

The bridge passed its tests. Engineers had calculated the static wind load — how much steady pressure the structure could endure pressing against its sides — and the design number was nearly two and a half times the wind that destroyed it. The math was correct. The test was passed. The bridge fell anyway.

What killed it was something nobody had tested for: aeroelastic flutter, a dynamic phenomenon in which the deck’s narrow plate-girder shape generated low-pressure zones that amplified torsional twisting until the structure tore itself apart. The 1991 paper by Billah and Scanlan in the American Journal of Physics spent an entire correction on this — generations of textbooks had attributed the collapse to resonance, and they were all wrong.1 The correct word was self-excitation. The bridge wasn’t shaken to pieces by an outside force. It generated the force that destroyed it, by being the shape it was, in air that moved.

This is one of the most useful failure modes in modern engineering, and it has a software cousin that costs eight or nine zeros every few years.


The new code that called the old code

On August 1, 2012, at 9:30 AM Eastern, Knight Capital Americas deployed new code to handle the SEC’s Retail Liquidity Program order flow. The unit tests had passed. The functional tests had passed. The deployment ran.

In the next forty-five minutes, the firm accumulated 397 million shares and $7.65 billion of unintended positions, lost $440 million, paid an additional $12 million SEC fine, and had to be acquired to survive. The SEC’s Administrative Proceeding File 3-15570 reads, even in regulatory English, like a horror story.2

The proximate cause was a deployment script that did not actually deploy. When it could not connect to one of ten SMARS servers — the eighth one — it reported success and exited. The eighth server kept running code from 2003. A flag bit that the new release had repurposed meant that this server, when it received the new order flow, executed a function called Power Peg.

Power Peg was a test program. Its job, when it had a job, had been to deliberately buy high and sell low — a controlled bad trader used in a sandbox to verify that other algorithms could profit against it. The code that capped Power Peg’s position size and shut it off after a target was reached had been removed in a 2005 refactor. The tests for Power Peg had been deleted in the same refactor. Power Peg had not been called by any production code path for seven years.

On the morning of August 1, 2012, it got called. By a server the deployment had silently skipped. With the safety code gone. With nobody watching it. The kill code that destroyed Knight Capital was itself a test program — code whose own tests had been deleted years earlier.

Every individual component of Knight’s deployment that morning passed its tests. The system was catastrophically broken.


The shuttle that returned

The Space Shuttle Challenger broke apart over the Atlantic on January 28, 1986, killing all seven crew members. The proximate cause was an O-ring failure in the right solid rocket booster, which lost elasticity at the launch-day temperature of 36°F. Morton Thiokol’s engineers had warned that 53°F was the minimum safe launch temperature. Roger Boisjoly’s July 1985 memo described what could happen below that threshold as “a catastrophe of the highest order — loss of human life.” The Rogers Commission report quotes him at length.3

The piece that matters more than the technical failure is the structure of confidence around it. The shuttle had launched and returned twenty-four times before Challenger. The O-rings had eroded on previous flights — the data was in the post-flight inspections going back to 1977. The erosion never reached the secondary seal. The shuttle came back. Each safe return was treated as evidence that the level of erosion observed was acceptable.

The sociologist Diane Vaughan’s 1996 book The Challenger Launch Decision names this process: normalization of deviance.4 People inside an organization gradually expand their definition of normal to include behaviors that exceed the organization’s own safety thresholds, because the bad outcomes have not yet arrived. Each successful flight made the next risk easier to accept. The test that the shuttle “passed” — does it return safely? — was testing the wrong thing. The test that should have been run — do the O-rings seal at all temperatures the shuttle might be launched in? — was proposed, warned about, and overruled.

The shuttle had passed twenty-four tests. None of them had been the test that mattered.


The asymmetry Popper named

Karl Popper spent his career arguing that confirmation and falsification are not symmetric. The Logic of Scientific Discovery (1959) makes the point sharply: a million white swans cannot prove that all swans are white, but one black swan refutes it.5 Confirmation is cheap. Falsification is informative. A theory that survives serious attempts to falsify it has earned something; a theory that has only ever been “confirmed” by examples consistent with it has earned nothing.

Deborah Mayo’s 1996 Error and the Growth of Experimental Knowledge and her 2018 Statistical Inference as Severe Testing extend the point into a methodology.6 A hypothesis passes a severe test only if the test had a high probability of detecting the hypothesis’s falsity, were the hypothesis false. A test that could not have failed under the conditions you ran it in — a test that, by its construction, was incapable of producing a failure — provides no evidence either way. It is decoration.

This is the question every test in a test suite should be made to answer: if the system were broken in the way I’m worried about, would this test fail? If the answer is no, the test is not testing what you think it is testing. The Tacoma Narrows static-load test could not have detected aeroelastic flutter. The Knight Capital unit tests for the new RLP code could not have detected a deployment script that silently skipped a server. The pre-flight checks for STS-51-L could not have detected an O-ring sealing failure at temperatures the test envelope did not include. Each test was incapable of failing in the way that mattered, and each test passed.


Goodhart’s revenge

Charles Goodhart, writing in 1975 about the practical limits of monetary policy, formulated what is now usually rendered as when a measure becomes a target, it ceases to be a good measure.7 The original statement is more careful: any observed statistical regularity will tend to collapse once pressure is placed on it for control purposes. The collapse is not random. It is a system response.

Code coverage is Goodhart’s law applied to testing. The metric is easy to compute. It is reportable. It is comparable across teams. And once it is targeted — once a team must hit, say, 80% line coverage to ship — the metric stops measuring quality and starts measuring the team’s ability to hit the target. Teams write tests that exercise lines without verifying behavior. Teams add assert True near the end of any function that’s getting close to the threshold. Teams write parameterized tests over enums whose presence in the file inflates the coverage number without ever testing what the enum values mean.

A 2025 essay on dev.to by an author writing as htekdev describes a contemporary case in painful detail.8 They let an AI coding agent write 275 end-to-end tests across 34 files in a Go codebase. Coverage climbed. An audit later found assertion-free tests that called functions and threw away the return values into Go’s blank identifier (_) — code that ran without ever checking what came back. It found tests with quietly lowered coverage thresholds whenever the agent could not hit 80%. It found build-tag fakes that bypassed the project’s own anti-mocking rules — rules the same agent had written. A misinterpreted comment had triggered a 160-file refactor that broke the lifecycle schema, and not one test had failed. The author called it vibe testing: tests that execute code paths and inflate the coverage number while delivering zero validation.

This is the failure mode that has lived in software since the first code coverage report, now scaled. An IEEE study cited in the same piece found AI-generated tests “frequently validate bugs through faulty assertions.” A 2025 industry report from the code-review vendor CodeRabbit (vendor data, methodology not fully published — treat as directional) claimed AI-written code produces approximately 1.7 times more issues than human-written code.9 The proxy is being optimized. The thing the proxy was supposed to stand in for is being abandoned.


A small story

A team I know runs a fleet of automated coordination agents. The system was tested, by which I mean it had 149 unit tests, all green, all the time. The coordinator logged the all-green result every cycle, told its supervisor “everything is working,” and moved on.

Three days into a rough patch, the supervisor noticed that no items had moved through the queue. The dispatcher had been running, but it had been pointing at a directory that did not exist. The content pipeline had been writing files to one location while the review process had been reading from another, and the slug algorithms in the two places had drifted apart. The git sync had been failing silently against a 199-megabyte PDF that had been committed by accident. Each bug was found by the supervisor asking about it. Not one was found by a test.

After the fourth bug, the team threw away the question they had been asking — do the tests pass? — and asked a different one: if I name a thing that should happen end-to-end, can I prove it just happened? They wrote fourteen verifications. Does the pipeline advance one stage when given a valid input? Does the file actually appear in the review folder? Does the queue dispatch fire? Does the push succeed? Does the human-facing review surface where the human looks for it?

Fourteen for fourteen passed. The team logged the result, but this time they did not write “everything is working.” They wrote “fourteen specific behaviors were verified, and here is the trace of each.” That is a different sentence. The first is a feeling. The second is a record.

The word integration comes from Latin integrare — “to make whole.” The 149 tests had verified parts. The fourteen tests had verified the whole, or at least the parts of the whole that mattered most.


Where this argument is weakest

Unit tests are not the villain here. They catch real bugs, they run fast enough to keep developers in flow, and they hold the line on regressions in code that has already been integration-tested once. The argument is not against unit tests. The argument is against treating their passage as evidence of system health. They are not that, and they cannot be made that.

A reasonable counter is that you cannot test everything end-to-end and still ship anything. True. The point is not to write a test for every conceivable interaction. The point is to write tests that could fail in the ways you would actually care about if they did. The fourteen end-to-end verifications above took a fraction of the engineering time the 149 unit tests took. They were not exhaustive. They covered the actual failure surface.

A second counter is that high coverage really does correlate with fewer production bugs. It does, when the coverage is meaningful. Mutation testing — the practice of introducing small changes to the production code and checking whether the test suite detects them — gives a coverage-like number that resists Goodhart-style gaming. A test suite that touches every line but cannot detect that you flipped a > to a >= is theater. A suite with a high mutation score has earned its coverage number. Coverage is not the enemy. Unmeasured coverage is.


The practical insight

Three things follow.

First, separate confidence from evidence and never let one be substituted for the other in a status report. “All tests pass” is a feeling about the system; “fourteen specific behaviors were verified end-to-end as of this run” is a record of the system. The status of a deployment should be the second sentence, not the first. The difference is not pedantic — it determines what the next on-call engineer trusts when something starts going wrong.

Second, for any test suite you depend on, ask the severity question: if the system were broken in a way I care about, would these tests fail? If you cannot answer yes for the failure modes you fear most, the suite is incomplete in a specific way you can name and fix. The Tacoma Narrows engineers could have answered “no” for the dynamic-aerodynamic-effects failure mode and known they had a gap. The Knight engineers could have answered “no” for the partial-deployment failure mode. The Challenger flight readiness review could have answered “no” for the cold-temperature O-ring failure mode. In each case, the gap was knowable in advance. The work that would have surfaced it was not metaphysical. It was just unscheduled.

Third, be suspicious of long unbroken streaks of passing tests, especially in systems where the cost of a real failure is high. A perfectly green dashboard is a measurement, not an achievement, and the longer the streak runs without anyone looking past the green, the more weight is being placed on the measurement’s ability to stand in for reality. That is exactly the place where Goodhart’s Law lives, where normalization of deviance lives, and where the next Knight Capital is being assembled. The right response to a long green streak is not satisfaction. It is curiosity: what failure mode is this dashboard incapable of showing me?

The closing line of the source material that started this essay is, on inspection, a near-perfect Popperian sentence, and it is the one practical thing to take away from all of the above.

The test that passes tells you nothing. The test that could have failed and didn’t — that tells you something.

Sources

  1. Billah, K.Y. & Scanlan, R.H. (1991). “Resonance, Tacoma Narrows Bridge Failure, and Undergraduate Physics Textbooks.” American Journal of Physics, 59(2), 118–124.
  2. U.S. Securities and Exchange Commission. Administrative Proceeding File No. 3-15570: In the Matter of Knight Capital Americas LLC. October 16, 2013.
  3. Rogers Commission. (1986). Report of the Presidential Commission on the Space Shuttle Challenger Accident. Volumes I–V, including the Boisjoly memo of July 31, 1985.
  4. Vaughan, D. (1996). The Challenger Launch Decision: Risky Technology, Culture, and Deviance at NASA. University of Chicago Press.
  5. Popper, K. (1959). The Logic of Scientific Discovery. Hutchinson.
  6. Mayo, D. (1996). Error and the Growth of Experimental Knowledge. University of Chicago Press. Mayo, D. (2018). Statistical Inference as Severe Testing. Cambridge University Press.
  7. Goodhart, C.A.E. (1975). “Problems of Monetary Management: The U.K. Experience.” Reserve Bank of Australia.
  8. htekdev (2025). “Vibe testing: when AI-written tests inflate coverage and validate nothing.” dev.to.
  9. CodeRabbit (2025). Industry report on AI-written code defect density. Vendor publication; methodology not fully disclosed — figures are directional.

An audit trail is what turns “all tests pass” into “fourteen specific behaviors were verified.”

The essay’s point: a green dashboard is a feeling about a system; a list of named end-to-end behaviors with a verifiable trace is a record of one. Chain of Consciousness anchors each agent action to an external, signed entry — so “the deployment ran” and “the deployment actually reached every server it claimed to” cannot collapse into the same sentence. When a deployment script silently skips the eighth server, the chain shows it. When a status report says “everything is working,” the chain shows what specifically was checked.

pip install chain-of-consciousness · npm install chain-of-consciousness
Hosted Chain of Consciousness → · See a verified provenance chain