It seems natural that optimizer Rule if run on output of the same Rule should not fire again.
While we may think of rules that do only part of work on first run, and some continuation of work on the second run, it does not seem like necessary feature.
If we agree that we do not need that, let's add a check to RuleTest verifying that:
rule.apply(rule.apply(plan)) == Optional.empty()