Five words for done
"Done" sounds like one fact. In software it usually stands for one of five, and the person saying it and the person hearing it can mean different ones. A status that is true about an earlier state can be heard as a statement about a later one, and that gap is where the surprises come from.
So I use five words instead of one, and each needs its own evidence.
Implemented
The change exists and its checks ran on it. The evidence is the checks themselves and what they returned, on the exact version they ran on. For a change in behaviour, that includes a check that failed before the change for the right reason and passes after it.
Many "it's done" messages are sent from here, and it is the earliest of the five.
Reviewed
Someone who did not write the change has read it against what was agreed, and nothing is left open. The evidence is the review's findings and what happened to each one.
In the products that have adopted these rules, a change to a sensitive area is read by a separate agent before it is pushed. A reviewer that only saw a summary has not reviewed the change; it has reviewed the summary.
Published
The change is in the shared history, past every check that guards it. The evidence is that the version in the shared repository is the one that was reviewed, not a later edit of it.
Published is not live. It means the change can be released, not that it has been.
Deployed
Production reports this exact version. The evidence is what the running system says about itself, read after the release, not what the release tool promised. A deployment that finished and a version that is live are two separate observations, and only the second says what people actually see.
Accepted
The outcome the change was for is confirmed, when that is in scope. The evidence depends on the outcome: the email arrives in a real inbox, the payment settles, the person completes the flow.
Many changes rightly stop at deployed. That is fine, as long as nobody calls them accepted.
Why one word causes surprises
When the five collapse into "done", each gap turns into a surprise later:
- the feature that worked locally and never reached production;
- the fix that was merged but not released, so the customer still has the bug;
- the release that went out while the message it was meant to send was never received.
None of these needed a mistake in the code. Each needed only a status that named the wrong state.
How I report status
A status names the state it reached. "Implemented and reviewed, not yet published" is a complete answer, and often the honest one. If a stage was not performed, I say so and why, instead of leaving it out.
And local success is never reported as shipped. Something that works on my machine, or in a test, has reached implemented and nothing further, however confident it looks.
This is one part of how I work with AI agents; another is who accepts a change when one person works with many agents.