While polishing The Coccinella I noted one extra dialog when another user removed me from its roster by sending a 'remove'. This extra dialog was identical to the one when another user rejects a subscription from me. A bit of tracking pointed to a presence with type 'unsubscribed' which is sent by the server in both cases. So I went to the protocol definition, RFC 3921 where it says in section 2.2.1: "unsubscribed -- The subscription request has been denied or a previously-granted subscription has been cancelled."
This describes precisely the two situations which I'm trying to separate. In general, it is bad practice to have one protocol feature describe two different things. Then you have to use some kind of state information to separate the two situations, which introduces a dependency which is a bad habit and is error prone. I think I just skip that dialog for the moment.