Renders an Firebreak.Analysis as a graph in DOT (Graphviz) or Mermaid.
The diagram overlays the two structures firebreak recovers: the supervision tree as nested containers (one box per supervisor, labelled with its restart strategy) and the coupling graph as edges between modules. Edges that cross a supervision boundary — a caller outside a subtree depending on a process inside it — are drawn thick/red, because those are the dependencies a "contained" restart actually turns into a cascade. The picture is the finding.
Modules that no supervisor starts but that participate in coupling (external callers, unsupervised processes) are drawn as free, dashed nodes outside every box, so an edge into a subtree visibly originates from outside it.
Summary
Functions
@spec dot(Firebreak.Analysis.t()) :: String.t()
@spec mermaid(Firebreak.Analysis.t()) :: String.t()