Graphify-Labs/graphify PR #1852 — Entity dedup prefers defining nodes — PR #1852
Graphify-Labs/graphify · pull request #1852 ·
Transcript
PlainEnglish
Let's walk through pull request eighteen fifty-two for Graphify. This one refactors how the entity deduplication logic chooses which node survives when two nodes share the same ID.
PlainEnglish
Here's what we're pursuing. First, we want the file that defines an ID to win collisions, not just whichever node showed up first in the chunk stream. Second, we need collision reports that distinguish between real data loss and harmless cross-reference rewiring. Along the way, we'll recognize both absolute and repo-relative paths as defining the same entity, and preserve backward compatibility with older bare-stem IDs. One constraint: we won't touch the existing same-file same-label deduplication behavior.
PlainEnglish
The prior dedup pass kept the first node it saw when two shared an ID. That meant chunk order decided whether an entity kept its own attributes or inherited a cross-reference's. The issue is that IDs encode the source file path, so a document referencing an entity mints that entity's ID and collides by construction. The old warning fired for all cross-file collisions but missed the one truly lossy case: two files in different directories with the same relative path both encoding an ID.
Architecture
First, we add two helper functions. The top one computes all valid trailing slices of a source path that could legitimately mint an ID. It handles absolute paths, repo-relative paths, Windows backslashes, and even pre-issue-fifteen-oh-four bare-stem IDs. The second helper checks if a node's source file matches its ID's encoded path. If it does, that node defines the ID, meaning it's the owner, not just a cross-reference.
Architecture
Next, we add a reporting function that classifies collisions by what's actually lost. If a cross-reference folds into the entity it references, that's silent—edges just rewire by ID. If the same file emitted two labels for one entity, we log a note, not a warning. But if two files both encode the ID, that's a genuine collision—a distinct entity is lost—so we emit a warning.
Architecture
Here's the core change. Before, the first-seen node won and we warned immediately. Now, we accumulate losers in a dropped dictionary and check if the incoming node defines the ID. If it does, it replaces the current survivor. After selection completes, we report each collision using the new classification logic. This means the defining node wins regardless of chunk order.
Architecture
The change touches two files. The dedup module gets the helpers, the new reporting function, and the rewritten survivor selection. The test suite adds parametrized tests that verify the defining node wins in both orderings—definition-first and reference-first—plus tests for silent rewiring, absolute versus repo-relative paths, and backward compatibility with bare-stem IDs.
PlainEnglish
After this PR lands, the deduplication pass will prefer nodes that define their ID over nodes that merely reference it. Cross-references folding into the entity they reference will be silent—no warning noise. The change is backward-compatible with pre-issue-fifteen-oh-four bare-stem IDs and handles both absolute and repo-relative paths transparently. All forty existing and new tests pass.
CodeQuality
We examined the regex patterns, path normalization, cross-reference detection logic, state mutation, error paths, duplicate label detection, and test coverage. Everything checks out. The new helpers handle edge cases gracefully, and the parametrized tests verify order-independence.
PlainEnglish
That wraps pull request eighteen fifty-two. This is a focused refactor that makes entity deduplication order-independent by preferring defining nodes and classifying collisions by what's actually lost. The new helpers live at lines one ninety through two twenty-one in dedup dot py, collision reporting classifies at lines two twenty-four through two fifty-seven, and the parametrized tests verify order-independence starting at line four oh nine in the test suite.
How this was made
Lenzon read Graphify-Labs/graphify at pull request #1852 and generated this walkthrough automatically. The narration above is the transcript of what it says.
Explain a pull request from your own repo
Point Lenzon at a repo or a pull request and get a narrated walkthrough like this one.
Try it