Tier-2 analysis — the part no existing tool does.
The supervision tree tells you what a supervisor contains. It says nothing about who outside that subtree depends on the processes inside it. This pass takes the resolved coupling graph and, for each supervisor, finds the edges that cross into its subtree from the outside.
Those external callers are exactly the processes that will observe :noproc
or :timeout when the supervisor restarts a child — failures the tree alone
would tell you are "contained".
Summary
Types
@type ranking() :: %{ supervisor: module(), members: MapSet.t(), edges: [Firebreak.Edge.t()], external_callers: [module()] }
Functions
@spec analyze(Firebreak.Forest.t(), [Firebreak.Edge.t()]) :: {[ranking()], [Firebreak.Finding.t()]}