This problem was due to the fact that the editor wasn't tracking changes to marker state, when the marker state changed as a result of changes to other source files. Thus the source editor annotations from a previous compiler run were left in place, even though the underlying problem was resolved, and the corresponding problem marker was removed.
This has been worked around (slightly inefficiently) by re-scheduling a parse when the problem marker state changes on a file open in an editor buffer.
A more efficient solution (that of matching a new set of problem markers against the existing set of problem annotations in the source editor) would require that the compiler messages be completely identical across runs. E.g. the current use of "instantiations" of existentially-quantified variables, like "self35135" and "place25188" in messages needs to be changed, so that messages identifying a given type are completely identical from one compiler run to the next.