I don’t understand how to work with the intermediate language in such a back-to-front approach, wouldn’t you need to know in advance what pass to implement next so that the input to the current pass matches the output of your next, unimplemented, pass? To me, it seems like the contract is reversed