We've had "fun" solving this for Phosphor which has similar parts to Causal, but is focused more on real assets and emphasizes connection with computable contracts.
For circularity, we found that we could keep the UX dynamic by making a deep copy of the circular part of the DAG behind the scenes, asking the user to determine which variable in that path should be "resolved", hard coding that variable in the copy, then solving that variable to zero through a newton optimization. Once optimized (in parallel to main graph), it feeds back into the main DAG just like any other dependency.
Would be a silly approach in Excel, but not so much here.
I work in this space. I don't envy this. Been through it more than once.
Did you also have challenges with circular references?