In TaskWrapperBase, you can set a check_completed_func and an invalidator.
If check_completed_func returns True, the invalidator is ignored, and the task is not run.
If check_completed_func returns False, the task is run again and the invalidator is not called, as you would expect.
If check_completed_func returns a time, then the time is compared to dependencies, and the invalidator is called. If the invalidator invalidates, the task is run.
Bypassing the invalidator on check_completed->True but not check_completed->time violates the principle of least surprise for no good reason.
Filing a bug because I don't have time to make sure I am not introducing a logic error now.
In TaskWrapperBase, you can set a check_completed_func and an invalidator. If check_completed_func returns True, the invalidator is ignored, and the task is not run. If check_completed_func returns False, the task is run again and the invalidator is not called, as you would expect. If check_completed_func returns a time, then the time is compared to dependencies, and the invalidator is called. If the invalidator invalidates, the task is run.
Bypassing the invalidator on check_completed->True but not check_completed->time violates the principle of least surprise for no good reason.
Filing a bug because I don't have time to make sure I am not introducing a logic error now.