Five states, five treatments
The rule
Nothing needs your attention right now.
The request failed. Nobody knows whether anything needs attention — least of all the interface, which just said it didn't.
We couldn't load your inbox.
Anything waiting on you is still waiting.
Try againSays what is unknown, and does not spend the user's trust on a claim it cannot make.
A failed read must never render as an empty state. "Nothing here" is a claim about the
world; a failed request is an admission that we cannot see the world. In a supervisory
interface the two are not merely different in tone — telling someone that nothing needs them,
when in truth an agent is blocked and waiting, is the single most damaging thing the product
can say. Branch on the error before the empty case, always.
Two implementation notes. A polling query reports itself pending again while it
retries, so branching on "is loading" before "has errored" makes the message flicker on the
poll interval — hold the error steady from the second failure onward. And distinguish only
authentication failure from everything else: one unreachable server surfaces
under three or four different transport codes depending on what sits in the path, and no
member has ever been helped by being told which.