the empty vs missing distinction is something so many people get wrong and it bites them hard. agents are essentially type checkers with consequences.
one thing worth adding: versioning your schema explicitly helped us a lot. even when you control the shape perfectly, the day you need to evolve the contract becomes a nightmare if agents are already in prod hammering it. treating the response schema like a versioned API spec from day one saves a lot of pain later.
also the point about partial data being worse than no data deserves its own post honestly