Yesterday I looked at core/runner.py. The natural next place to look is core/registry.py. So let's crack that open.
First off, we've got Action, which should be Task. Next, ActionInput, which should be TaskPrerequisite. Then, ActionOutput, which should be TaskOutcome. Then, TargetName, which should be OutcomeName. Then, SkippedName, which is fine.
Those all get unioned into Requirement. Let's put a pin in that one.
There's _ActionData, which should be _TaskData.
Finally, there's Registry, which, put a pin in that, but let's look at the methods.
- inputs -> prerequisites or prerequisites_of_action.
- chosen_targets -> named_outcomes. This method takes an iterable of target/outcome names, and resolves them to everything that they refer to.
- parent -> cause_of_outcome or something.
- default_and_non_default -> ... um, I'm not sure. Maybe I can figure a way to not need this method, because it feels kind of arbitrary.
- require should coordinate with Requirement. This is a multimethod that coordinates the evolution of the Registry. Given a Registry, if you pass a Requirement to the require method, you get back a Registry that additionally conforms to that Requirement, or it raises some kind of error if it can't reconcile the Requirements.
I'd like to give this a bit more consideration, but I just stood up and it made me feel awful, so I'm going to have to sleep on this, maybe switch gears for a few days.