It can't rely on the compute nodes having network connectivity, as Princeton HPC doesn't support this.
It must support popular HPC job scheduling systems, particularly Slurm.
It must support dynamic workflows, where jobs can spawn other jobs.
It should be Pythonic, broadly defined.
It should not require substantial changes to how you would normally write the underlying functions. In other words, it should be relatively simple to go from a standard function to a high-throughput workflow.
It should have support for job monitoring, tracking errors, and re-dispatching any failed workflows.
It should easily support distributed computing environments.
It should be actively developed and maintained.