A finding is a claim plus a pointer: "line 412 says the retry loop has no backoff." The claim survives edits; the pointer does not. A formatter reflows the file, a rename touches every call site, a block is cut and pasted three screens down. The diff tools most teams already use know about this. Review Board detects a moved block and shows a jump indicator rather than a delete-plus-insert pair Review Board documentation, and the Rich Diff Checker separates move, update, copy and find/replace operations so a reviewer sees what actually changed the Rich Diff Checker. IntelliJ's diff viewer color-codes added, modified and deleted lines and lets you collapse unchanged fragments to focus on the change itself the IntelliJ diff viewer.
Your re-anchor problem is the inverse of the diff problem. You are not asking "what changed between two versions?" You are asking "given a snippet from version N, where does it live in version N+7?" That matters because the answer has three possible shapes, and they need different handling:
- The text is identical and moved. Similarity will find it, usually with a score of 1.0. Assign it and stop.
- The text is edited but recognizable. Similarity finds the neighborhood; you need a threshold to decide whether the match is good enough.
- The text is gone or unrecognizable. Similarity returns noise, and you need a second opinion or a person.
The third case is where naive pipelines quietly corrupt data. A fuzzy match that lands on the wrong function is worse than an unanchored finding, because it looks resolved.



