Okay, getting a late start again. Let's see what I want...
The Registry defines four methods for updating its contents, though one is normally called by a convenience hook on another. I think to handle this, I'd like to completely separate them in the actual classes, and make a helper function that combines them in some kind of stream-based way or something.
Thinking about this, I could put calls to coercion functions into the helper functions, so the objects can contain the coerced strings.
The other thing I'm thinking about is how small I want to make these objects. In a few cases, making the objects simpler means I need more validation logic, because I can't offload the invariant maintenance onto the object structure. Like, if I can add new required Targets to an Action whenever, then that means that adding a Target requires a check for cycles.
Maybe there's some way to add additional data to the internal representation to convert non-local invariants to local invariants. I'll just assume I can do that later and write something simpler for now. What could possibly go wrong?
I'll probably think about this a bit more before changing the code.
But anyway, I'll regret my decisions that led to this point even more if I don't wrap up ASAP.