Many people tried different ways to define what “done” means in a software project (as you can see here, here and here).
My experience, however, is making me believe that the problem may be in the word itself.
Saying something is “done” always creates different expectations depending on who we’re talking to. And having to create a specific definition for a word means it will only be valid for the people who agree on it, and as long as they remember it.
The solution? Well, maybe we should simply be using a different word(s). For instance, my gut feeling is that “ready” could probably do a better job. The main reason is that it invites further questions (“ready for what?"), whereas done ceases the communication (“if it’s done, let’s move on.").