A relationship map quickly becomes persuasive. Draw a line from one function to another and it looks authoritative, even when the resolver had only partial information. The useful question is not just “are these connected?” It is “what observation supports this connection?”
Keep the explanation with the edge
Threadmark stores a directed source-to-dependency relationship with its kind, confidence, source path, span, adapter and a bounded excerpt of evidence. The inspector can take a line on the map back to the code that produced it.
Structural edges such as CONTAINS and EXPORTS describe containment. CALLS and REFERENCES need a supported static relationship. EXACT identifies direct syntax; RESOLVED identifies an unambiguous target through supported resolution. Neither label promises a runtime binding.
Uncertainty is part of the result
A computed import or ambiguous declaration is more useful as a diagnostic than as a confident-looking invented edge. The current release does not manufacture inferred edges, even though the impact engine has a way to carry inferred paths in future.
That choice leaves gaps. It also makes the map inspectable: a missing answer is not disguised as a definitive one.
Stable identity, changing evidence
Source line numbers move constantly. Symbol IDs therefore exclude line numbers, while spans still locate the evidence. Git relationship comparisons use semantic tuples so a shifted line does not create a spurious dependency change.
A file rename is different: path is part of symbol identity, so the current comparison shows added and removed symbols. That limitation belongs beside the feature, rather than in a footnote nobody finds.
Based on the graph model and architecture. See the full case study →