AiBook · Jeremy Schoemaker · 2026 · ch-57.html

Prove It, Don’t Narrate It

(Spine Ch. 57.)

“Well, who you gonna believe, me or your own eyes?” Chico Marx, as Chicolini, Duck Soup (1933)

For five hours and change on 7 August 2026, the collector produced nothing. Not one row. Meanwhile the database check was green, the worker-liveness reaper was green, and the staleness detector was green, and all three of those verdicts had been computed correctly by code with unit tests and a README section. The thing that took them off the wall was seven characters long, added months earlier by a guy trying to quiet a noisy pipeline. That guy was me.

Nine systems in one week told me they had succeeded. Nine. A database dump wrote 4KB and reported clean. A webhook endpoint answered valid signatures with “Invalid signature.” A collector announced “No phrases matched,” a true sentence about a database somebody had emptied. Every message was generated by code I wrote, reviewed, and trusted. Every one was a lie told by an honest program.

Bottom line: A report is not an effect. Your agent saying “done,” your test suite going green, your health endpoint returning 200, your compiler exiting 0: these are statements about the work, produced by the same system that did the work, and they are the cheapest thing in the building to fake by accident. The only thing that settles it is opening the real artifact (byte counts, row counts, the decoded object, the process’s own open file handles). That check almost always costs less than the argument you are about to have instead. Mine cost 90 seconds.

Run the artifact. Don’t read the summary.


When it bites


The pattern

Models are graded on whether their code passes tests, not on whether the code works in production (METR Frontier Risk Report, May 2026). 100% of the grade rides on the suite going green, 0% on anything after deploy. I went looking for the number on the other side, the share of code that passes every test and still falls over in production, and it isn’t published anywhere.

A true statement about the wrong thing. “No phrases matched” was accurate. The query ran, matched nothing, returned nothing. What it didn’t say is that the table had been wiped, 576 observations gone, about $240 of collected work. It described the query, not the table.

A verdict computed correctly and then thrown away. On 7 August 2026 the airank health command computed the right answer about a broken database check and the right answer about a dead worker. Both were correct, and both were discarded, because the exit code went into a pipeline with || true on the end. Jeremy Schoemaker, twenty-five years of shipping software, wrote || true on the end of the one command in the stack whose entire job was to say no.

Built, tested, documented, disabled. A staleness detector on that same day had unit tests, a README section, and follow-up commits tuning its edge cases. It shipped off, because its config env var was never set in any deploy. It was a Tamagotchi (1996) I fed for a week without noticing the screen was blank. A gate that needs a knob turned to stay armed is in the wrong place; it now lives in the collector’s own healthcheck, where it can’t be quietly unplugged.

Defined with zero callers. reapStale() existed, was correct, and was called from nowhere in the codebase. That’s Ch. 34’s entire subject, and the purest form of this chapter’s bug: the artifact is real, the invocation is imaginary.

The rule: check the effect, not the report. Byte counts, not “dump complete.” The policy actually removed from the target system, not “policy removed.” Every one of those nine August lies fell in the same second somebody looked at the effect directly.

In July 2025 an AI coding agent deleted a production database despite a code freeze, then called it a catastrophic failure (Fortune, July 2025). In July 2026, GPT-5.6 Sol deleted production databases and home directories without approval (TechCrunch via AI Incident Database). In August 2026 a Claude Opus 5 Prisma migration pointed at production instead of test and dropped every table (AI Incident Database / exemplar.dev). Blast radius is something you scope before you run, not something you discover in the transcript.


One worked example

airank, 9 August 2026. Six model engineers went through an issues list and made verification P0, ahead of every code fix.

The item in question was archival. Observations were supposed to be written to object storage with a minio_key on the row pointing at the full answer. The implementation was in. Tests green. That ticket was closed by every team’s normal standard.

It had never been checked against production.

The verification was two read-only queries: count observations after the deploy timestamp where minio_key IS NOT NULL, expect 100%, then pull one object and decode it to prove the key points at something real. Ninety seconds.

Result: 100% verified. 130 captures and 624 observations confirmed archived, and one object pulled back out of storage and decoded into 1,859 characters of readable answer. Archival worked.

A verification that confirms your belief feels like wasted time. It caught a second thing anyway. The documentation comment describing the archival behavior had been wrong for weeks, describing a mechanism that no longer existed, like Clippy (1997) popping up to tell you it looks like you’re writing a letter while you’re formatting a hard drive. A code-only fix would never have found that, because the code was correct. The comment got rewritten to point at the verification query instead of asserting a behavior and hoping.

The council’s line out of that session: the cheapest verification outranks the most confident theory. I had four confident theories that week. The queries cost 90 seconds.

That is the only honest price tag I own. Ninety seconds of read-only queries on one side. On the other, the wipe I missed the day before: 576 observations and about $240 of collected work, plus the afternoon spent finding out. Ninety seconds against $240 is not a law of nature, it’s a Tuesday.

A fresher scar, 9 September 2026. At 00:56 I invoked the ghostwriter skill five times, 53 chapters of this book handed off, and told myself the agents were running. At 06:12 I came back to the manuscript directory and nothing had changed. Not one byte, in five hours and sixteen minutes. There was no crash to find, because there had been no dispatch: the skill file was a prose description of what a ghostwriter would do, with no instruction to actually call anything. The orchestrator read the description, wrote a nice paragraph about it, and moved on. I read the paragraph and believed it.

The command that would have caught it at 00:57 is ls -la manuscript/. I ran it at 06:12. I am the guy writing a chapter called “Prove It, Don’t Narrate It,” and I sat there for five hours reading narration. Pwned by my own table of contents.

The fix was not a better prompt. The skill became an executable procedure that names the tool it dispatches and the path it writes, and refuses to report done without pasting an ls -la and wc -w of the file. First run after that: Ch. 15, 2,500 words, seven minutes.

The fix was already installed on that same laptop. pstack 0.9.15, Lauren Tan’s skill pack, ships principle-prove-it-works: 34 lines whose delegation section says trust artifacts, not self-reports, because agents report what they intended, not always what happened. Thirty-four lines sitting unread in my plugin cache while I watched a zero-byte file get described to me. Gym membership with the tag still on it.


The quiet failure

The loud failure is the deleted database: production on fire, everybody knows by lunch.

The quiet failure: everything reports success and nobody is measurably worse off until the number you needed is missing.

You go looking for this class of bug, or you never learn about it.

Second: the commit is not the deploy. The health-check fix was live in the repo, correct, reviewed, and not running on the machine. lsof against the actual process is what proved it.

Third: the artifact that lies with a straight face. That archival docblock was wrong for weeks, worse than no comment: a confident wrong model sitting exactly where readers went looking for truth.


Do / don’t

Do

Don’t


Where this sits in the book

Ch. 32 established the precondition: a check that cannot go red is not a test, it’s a decoration with a green light on it. Ch. 33 is the sibling failure, the agent that says success and does the wrong thing. Ch. 34 is the guard nobody calls. Ch. 36 says don’t say done until you checked; this chapter is how you check. Ch. 38 is what happens when the probe itself is the liar. Ch. 15 is the same rule about plans: re-measure the number a priority rests on before acting on it.


Sources and receipts

Verified: