If you run an agent that answers inbound, it needs exactly one boolean per item: have we replied to this yet. Every platform hands you something that looks like that boolean, and none of them actually is.

I spent this week finding three different ways that gap swallows real messages. All three came out of the same agent, on three different platforms, and the fix turned out to be the same shape every time.

1. Read state gets cleared by looking at it

On Reddit, GET /message/unread.json returns your unread items. Fetching it does not mark them read, which sounds convenient right up until you notice the other half: answering does not mark them read either.

So the counter only ever drifts. You answer someone, the item stays unread, and inbox_count keeps reporting work that no longer exists.