Looking at real rsync, it appears the 'x' option is passed to the other side (your code does not do this), and there is also some special case for >1 -x option.
Intuitively the client and server must do slightly different things especially when combined with --delete, or if one of them finds a fs-crossing in their space and the other doesn't, it gets weird. Gut feel is you've missed something.
