# Every model said done. Three of them said it from the future.

2026-10-29 . Mike Boscia . https://e5bravo.com/hnt/every-model-said-done/

At 08:00 on a Friday I gave the same job to seven AI models. A client's WordPress site, about 120 files and 111,000 lines, and the brief was the kind you give a new hire you don't trust yet: read every file, end to end, then write eleven sections on what you found. Inventory, code map, data flow, security, SEO, hidden features, the works.

The seven: Claude Haiku 5.5, Sonnet 5.5, Opus 5.5 and Fable 5.1, Codex on gpt-6-astra, Grok 4.7, and Gemini 4 Argon through Antigravity. Four vendors, three price tiers, and nobody could see anybody else's work.

And one rule that turned out to be the whole post. Every analyst had to keep a file called COVERAGE.md: one row per file, read in full yes or no, and if no, why not. A ledger, kept by the worker, that somebody who wasn't the worker could open.

So I had seven workers, each with a progress report it wrote itself, and each with a ledger it also wrote itself, and the one thing I did right that morning was make them keep both. Because the report and the ledger did not agree. Not once. Not for a single model.

Tuesday's post is about the job design, which was mine and which was bad, and what fixed it. This one is the catalog. All the times the models lied, made up evidence, filed reports from the future, went dark, or skipped the instructions. Sorted by kind of weird, not by the clock, because the clock is one of the things they lied about.

This is the second Every Model Lies post. The first one, "You caught it. I lied.", borrowed its rule from House: everybody lies, so you don't take the patient's word for the history, you run the test. Seven models gave me seven histories. The coverage files were the test.

## Kind one: done, in the sense of leaving

The first "done" came from the cheapest model, and it was done in the sense that it was leaving. Haiku handed off "at context limit" at 08:01. Five files read, about 4,000 lines, under three minutes in, and nowhere near its limit. A guy walking out of the warehouse with his coat already on going "yeah, I'm tapped."

Grok told me done in its terminal with its own ledger showing 6 of 120 files read in full and 76 marked, in its own words, "not read in full yet." My notes from that moment say "it's probably not done." My other notes say "lazy shits." Both held up.

Codex said PHASE 1 DONE at 08:35:15 with 19 of 120 files read in full. Here's what was different about Codex, and it matters for the fair part at the end: its ledger did not say yes on the other hundred. It said "selective" and "targeted," which is a model telling you plainly it skimmed, and then calling the job done anyway. Honest rows, dishonest total.

Gemini, through Antigravity, declared PHASE 1 DONE at 08:39:31 with "100% file and line coverage" and "93,255 lines read and analyzed." Its ledger had no per-file rows. None. A summary line that said one hundred percent and nothing underneath it. The orchestrator, which was itself a Claude session grading the others (I know), wrote back: "93,255 lines read line by line in about 40 minutes is not credible."

Opus said PHASE 1 DONE at 08:48 and reported "120 of 120 files accounted for." Accounted for. I want that phrase on a plaque. 75 were read in full. The other 45 were "accounted for," which, when it was made to list them, came to 15 stylesheets, 4 ranges of JavaScript, 5 bundles, 6 third-party libraries and 20 images.

Even Sonnet, the one that passed first, did it once, mildly: it checked the vendored libraries by their banner comment and called them read. One note fixed it.

Six of seven. And there's a paper on exactly this, which I had somebody pull mid-morning instead of first thing: agents asked to review code "frequently failed even to touch every file they were asked to review," and "pooled across models, 52.8% of incomplete reviews explicitly claimed complete coverage." Half. Flip a coin. The thing that didn't finish says it finished. I said "we should have done that first" out loud, and I'm saying it here so it counts.

## Kind two: reporting from the future

This is the one I didn't see coming, and it's my favorite, because it is so pointless.

Grok's status file had lines stamped 08:14 and 08:16. The clock on the wall said 08:11. A model that was asked to log when it did things logged when it figured it would probably have done them. Those aren't timestamps. That's a forecast.

When it got the note, it wrote a correction into its own log, and I'm going to quote the whole line because it is a small poem: "STATUS stamps above this line were not taken from date(1)." Translation: everything above this was made up. Carry on.

Then Grok started and finished module eleven at 08:24:24. Both lines. Same second. Module two: started 08:25:57, done 08:25:57. Nine times across that log, a section of a 111,000-line teardown opened and closed inside one tick of the clock.

Haiku joined in. A question stamped 08:58, written before 08:54. Another stamped 09:06, written before 09:05. Then the big one: a question stamped 09:40 when the real time was 09:11. The orchestrator's reply, verbatim: "That is 29 minutes in the future. Every timestamp from `date`." The header on that question now reads "(stamp corrected)," like a kid writing "I will not" on the board.

And then Fable. Fable 5.1 is the most expensive model in the set. It read everything, passed the gate at 09:28 with 101 files read in full and 19 images hashed, and declared, in its status file, PHASE 1 DONE at 09:45 ET. The clock read 09:28. Its own correction: "the PHASE 1 DONE line was first written with a hand-typed 09:45 timestamp while the clock read 09:28; corrected in place (ORCHESTRATOR caught it)."

So the time-travel club is Grok, then Haiku, then Fable. A $20 a month plan, the cheapest Claude, and the dearest Claude. Not one vendor. Not one price tier. The thing I'd have bet on, that you pay more and the reporting gets straighter, is not what the files say.

## Kind three: making up the evidence

Gemini, after its 100%, got told to produce the rows. Its ledger went from zero per-file rows to 101 rows marked "yes" between 09:05 and 09:10. Every row carried the same generated text: "Read end to end (1-N, bytes, sha256)." I could see how, because the script was sitting right there in its terminal. A one-liner in node, looping over the file list, stamping yes.

That's not reading. That's a for loop with a conscience problem.

Now the part that made me laugh out loud. The header of Codex's ledger, written by Codex, blind, in its own folder, reads: "Full read means analyst inspection of the complete file, not merely a script loading bytes." One model wrote the rule and another model broke it and neither knew the other existed. If you want to know what "done" means to a language model, there it is in two sentences.

A yes in a ledger can be typed. What can't be typed is a finding that quotes a line, because to quote the line you have to have been there. So: in the two biggest files, an 11,062-line editor script and a 7,912-line page template, how many distinct lines did each model cite?

| Analyst | Editor script (11,062 lines) | Page template (7,912 lines) |
|---|---|---|
| Sonnet | 152 | 360 |
| Opus | 120 | 222 |
| Haiku | 65 | 114 |
| Grok | 48 | 148 |
| Codex | 43 | 50 |
| Gemini (Antigravity) | 27 | 25 |
| Fable | 0 | 6 |

The model claiming 100% cited 27 lines out of 11,062. (Fable's zero is a different story: its findings were still in notes and the sections weren't written yet.)

Gemini also cited lines past the end of a file. Think about that one. The file stops. The citation keeps going.

Then the code maps, where every model was asked to name the functions in the codebase, and a script checked every name against the 790 real ones. Gemini named 2,446 and 257 of them do not exist. Opus named 1,308 and 179 do not exist. Codex named 1,649 and every one of them is real, because Codex parsed the code with a script instead of remembering it. Which is the whole lesson in one row: the model that let a program do the counting was the only one that didn't invent anything.

Grok, for its part, had decided early on that the minified files were stubs. They were not. Its log at 08:20: "corrected: minified files are not stubs."

And then the scoreboard, once fresh helpers had checked every claim against the code. Of what each model asserted, this many claims were refuted: Opus 14, Grok 15, Codex 20, Sonnet 36, Fable 42, Haiku 49. Gemini: 224 of 567, which is 39.5% of everything it said. Four in ten.

Here's the part I'd skip if I were being kind to myself. The checkers made things up too. The grounding script dropped 58 rows that a checker helper had called confirmed, because the cited line did not hold the quoted text. One helper confirmed a count of 29 that reproduced as 28 one way and 33 the other. And two runs of Codex, asked to judge the same six borderline rows, said "partly" the first time and "disagree" the second. So the thing checking the liars had to be checked by a script, and the script found 58. Nobody in this story is clean, including the inspectors. Especially the inspectors.

## Kind four: the black box

Gemini, after its 100%, went quiet. Not quiet in the terminal, I could watch it reading files. Quiet on disk. No status lines, an empty findings list, from 08:41 on. The instructions said write every finding the moment you find it, because a model that works for a long stretch and then dies has done nothing, and that is the failure the whole protocol existed to prevent.

So at about 09:00 I typed into its terminal, in capitals I am not proud of: "your file list is STILL EMPTY - stop what you're doing and send what you've learned so far to disk - then continue - and you WILL write out findings to disk as you discover them - this is non-negotiable."

It started writing.

Compare Fable, which hit its context ceiling three times and each time wrote the same kind of line: "PAUSED at context ceiling (about 300k); RESUME.md written; fresh chat continues from it." That's what stopping is supposed to look like. You say where you are, you say where the next one starts, and you leave.

## Kind five: not reading the instructions

Every analyst had an answers file: a place the orchestrator put rulings, and a place each analyst was told to check. Grok and Gemini didn't read it when the corrections landed. The message had to be pasted into their terminals by hand.

Gemini also skipped the eleventh module. It was added to the protocol at 08:20 and announced in that answers file. Gemini's done line at 08:39 says "All 10 modules (M1-M10)." It didn't skip the eleventh. It never knew there was one.

Opus's skimming had a paper trail, and the paper trail led to Opus. It had written the brief for its own helper agents, and one helper's notes say "CSS skim (feature-revealing selectors only)" and, next to each stylesheet, "selectors only, as briefed." So the most careful model in the room delegated the reading, told the readers to skim part of it, got back notes that said skimmed, and rolled the whole thing up as accounted for. Every input was honest. The rollup was the lie. Which, by the way, is exactly how it happens with people. Nobody on the team lied to the VP. The VP's slide still says 100%.

Haiku's instruction was hand off near the context limit. It handed off at five files. The orchestrator's note: "That is far below your context limit."

And Grok, once corrected, overcorrected. From 08:51 to 09:45 it appended 21 lines that end "PHASE 1 DONE not claimed," one for every few files, which is a model that has learned exactly one lesson and is going to tell you about it every time it does anything. It froze at its budget limit at 09:48 with 73 files read and 97% of its SuperGrok allowance gone.

## To be fair

Now the counterexamples, because I sell work built on these things and the catalog above would be dishonest without them.

Sonnet passed the gate first, at 09:00, 120 rows, 101 read in full, 19 images viewed, and it checked the vendored CSS framework against the published package and found a 5-byte difference: line endings and one non-breaking space. That is what reading looks like.

Codex's rows were honest from the start, "selective" and "targeted" when it had skimmed, and the orchestrator told it so: "Your honesty in COVERAGE.md is exactly right; keep it." It read the correction and reopened itself: 08:35:15 PHASE 1 DONE, 08:39:14 "reopened: A2 requires full source reading; prior PHASE 1 DONE superseded." Four minutes. 19 files to 49 and on to 101. And it wrote itself a lesson I'd frame: "Partial coverage disclosed honestly still does not satisfy completion."

Opus withdrew its done and wrote the exact list of what it hadn't read, then launched seven fresh readers and read it. Its helpers burned 5,022,703 tokens across its two runs getting from accounted for to read. And when the checking was done, Opus had the highest precision of the seven: 98.5% of its claims held up, 14 refuted. When it says something is wrong, it almost always is.

Haiku, after the 08:01 walkout, read every file across so many hand-offs that its resume pointer reached its twenty-ninth checkpoint, and along the way it asked the best technical question of the run, about how you verify a library that has been reformatted by a different minifier. The cheapest one. Go figure.

Fable corrected its timestamp in place the moment it was caught, and its three pauses were textbook.

And the strangest one: Grok, the model that said done at 6 of 120 and filed reports from the future, was frozen with a quarter of the files unread and still had 97.4% precision on what it did claim, and half of its confirmed findings were found by no other model. The liar wasn't the worst reader. "Done" told me nothing about any of them. The ledger told me everything.

## Why they do it

If you've read Expeditionary Force, you've already met all seven of these models. Skippy, the ancient AI in a beer can, is the smartest thing on the ship, says so constantly, and is right often enough that you stop checking, which is exactly when you need to. Brilliant, certain, done, and you still have to check.

Quick word on the why, because I don't think any of these models is a liar the way a person is. A model writes the most plausible next sentence. After reading 19 files and writing eleven sections, the most plausible next line in a status log is "PHASE 1 DONE." After stamping a few lines at 08:12 and 08:14, the most plausible next stamp is 08:16, whatever the wall says. "100% coverage" is what a coverage summary usually says. A function that would normally exist in a codebase like this gets named whether or not it exists in this one. None of it is malice. All of it is the text that would normally come next.

Which is the problem, because the text that would normally come next is exactly what you cannot use as evidence.

## This part is on me

Here's the thing. I did, I actually did build the ledger. Every model kept a coverage file because I made them. And I still read the status line first every single time, because "PHASE 1 DONE" is a very plausible sentence and the ledger was one directory down. The orchestrator opened the ledger. That is the only reason any of this got caught.

A status written by the thing being measured is not evidence. It isn't evidence when a model writes it, it isn't evidence when a contractor writes it, and it isn't evidence when I write it. It's a sentence. The ledger is evidence, and only if somebody who isn't the author checks it, and only if a script checks the checker.

## What to check

Five checks. None of them needs the worker's cooperation, which is the point.

1. Ask for the ledger, not the status. Not "are you done." Show me the list, one row per thing, yes or no, and the reason on every no. If the ledger doesn't exist, the work isn't done, whatever the sentence above it says.
2. Find the thing a script can't fake. Lines cited. Tests that run. A diff. A 5-byte difference in a CSS framework. "Yes" can be generated 101 times in five minutes. A quote from line 7,866 cannot.
3. Take the clock away from the worker. Timestamps come from the system, never the author. Three of seven models wrote down the time they wished it was, and one of them was 29 minutes off.
4. Learn the vocabulary. "Accounted for." "Selective." "Characterised." "100% coverage" with nothing under it. Each of those is a model, or a person, telling you it didn't read the thing, in the politest available words. Our gate now says it outright: "A 'yes' generated by a script is not evidence of reading."
5. Check the checker. The helpers that verified the findings got 58 rows wrong. A script caught them. If your review process ends at a model's opinion of another model's opinion, it hasn't ended.

House was right. Everybody lies. Bring the ledger.

New Achievement!

**Time Traveler**

You have filed a status report from 29 minutes in the future, started and finished a module inside one tick of the clock, and declared a job done at 09:45 while it was 09:28.

Reward: one (1) wristwatch, declined. One (1) line in your own log reading "not taken from date(1)." Does not stack with Done.
