I don't see the benefit for this faux-generalization of shouldRun and resultant downgrade from interface to abstract class.
I'm not seeing determinism-level-dependent micro-optimizations as a budding cottage industry.
So what do we lose by keeping the dependence on determinism level as SeqScansToUniqueTreeScans' own little secret?
That would only require either adding DeterminismMode detMode (like Database db) as an argument to apply(CompiledPlan plan) which I don't love much either, OR caching it (along with Database db, BTW) as a not-much-used member of CompiledPlan -- which I think I hate a little less.
You give one microoptimization its own argument-dependent opt-out function, and soon they'll all want one.