Change deferment during action registration to only defer placement.
Review Request #14707 — Created Nov. 24, 2025 and updated — Latest diff uploaded
When registering actions, we've historically deferred them if they
depended on a parent that wasn't yet registered. With the new
multi-placement actions being introduced, it's possible an action would
be placed somewhere currently valid and somewhere that may never be
valid (such as a legacy attachment point or one defined by an
extension). When this happened, the action would never end up being
registered.Actions are no longer ever deferred. Instead, placements depending on a
missing parent are now deferred.When placing an action during registration or when resolving a deferred
placement later, any deferred placements depending on the newly-placed
action will be further resolved. This ensures that placements will
always resolve once all parents have been placed, no matter when that
occurs.If an action is unregistered, any actions depending on it will move back
to a deferred state so they can be re-placed if the action comes back.
This is important for extensions.Along with this, the registry has been updated to make use of
on_item_*hooks, instead of overridingregisterandunregister,
allowing the registry to manage when this logic occurs, taking advantage
of any locks.
All unit tests passed.
Verified this fixed issues with in-progress changes with actions
containing a placement that had a valid parent and a placement
that did not.