(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.
ls shows it, and nobody ran ls.|| true in a pipeline.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.
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 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
wc -c the file, count the rows,
decode the stored object, read the two token values.blast-radius skill
puts the bar plainly: listing callers isn’t the job; the breakage grep
won’t show you is.lsof,
the loaded config, the container’s actual env, and assume health checks
are wrong until one has gone red on purpose (Ch. 32).create-verification-skill generates exactly
that per project: a script that drives the real app like a user and
captures the evidence.Don’t
|| true on anything that computes a verdict.
That single operator took three correct alarms off the wall for five
hours.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.
Verified:
~/Projects/airank/blog/2026-08-08-everything-reported-success.md|| true in the pipeline; collector ran dark 5+ hours.
airank incident blog, 7 August 2026:
~/Projects/airank/blog/2026-08-07-three-alarms-none-of-them-wired.mdreapStale()
defined with zero callers. Fix live but not deployed, proven by
lsof on the running process. Same source, 7 August
2026.minio_key IS NOT NULL after deploy timestamp, plus decoding
one pulled object) took 90 seconds, proved 130 captures and 624
observations archived at 100%, returned a 1,859-character decoded
document, and caught a documentation comment that had misdescribed the
behavior for weeks. Council framing: “the cheapest verification outranks
the most confident theory.” airank incident blog, 9 August 2026:
~/Projects/airank/blog/2026-08-09-the-cheapest-verification-outranks-the-best-theory.md~/.claude/plugins/cache/pstack-claude/pstack/0.9.15/skills/,
upstream https://github.com/michael-denyer/pstack-claude.
principle-prove-it-works/SKILL.md (34 lines): “trust
artifacts, not self-reports,” “agents report what they intended, not
always what happened.” blast-radius/SKILL.md: “Listing the
callers is not the job. The agent can grep those in a second. The job is
the breakage grep won’t show you.”
create-verification-skill/SKILL.md: “Every serious project
needs a scripted way to drive the real app and prove behavior.”manuscript/ by 06:12 (5h 16m); cause was a
SKILL.md that described the work instead of dispatching it; fix was an
executable procedure with an ls -la / wc -w
proof block before reporting done. AiBook blog, 9 September 2026:
~/Projects/aibook/blog/2026-09-09-the-skill-that-wrote-nothing.md