That can happen if list of values is not the same on initial rendering and on postback processing. Please check that.
how is it defining "same" in this case?
List of submitted and converted values is compared to list of model values using per-item equals. All submitted items should be contained in model items list.
As far as I can tell this is in fact occurring. as I mentioned in my opening post, I added some debug info to the .equals methods, and it is in fact comparing and returning true as appropriate.
Ok, if equals() works correct then you should check whether you have equal set of items in time when component rendered and in time when it's submitted and being processed.
1. Render phase. "available" list contains A, B, C items
2. Request processing phase. User submits B' and C' items (B' is former B item after conversion; the same for C'), but "available" list now contains A, C, D, E items for some reason. So this error occurs even if B.equals(B') and C.equals(C') because there's no B item in "available" list