Yes.  We hit this state no matter what.

If we do it only at instantiation time you hit this same scenario, but also misses an important case.  What if someone makes an Async, then they store the dict form of it, then they basically clone it over and over to make new asyncs?  In that case the current value would be wrong and you'd get the infinite loop we're trying to avoid.  That's why I opted to go this route.

Also, you've got the same issue at instantiation time.  If it blows up, they may or may not be expecting that.  But, instantiation time has the issue noted above.

If we do this later, at run time, it is probably even worse, because then they never even got the chance to handle it and make an informed decision.  The task would just "silently" (from a code perspective) fail.  So to the inserted things look OK, but then the job never gets run.

What are your thoughts @tannermiller-wf?