A good handoff isn't measured by how complete the Figma file is. It's measured by how many Slack messages don't get sent during build.
Spacing tokens and font sizes are usually inspectable directly in Figma — engineers don't need a label for that. What they do need is the reasoning behind anything that looks like it could be 'wrong': why this button is secondary when it looks like the primary action, what happens if this list has zero items, why this field is optional when the others aren't.
Loading, empty, error, and overflow states are the most common source of mid-build questions, and the easiest to forget because they're not interesting to design. A flow with all four states designed — even roughly — saves far more time than extra polish on the happy path.
When a flow exists in three slightly different versions across old explorations, current design, and a 'maybe later' branch, engineers will eventually open the wrong one. Archive aggressively. The file that's live should have nothing else competing with it.
A short walkthrough call, even 15 minutes, where you click through the flow together and narrate the 'why' out loud, tends to prevent more rework than any amount of additional annotation — because it's the only format where someone can ask a question back.