> 4.  I consider those cross-phase calls (one phase calls entire other phase) an anti-pattern
>
> When it comes to 4. I'd prefer if we had reusable, very focused components that have clear dependencies (e.g. can run at given phase) and are called from different phases. Does it make sense?

It isn't ideal, of course, and it might be a sign that the phases are ordered the wrong way around, or that two phases ought to be merged. But sometimes there switching the order just leads to a bigger set of problems, so we're stuck with this sort of problem.

But in those cases, I actually think that its quite natural for the later phase, `P_n` to generate some trees as-at an earlier phase `P_m`, and let all of the intervening phases locally transform this. You can then reason about things pretty naturally: the result should be the same as if I had manually written the trees.