Unfortunately, AbstractLog does not help since you cannot install an alternative Log impl in time. Therefore the buffering has to be done inside the existing Log impl.
Then, the next step is a change in strategy. Rather than identifying unrecoverable errors, identify the recoverable errors instead -- i.e. the errors that can arise from missing symbols, which might be fixed after a round of annotation processing. These errors are all generated via Resolve.logResolveError, so that gives a convenient place to tag all recoverable errors.
The final step is to change JavacProcessingEnvironment.Round.unrecoverableError to check whether any conditions have arisen which should stop annotation processing -- these include errors reported by the messager, any warnings if -Werror is set, and any javac errors that did not come from Resolve.logResolveError.