McpMixinPlugin
Picks AT MOST ONE of the three ChatComponent capture mixins per runtime, so their entry points cannot overlap and no line is captured twice. The eras differ by which methods exist, which is a property of the shipped class file — so it is read from there, never guessed: a variant is applied only where its shape was confirmed in those bytes, and none at all where they cannot be read.
Runs during config preparation, before any target has loaded: plain Java and slf4j only — no Kotlin, no mod class, and never Class.forName on a target, which would define it before it is transformed.