This might be unpopular because of bad re-org behavior, but I believe the utility of this construction can be improved if we introduce functionality that makes a script invalid after a certain time (correct me if I'm wrong, I believe all current timelocks are valid after a certain time and invalid before, this is the inverse).
Then you can exclude old delegates by timing/block height arguments, or even pre-sign delegates for different periods of time (e.g., if this happens in the next 100 blocks require y, before the next 1000 blocks but after the first 100 require z, etc).