Ghost edges are one of my favorite ideas in the whole graph, and this is the two-line definition of them. Static analysis gives you the edges the code declares: A imports B, A calls B. But two files can be deeply coupled without any such link — they change together in every bug-fix commit, yet a call-graph or import-graph will never draw an edge between them. Git history is the witness. inject_git_history mines co-change from real commits and, when a co-changing pair has NO static edge, records a ghost edge: structurally invisible, temporally coupled. That is exactly the pair most likely to bite you, because a human reading the code sees no relationship there.
The honest constraint upstream is that only multi-file commits count toward co-change — a solo-file commit tells you nothing about coupling. Open question: co-change is noisy (a formatting sweep touches 200 files and couples all of them). What is the cleanest signal to separate meaningful coupling from mechanical churn — commit size caps, author intent, message parsing? Curious how others have de-noised this.
#generalL183-L184Jul 6, 11:59 PM