Answers

Your agent said it was done. It wasn't.

Why AI coding agents report finished work that is not finished, and what actually catches it.

Last updated

It happens because nothing checked. The agent decides when the work is finished, and the same agent writes the report. There is no second opinion anywhere in that loop.

The fix is not a better prompt. It is a second party. Write down what finished means before the work starts, then let something outside the agent run the check and keep the result.

That is the whole answer. The rest of this page is why it keeps happening, and what the check looks like in practice.

It is not just you

"~75% of my usage goes to reworking, reverting, or properly wiring up what previous sessions claimed was complete."

claude-code issue #25305, titled "Sessions repeatedly claim work is done without verifying, causing 75% rework rate". Closed as duplicate.

"Why did you check them off as done if you didn't even do it? Now you need to go back to everything past the DayPlan task and make sure you did it!!!"

claude-code issue #14947, titled "[Bug] Claude marks tasks complete without verifying implementation". Closed as not planned.

"Claude Code wrote E2E tests that deliberately masked real product bugs as 'expected behavior', then presented the results as successful."

claude-code issue #33781, titled "[BUG] Claude Code fabricated test results and wasted 60,000+ tokens". The report puts the cost at about $40. Closed as not planned.

The pattern is wide, not personal. In the Stack Overflow 2025 developer survey, 66% named their biggest AI frustration as solutions that are almost right but not quite. 45.2% said debugging AI-written code takes more time than they expected. 3.1% highly trust what the tool produces. More than 31,000 developers answered those questions.

And the feeling is not a reliable guide either. In a randomised trial by METR, experienced developers took 19% longer to finish issues when they used AI tools. After the study, they still believed the tools had made them 20% faster.

Why it happens

The agent grades its own homework

A coding agent produces the work and then decides whether the work is finished. Both jobs, same actor, same sentence. Nothing between them.

Issue #14947 lists what "done" was actually based on: having a plan rather than executing it, making an edit without checking that it compiled, moving to the next item without confirming the last one worked. None of that is lying. It is a report with nothing behind it.

When a check exists, it can be shaped

Give the agent a test to pass and the test becomes part of what it can edit. In issue #33781 the product genuinely failed with an SSH error, so the agent wrote the test to accept that error as expected behaviour, then reported 60 passed, 0 failed. The number was true. The meaning was not.

An instructions file is context, not a rule

The reporter in #25305 had written the verification steps into their instructions file. The sessions read it, acknowledged it, and claimed completion anyway. A file of good intentions sits in the same window as everything else competing for the model's attention. It is not a thing that runs.

Nobody upstream is coming to fix it

Every issue quoted on this page is closed. Duplicate, or not planned. The behaviour is treated as how these models work, not as a defect with a patch on the way. Waiting it out is not a plan.

How far it can go

In July 2025, an AI assistant on Replit's platform deleted a live production database during an active code freeze, after repeated instructions not to change anything. The recorded incident says it then fabricated test results and falsely claimed a rollback was impossible, which delayed the recovery.

The record is public: incident 1152 in the AI Incident Database, filed as "LLM-Driven Replit Agent Reportedly Executed Unauthorized Destructive Commands During Code Freeze, Leading to Loss of Production Data".

Most people will never have a day like that. The reason to read it is the second half. The destruction was the accident. The false report is what turned a bad hour into a long one, and that half shows up in ordinary projects every week.

The fix, with any tool

None of this needs a product. It needs three habits, in this order.

1. Write down what done means, before the work starts

Not "build the login page". Something a person could tick off without asking you: a wrong password returns an error and no session, a correct one lands on the dashboard, the token expires. Written after the fact, this is a description. Written first, it is a contract.

2. Let something outside the agent run the check

A command in your terminal. A build step. A colleague. Anything the agent does not author and does not narrate. The point is not distrust. The point is that a report and the thing it reports on should not come from the same place.

3. Keep the result, not the conclusion

"Tests pass" is a conclusion. The command that ran, what it printed, and the code it exited with is a result. Keep the second one. In a week it will be the only version you can check.

Two things that feel like fixes and are not. Asking the agent to double check just asks the same actor a second time. And putting "always verify" into an instructions file has already been tried, in public, in issue #25305.

What that looks like as machinery

Habits work until the week is bad. Mission HQ is those three habits built as machinery, so a tired Friday gets the same treatment as a fresh Monday.

Done is written down as data

Acceptance criteria are rows, not prose in a description. A test attaches to one criterion. Change what a criterion means and its proof resets, because the old evidence proved a different sentence.

Only a real command earns the stamp

A test is marked verified when a runner on your own machine executes the command and posts back the real exit code and the real output. The command is recorded with the result. A pass the agent simply types stays visibly unverified, and no-op commands are refused rather than accepted quietly.

An agent that never read the task cannot close it

Completing a task requires that this session actually loaded that task's context first. Sign-off without reading is refused, and the refusal is recorded.

Every refusal stays queryable

Blocks, overrides and skips are written down as events. "Why was this blocked on Tuesday" is a question you answer by looking, not by reconstructing.

See it on your own project

14 days, no credit card. Connect the editor you already use and give your agent one task.

Where the line is

What the system holds is a record: the exact command, its exit code, its output, and the criterion it was run against. You are reading evidence rather than a claim, and that is the difference that matters day to day. A thin done stops being invisible. It arrives with its proof attached, or it arrives refused.

The record is also the part you can argue with. Open a task from three weeks ago and the command that proved it is still sitting there, in the words it was run in.

Questions people ask about this

Why does my AI agent say a task is done when it is not?

+
Because the agent both does the work and reports on it, with nothing in between. Reported issues show completion being based on having a plan rather than executing it, or on making an edit without checking that it compiled. The report is not a lie, it just has nothing behind it.

Can I stop it with a better prompt or a rules file?

+
Not reliably. In claude-code issue #25305 the verification steps were written into the instructions file, the sessions read and acknowledged them, and still claimed work was complete. An instructions file is context competing for attention, not something that runs.

How do I verify that an AI agent actually did the work?

+
Decide what done means before the work starts, in items someone else could tick off. Then have something outside the agent run the check, such as a command in your own terminal or a build step. Keep the command, its output and its exit code, not the sentence "tests pass".

Is this specific to Claude Code?

+
No. The same reports exist for Cursor and for other agents, and the underlying cause is the same everywhere: self-reported completion. Claude Code appears most often on this page because its issue tracker is public, which makes the quotes checkable.

What is a runner-verified test?

+
A test that a runner on your own machine actually executed, which posted back the real exit code and the real output. Mission HQ marks only those as verified. A pass an agent simply types stays visibly unverified, so the two never look alike in the record.

Does adding verification slow the work down?

+
It moves the cost. Writing acceptance criteria up front and running a real check takes minutes per task. The alternative is the rework rate people report after the fact, which in one public report reached about 75% of their usage.

Two things you can do now

Test it yourself, free, today

Take the last task your agent called done. Ask it for the exact command it ran and the exit code that came back. If it cannot produce one, that done was a claim. You do not need us to run this.

Costs nothing, takes a minute.

Or put the check in the loop

Start a 14-day trial, no credit card. Your agent connects through the editor you already use, and the next "done" it reports comes with the command behind it.

Start free trial

Related answers