After some digging I found org.codehaus.groovy.transform.trait.TraitComposer and from there I was able to backtrack to how groovy transforms statically defined traits. This is performed in canonalization, so it appears that a trait that is added to a class during semantic analysis may still have its fields/behavior applied to that class. So, I was able to get this to work as follows:
1. Compile the trait.
I was having some problems jointly compiling the trait while compiling the class that implements the trait when using the embedded compiler. If I recall correctly the base issue was that if I declared the trait as follows:
the TraitComposer did not recognize the interface ClassNode as a Trait (no @Trait annotation). I suppose that the ClassNode constructor above does not trigger a proper compilation/load of my trait's groovy file (?), but I frankly didn't dig much deeper.
This is fine for my purposes. In my case, the Trait developer (framework developer) is different than the class developer (citizen developer).
2. Declare the trait during semantic analysis of the Class.
classNode.addInterface(new ClassNode(<trait javaclass from 1>);