A push carries aps.badge and iOS applies it on arrival, so the badge is right the moment a notification lands and wrong from then on — nothing tells iOS the count dropped when the inbox is read in the app. Observed: four notifications, badge reads 4, inbox cleared, badge still 4.
markAllRead sets zero, which is exact and is the reported case. DashboardViewModel.load sets the server's unread on every load, which corrects everything else on each app open.
Marking a single row read deliberately writes nothing. The approved design said decrement by one, but there is no reliable value to decrement from: setBadgeCount has no getter, and the inbox list is a PagedListModel, so the rows in hand are not the unread total. A guess there would be a third source of truth that can disagree with the other two; the dashboard resync covers it instead.
Multi-account: the badge is per-device, unread is per-account, so the last writer wins — a push for one account then a dashboard load on another disagree. Exact for a single account. Summing across accounts would mean querying every account on every write and would no longer match what you see when you open the app.
Not unit tested. setBadgeCount talks to the system with no seam; a fake would test the fake. 461 passing, unchanged.