it doesn’t really matter whether it is a circular dependency or not, circular dependency is up to build system to figure out. The main point here is that a module in a build is only processed once so if users have cross module interactions, the user needs to be very certain about the restriction here, and to me this can easily get things hard to sustain. In the example above, it is technically feasible if we know for sure that processing A generates a0 which unblocks processing B, but not enough to unblock A itself, then processing B generates b which unblocks A, and if we look back, we can now compile A, if you can manage to run specific KSP tasks in order, you can eventually run the compilation task, ultimately you can run everything from command line (in the order of : kspA, kspB, kspA, compileA, compileB) if you are really concerned about circular dependency.