How finished does a design need to be before handing it to developers?
On this page
A design is ready to hand off when it resolves the decisions developers cannot make on their own, not when every pixel is buffed. The threshold is the kind of gap that remains: if what is left is implementation detail, the engineer’s job, you are ready; if what is left is a design decision dressed up as a gap, you are not. That means a handoff has to specify the states, the edge cases, the responsive behavior, and the interactions, because those are choices, and choices belong to the designer. What it does not require is that you have manually nudged every margin to perfection, because spacing systems and minor polish are things a competent developer can carry. You finish the decisions, then hand off resolved intent rather than a guessing game.
The bar lands on decisions rather than pixels because of who is equipped to make which call. A developer can absolutely implement consistent spacing, snap to your grid, and handle the mechanical translation of a layout. What a developer cannot fairly be asked to invent is what the screen should do when the data is empty, when the form errors, when the text runs three lines instead of one, when the button is loading, or when the viewport is a phone. Those are product and design judgments, and if the mockup is silent on them, someone fills the silence under deadline pressure, usually with whatever is fastest rather than whatever is right. The cost of an unresolved decision is not a slightly-off pixel; it is a wrong behavior shipped to users, then re-litigated in a bug ticket weeks later.
The classic failure is the happy-path mockup. A designer hands over one beautiful screen, a list with three perfect items, a form with ideal input, a card with a short, tidy title, and considers it done. The build then reveals everything the happy path hid: what does the list look like with zero items, or two hundred? What does the form say when the email is invalid? Where does the layout break when the title is forty words? The developer guesses, the result diverges, and the designer is surprised by their own omissions. A handoff-ready version of that same screen ships the empty state, the error state, the loading state, the long-content case, and at least the key breakpoints, so there is nothing left to invent. Annotating the interaction matters just as much: what the submit button does while the request is in flight, whether a failed save retries or surfaces a message, and how a disabled control behaves are all decisions the picture alone cannot convey and the developer should not have to choose.
Where this breaks down is that finishing the decisions is not the same as over-specifying, and it does not mean delivering every conceivable permutation. You resolve the decisions that have real consequences and that the developer genuinely cannot make alone; you can leave the truly mechanical details to the implementation and the design system. Demanding pixel-perfect comps of every breakpoint and every minor variant is its own waste, and it can even slow the work without reducing ambiguity. The art is telling a consequential design decision apart from a routine implementation detail, and spending your finishing effort only on the former.
So before you hand anything over, walk the screen as a developer would and hunt for the questions you have not answered: every state, every edge case, the responsive behavior, the interactions. Resolve those, and let the implementation details and the system carry the rest. Hand off resolved intent, not a happy-path picture that forces the team to guess at the decisions that were yours to make.