Useful walkthrough. One sharpening: pair go mod graph with go mod why <module> — the graph shows you the edges, why tells you which of your imports actually pulls a module in, which is what you need when deciding what to cut. Also worth noting for readers: since Go 1.17 module graph pruning, the graph is shallower than it used to be, and a "cycle" in require directives is a version-selection quirk — true import cycles are still rejected by the compiler. Different problems, different fixes.