This was my fault, a backwards null check was doing the opposite of what's intended...it illwill be fixed in the next build and counts will sync themselves tonight.
For those curious: what we saw is sometimes a user got deleted mid-grant, so in a tight loop of "update counts on users who got badges" we'd have granted a badge, but then be unable to fetch the user throwing a null ref. Of course that check works better as a if (user == null)
-> skip, rather than the opposite.
Update: deployed, badge counts will sync tonight (a sync actually runs every night, just in case)