Incremental analysis · import graphs · blast radius

I changed this file.
What else do I now need to look at?

Index Django's 883 files once, then pay milliseconds per change. A stateless analyzer pays the first cost every time. What a change reaches is a different question: the median file reaches 3 others, the worst reaches 588, and the average describes neither.

Index once. Pay milliseconds after that.

3.2 s first index, 883 files
71 ms confirm nothing changed
65.3 ms absorb one edit, median

Timed for all 883 files, not sampled. The cheapest edit is 79% of the mean, so an edit costs about the same whichever file you touch.

Every square is one file. Click one: the lit squares are its blast radius, the files that import it transitively, coloured by how many hops away.

Repo

Most changes are cheap. A minority are catastrophic.

Blast radius computed for every file in each package, not two hand-picked ones. Where the median sits far below the mean, the median change touches a handful of files while the mean is dragged upward by a small set of hub modules inside the largest import cycle, and the average tells you nothing about either.

What you are looking at

The map

One square per Python file, grouped into blocks by top-level directory and ordered by path. Block size is just file count, so this is a census rather than a treemap of importance.

The lighting

Clicking a file runs a breadth-first walk over the reverse import edges. Squares light in waves, one wave per hop, which is exactly the order a dirty-propagation pass would visit them in.

Why it matters

A diff is what you changed; blast radius is what your change reached. A one-line edit to a hub module is a one-line diff and a several-hundred-file impact. Only the second needs a graph.

Where the data came from

Pinned source distributions from PyPI, indexed by aic, with imports resolved exactly rather than by suffix matching. Every number here is generated, none typed in by hand.