From Figma to production without the handoff graveyard

Every product team knows the graveyard. It sits between the final Figma file and the shipped feature, and it's where the details go to die: the empty state nobody drew, the loading skeleton that became a spinner, the error message that became a toast that became nothing. The design was approved. The build was merged. Somewhere in between, a quarter of the intent disappeared.
The handoff is where intent leaks
The usual diagnosis is that engineers don't care about design or designers don't understand constraints. In our experience neither is true. Intent leaks because a static mockup answers about half the questions a build actually asks - and every unanswered question gets decided at 5pm by whoever is holding the ticket.
The things that die are remarkably consistent:
- States nobody drew - empty, loading, error, offline, and the awkward one where the user has exactly one item.
- Content that isn't lorem ipsum - real names are longer, real titles wrap, real numbers have more digits.
- Motion and feedback - the transition that made the flow feel coherent gets skipped because no ticket mentioned it.
- Responsive behaviour between breakpoints - the mockup showed 375px and 1440px; users live at every width in between.
Design with the build in the room
Our fix is structural, not procedural: the people designing and the people building are the same small team, in the same conversations, from the first wireframe. Designs are reviewed against real data before they're approved. Engineers flag expensive ideas while they're still cheap to change. And every screen ships with its states designed - because a screen without an empty state isn't finished, it's just started.
A live demo beats a handoff document
From week one of a build, there's a link where the actual product runs. Design review happens against that link, not against screenshots. When something drifts from the mockup, it's caught in days - while the fix is a conversation, not a migration. The graveyard exists because mockups and merges live in different worlds. Put them in the same one, and the details survive the trip.