Shared upstream
Finding the common ancestor that explains an overlap.
Many pairs that look copied are two forks of a third project. ForkReason looks for that third project, and prefers it as an explanation when it fits better.
How a candidate is found
- GitHub's own fork metadata. A declared parent outranks any heuristic, because it is a recorded fact rather than an inference.
- Distinctive module and content vocabulary shared by both sides, which survives a rename.
- An ancestry constraint: a candidate must have existed *before* the later of the two repositories. A common ancestor that appeared afterwards is not an ancestor.
Why it wins when it fits
If a plausible ancestor explains the shared signals better than derivation does, the honest verdict is SHARED_UPSTREAM. Reporting LIKELY_DERIVED in that situation would be accusing a fork of something it did not do.