To answer my own question:
An annotated type can be considered stable or complete if all of its supertypes are not erroneous. Example:
@GenClass("Base") class MyAnnotatedType extends Base {}
Suppose there is one A annotation handler for @GenBase that generates the specified class, Base in this case. And another processor B is interested in the entire MyAnnotatedType hierarchy, for example. he wants to create some kind of descriptor for all MyAnnotatedType methods, including those inherited.
If B runs to A, the Base class does not exist yet, so when B examines the MyAnnotatedType hierarchy, the superclass type mirror will be of type ERROR . B may take this as an indication to defer processing of MyAnnotatedType to a later round.
When starting A, it will generate the Base class, which will lead to another round of processing.
If B now works a second time, it can handle all types deferred in the previous round. Since Base exists now, it will no longer be of type ERROR . For this, I noticed (using javac) that it is important to get a fresh Element representing the type and not save it in the first round, which still contains a link to the erroneous supertype.
If Base does not have the erroneous supertypes themselves, the hierarchy for MyAnnotatedType complete, and B can proceed to process it. Otherwise, processing should again be delayed until the hierarchy ends. If the supertype is never generated, compilation will have an error anyway, for B it should be good so as not to generate code in this case either.
source share