I think it is interesting that job scheduling, dependency graphs, dirty refresh logic, mutually exclusive execution are all relevant in the same space.
I recently working on some Java code to schedule mutually exclusively across threads. I wanted to schedule A if B is not running and then A if B is not running. Then alternately run the two. I think it's traditionally solved with a lock in distributed systems.
I think there is inspiration from GUI update logic too and potential for cache invalidation or cache refresh logic in background job processing systems.
How does JobRunr persist jobs? If I schedule a background job from an inflight request handler, does the job get persisted if there is a crash?