TIPS 09 · PROVA

When it says “done” and it isn't true

The line to put in CLAUDE.md so Claude stops saying “done” without proof, and the four checks I use to make sure it follows it.

What it is and why it matters

You ask for a change. After a while Claude writes “done.” You open the app and it doesn't work, or it only half works. At the start this happens a lot, and your first reaction is to think it lied to you.

It didn't. Claude stops when the work looks finished, and for Claude the work often ends when the code is written. If nobody asked it to test it, “looks done” is the only signal it has. So the checking lands on you, later, when you may already be thinking about something else.

The fix is a single line, in the file Claude Code reads at the start of every session: CLAUDE.md. The line changes what “done” means. It no longer means “I wrote the code,” it means “I saw it work and I'll show you the proof.” I call it the receipt.

It matters because you can check a receipt quickly. Redoing every test yourself each time takes far longer, and sooner or later you stop doing it.

1. The line in CLAUDE.md

CLAUDE.md is a text file with the rules you want Claude to keep in every session. The project one lives in the project's main folder: CLAUDE.md, or .claude/CLAUDE.md. If it isn't there, create it.

The easiest way is from inside Claude Code: type /memory. It shows you the memory files, including the ones that don't exist yet. Pick the project one: if it doesn't exist, it creates it and opens it in your editor. If the project doesn't have a CLAUDE.md yet, you can also run /init: Claude looks at the code and prepares a starting one for you. Then you add the line.

The line
Never say "done" without proof: the tests you ran with their result, a screenshot if there's an interface, the command you used to test it. If you couldn't test it, write "not verified" and why.

Each part has a reason:

  • The tests with their result: it tells you what it checked and how it went, not just that it ran them.
  • The screenshot if there's an interface: a test can pass even with a button that ended up off the screen.
  • The command it used: so you can run the exact same test yourself.
  • “Not verified” and why: it's the way out. Without it, you push Claude to say “done” anyway. With it, you know right away where you need to look.

About the screenshot: Claude Code can look at images, but to take one itself it needs a way to see the app, for example a browser connected to Claude Code or a simulator. If it doesn't have one, it will write “not verified” for that part. That's fine: at least you know.

2. How I check it

A new session and one question

I save the file and open a new session, because CLAUDE.md is read at the start of the session. Then I ask:

The prompt
When is something done for you? Answer with the rules you have in CLAUDE.md.

If it doesn't repeat the rule, the file isn't the right one or it isn't in the project folder. To check, type /context: under Memory files you see which memory files it loaded. If your CLAUDE.md isn't there, Claude can't see it.

A small job

I give it something small and easy to check, for example:

The prompt
Fix the login error message when the email is empty.

When it says “done,” I check that all three things are there: tests and result, screenshot, command. If one is missing and there's no “not verified” with the reason, the receipt is incomplete.

I rerun its command

I copy the command it wrote and run it myself in the terminal. If I get a different result, the receipt doesn't count. You don't need to do this every time, but you do the first few times: that's how you find out whether you can trust its receipts.

I look at the screenshot

It has to show the right screen, not just any page. In the login example: the empty email field with the error message under it. If it shows the home page, it proves nothing.

3. If the project has no tests

Without tests, the first part of the receipt doesn't exist. Before anything else, ask it this:

The prompt
Write a test for what you just did, run it and show me that it passes. Then break the code on purpose and show me that the test fails.

The second part is the one that matters. A test that never fails proves nothing: it passes whether the code works or not. If the test turns red when the code is broken, then it's really checking something.

Then have it put the code back:

The prompt
Now put the code back the way it was, run the test again and show me that it passes again.

And so it doesn't have to guess how to run the tests next time, have it written into CLAUDE.md:

The prompt
Add the exact command to run this project's tests to CLAUDE.md.

4. If it says “done” without proof

It happens even with the rule. Just reply:

The prompt
Proof?

That's usually enough. If it happens again:

The prompt
Read the rules in CLAUDE.md again and give me the "done" again, with the receipt.

If it keeps skipping it, look at how long your CLAUDE.md is. In a file full of rules, the important ones get lost: keep it short and remove what Claude can work out by reading the code. If one single line keeps slipping past it, you can make it stand out, for example by writing IMPORTANT in front of it. Only that one: if you emphasize everything, nothing stands out.

Common mistakes

  • Putting the rule in a file Claude doesn't read, like the README or a separate note. It goes in the project's CLAUDE.md, and /context tells you whether it's loaded.
  • Removing “not verified” so you always get a “done.” Leave it in: it's the part that keeps Claude honest when it can't test.
  • Reading the receipt without checking it. The first few times, rerun the command yourself and look at the screenshot carefully.
  • Accepting tests that always pass. Have it break the code on purpose and watch the test fail.
  • Expecting the rule to apply right away in the session you already have open. Open a new session and ask the check question.
  • Filling CLAUDE.md with rules until the proof rule gets lost. Keep it short and concrete.

Checklist

  • The line is in the project's CLAUDE.md
  • In a new session, Claude repeats the rule
  • Every “done” comes with tests and result, screenshot and command
  • I've rerun its command myself at least once
  • The test fails when the code is broken
  • When it can't test, it writes “not verified” and why

Frequently asked questions

When it says “done” without proof, is it lying to me?

No. A “done” without proof isn't a lie: for Claude the work ends when the code is written. The rule moves the finish line to when it has seen it work.

With the rule in CLAUDE.md, can I be sure it will always do it?

No. Claude reads CLAUDE.md and tries to follow it, but it's guidance, not a lock. If you want a check that doesn't depend on Claude, there are hooks: commands Claude Code runs at fixed moments, whatever Claude decides. For example, one that runs the tests and doesn't let it finish until they pass. To get started, the line is enough.

What if my app has no interface?

Then you don't need the screenshot: the rule only asks for one if there's an interface. You still get the tests with their result and the command. For a script, the output of the command it ran is good proof too.

Do I have to add it to every project?

If you want it everywhere, put it in ~/.claude/CLAUDE.md: it's your personal file, and Claude Code reads it in every project on your computer. The one in the project's CLAUDE.md only applies there.

← All guides