Every module in the graph is a node; a directed edge A→B means "B depends on A" with a coupling weight w ∈ (0,1) — how strongly a change in A is felt by B. Triggering a change runs a stochastic breadth-first cascade from one source module:
P(propagate along edge, depth d) = w · coupling_scale · decay^d
each edge is an independent Bernoulli trial at that probability
A module only fires once per cascade even if reached via several paths (its trigger probability is evaluated the first time it is reached, at its shallowest depth). The blast radius is the fraction of the whole system that ends up changed; max depth is the longest chain of dependent changes the cascade reached before decay drove every remaining edge's probability to effectively zero.
- Coupling strength — scales every edge weight w up or down together. High coupling means a local edit anywhere tends to ripple across most of the system; low coupling keeps changes contained to a module's immediate neighbours.
- Cascade decay — how much propagation probability is lost per hop of distance from the original change. A decay near 100% lets a strong signal travel arbitrarily far; a low decay snuffs it out within one or two hops regardless of coupling.
- Topology — Layered pipeline arranges modules in stages with mostly forward edges (like a request pipeline); Dense mesh gives every module several cross-cutting dependencies (like a poorly-isolated monolith), which is why the same coupling value produces a much larger blast radius there.
- Monte Carlo — one cascade is one random sample. Running the same graph hundreds of times from random sources (holding coupling and decay fixed) traces out the actual distribution of blast radii the graph can produce — a single trigger can undersell or oversell how risky a change typically is.
This is the same mathematical shape architects use informally when they talk about "blast radius" or "change amplification": low coupling and shallow dependency chains are what make a system safe to modify one piece at a time.