Component B is said to be call compatible with component A if uses of A can be safely replaced with uses of B in the following cases:
A call to a control block of A.
A call to an uninstall block of A.
A call to a snapshot block of A (using addSnapshot).
A check for dependency on A (using checkDependency or createDependency).
A reference to a variable of A (using config gen :[component:AB:var]).
Call compatibility basically means API/interface compatibility.
It is often the case that B and A are different versions of components in the same version tree. However, it is also possible for B to be in a distinct version tree if B is an instance of A.
The provisioning software enforces call compatibility for components that serve as system services. Specifically, when a system service is updated to reference a new component, we enforce that the new component is call compatible with the original component. This allows us to ensure that clients of the system service will continue to function properly when the system service is upgraded.
The provisioning software will also optionally verify call compatibility when resolving components referenced by certain installed component targeters. See the "Installed Component Targeters" section for details.
There is no requirement that a component be call compatible with earlier versions of itself, though it is generally recommended whenever possible.