looking at it again: it `#normalize_rules` at initialization so it behaves immutably but computing `#tsort` each time.