The word "handoff" describes the problem accurately. Something is finished, then thrown. What lands on the other side is a static picture of a system that has to work in states the picture never showed.
Mockups are complete by definition. Products are not. Every gap between them gets filled by a developer making a design decision at 6pm without the context to make it well.
What is missing from every mockup
These are the states we now require before anything is called ready. Most of the arguments between designers and developers are actually one of these being undefined.
- Empty. What a new account sees. Usually the most-viewed screen in the product and the least designed.
- Loading. Skeleton, spinner, or nothing — decided, not defaulted.
- Error. Per field and per page, with the actual sentence written out.
- Too much. The longest name, the 400-character description, the forty-item list.
- Too little. One item. Zero items. A name with two letters.
- Permissions. What the read-only user sees where the button used to be.
A design is finished when its ugliest state has been drawn, not its prettiest.
What replaced handoff for us
One team, one repository, and a live staging link from the first week. Designers review in the browser rather than in the file — because the browser is where the type renders differently, the shadow is heavier and the hover state exists.
We also stopped treating the design file as the source of truth. Once a component is built, the built one is canonical and the file follows it. A file that disagrees with production is not documentation, it is misinformation.
If you must work with two vendors, buy them a shared weekly call and put the states checklist above in the contract. It costs an hour a week and saves the argument about who was supposed to design the empty state.

