I did some work prototyping my task runner concept. The core logic seems solid. What remains now is to write the harness for interpreting command-line input and formatting command-line output, fleshing out some of the auxiliary data types, and writing a bunch of helper methods to properly define the tasks.
I was able to get the core logic in an apparently-good state just by typing and editing it a bunch, but I think I'm going to need to do some more detailed planning to figure out what the reporting should look like. I'll also need to make the modifications to the current commands I run, to feel like I can trust the commands to work as expected when run concurrently. For Mypy, this means targeting the caches to a project-specific directory. For pytest, this means disabling the cache behavior completely, since I didn't ever use it.
I'll probably wait to implement this after I've planned it, because I really want a new pijul version first, so I'll go back into working on improving the project I want to use this for.
Anyway, it's gotten way later than I meant it to, so I'll stop writing now.