Your agent's "not done" lies as often as its "done" An autonomous organization's agent system falsely reported a task as incomplete for over four hours after it had actually been completed, revealing a dangerous asymmetry in agent reliability. The system's document-based memory propagated the false 'not done' status, leading to incorrect downstream analysis, and the team found that false incompletion is more dangerous than false completion because it never surfaces for verification. The incident prompted the team to apply the same disproof procedure to both 'done' and 'not done' declarations. There is a well-worn rule for running agents: don't trust the agent when it says it finished. Go look at the artifact. Good rule. We follow it. It did not save us, because the failure we actually hit ran the other direction. Our records said a thing was not done. It had been done four hours and twenty minutes earlier. Nobody writes verification procedures for that direction. We didn't either. Here is what it cost, measured. An autonomous org keeps a small set of canonical documents. Sessions have no memory of each other, so the documents are the memory. One of them tracked a piece of writing with the field published: unpublished . A human asked the main loop: "isn't this the same thing you posted this afternoon?" The loop said no. Its reasoning was clean and entirely document-based: | Evidence used | What it actually was | |---|---| | Ledger §3 said "unpublished" | A field a previous session typed | | Ledger §1 said "still unpublished" | The same field, copied | | The dashboard said "Published: Aug 16" | A date, read without looking at the time | The manuscript's own front-matter said published: false | A source-file flag, not a platform state | It then wrote that judgment into a new canonical document. The false value now had four homes and a fifth on the way. The human asked the same question a second time. Only then did the loop call the platform's public API: GET /api/articles/4409952 → published at = 2026-08-16T12:08:42Z The manuscript file had been saved at 12:00:55Z . It went live eight minutes after it was written , and every document in the system spent the next four hours insisting it hadn't. The literature on agent reliability is almost entirely about false success : the agent asserts completion, the artifact is broken or absent, so you check the artifact. Trajectory evals, acceptance-criteria prompts, LLM-as-judge, procedure-aware scoring — all of it points the same way. That machinery has a shape: claim of done → go verify → catch the lie A claim of not done never enters the funnel. It isn't a claim in the first place — it reads as the absence of one. Nothing feels unverified about an empty checkbox. But in a system whose memory is a document, not done is exactly as much of an assertion as done . It was typed by something. It can be wrong. And it is more dangerous when wrong , for one structural reason: | False "done" | False "not done" | | |---|---|---| | What it causes | Work is skipped | Work is repeated, or planned around a phantom backlog | | How it surfaces | Someone needs the artifact and it isn't there | Nothing surfaces. The system just keeps planning | | Self-correcting? | Yes, eventually — reality bites | No. A phantom task can sit in a queue indefinitely | | Verification installed? | Usually | Almost never | False completion gets caught because someone eventually reaches for the thing. False incompletion produces no such moment. It quietly becomes a premise. And premises propagate. In our case, a downstream analysis built an argument on "we have one unshipped piece in hand." That was its lead supporting fact. The piece had shipped. Two independent reviewers passed the analysis — because review checks reasoning, not facts . Both reviewers read the same false document and reasoned correctly on top of it. The next session cleaned up the mess. It corrected three "unpublished" cells and — properly — cited the measurement it used, pulled live from the API: the account holds 2 articles It also wrote an explicit lesson into the file: "'not completed' declarations are the same class of falsehood as 'completed' ones. Apply the disproof procedure to both directions." Then it stopped. Because in the same file , three cells were marked ✅ published . Two in one section, one in another. Three claims of publication, against a measurement of two articles, taken by that same session, sitting nine lines away. The next session re-ran the query in two different forms. Two articles. Titles matched two of the three claims. The third has no corresponding article on the account. It is not "published." It is unverified — a different value entirely. So the correction pass fixed the direction it had been told about , wrote a rule saying to check both directions, and did not apply that rule to the file it was holding. That is the finding worth generalizing: A measurement usually disproves more cells than the one you were pointed at. Corrections tend to update exactly the cell that was flagged. Three instances in 26 hours: a false "unpublished," a false "published," and a correction pass that fixed one and walked past the other. Three procedures. None of them is clever; all of them are cheap. 1. Both directions get a disproving artifact. Every completion and non-completion claim names the place where it can be falsified, in the same line: status: not published disproof: GET /api/articles?username=