What was found
While verifying #64 (conflict resolution policy) live, NikhilNamal17_popular-movie-quotes.json was found to contain 9 pairs of rows that collide to the same quote id, detected via the new System_ImportConflicts logging (a duplicate whose firstSeenInFile and conflictFile were both NikhilNamal17_popular-movie-quotes.json — i.e. an internal duplicate within the same bundled file, not a cross-file one).
Root cause: QuoteIdentity.StableId(quote, source) (src/Quotinator.Core/Import/QuoteIdentity.cs) derives the id from SHA-256(normalize(quote) + "|" + normalize(source)) only — deliberately excluding date/year, and case-insensitive via Normalise. This is correct, frozen, documented behaviour (ported from the historical scripts/seed.csx) — not a bug. The 9 collisions happen because the raw upstream NikhilNamal17/popular-movie-quotes dataset itself has the same quote attributed to the same movie twice, with only the year differing (or, in one case, only the movie title's letter case differing):
| Quote (truncated) |
Source |
Date A |
Date B |
| "Life is a banquet, and most poor suckers are starving to death!" |
Auntie Mame |
1958 |
2005 |
| "Even the smallest person can change the course of the future." |
The Lord of the Rings: The Fellowship of the Ring |
2001 |
2002 |
| "Spider-Pig, Spider-Pig...” |
The Simpsons movie / The Simpsons Movie (case differs) |
2007 |
2019 |
| "It's not about what I want. It's about what's fair!" |
The Dark Knight |
2008 |
2008 (identical row) |
| "Some men just want to watch the world burn." |
The Dark Knight |
2008 |
2008 (identical row) |
| "Following's not really my style." |
Marvel's The Avengers |
2012 |
2019 |
| "I have nothing to prove to you" |
Captain Marvel |
2013 |
2019 |
| "Life's a little bit messy..." |
Zootopia |
2016 |
2016 (identical row) |
| "If you want to get crazy. We can get crazy." |
Us |
2019 |
2019 (identical row) |
Since these collide to the same id, the seeder's first-occurrence-wins (or configured conflict policy) behaviour silently keeps only one of the two — this has always happened silently; #64's new conflict logging is what made it visible for the first time.
Why Data Enrichment
This is upstream data quality in a bundled source, not a code bug — it belongs with other data-quality/enrichment work rather than the Data Import & Sources pipeline milestone.
Possible directions (not decided here)
- Leave as-is — the collision resolves deterministically and doesn't corrupt data, just silently drops one of two near-duplicate rows.
- Manually review the 9 pairs and decide which year is correct, updating the raw upstream reference or a local override.
- If this pattern recurs across future upstream refreshes, consider whether the identity scheme should ever be revisited — though
QuoteIdentity.StableId is documented as frozen and must not change casually, since altering it would silently duplicate or orphan existing database rows on next refresh.
No action taken in this issue yet — filed for tracking and future decision.
What was found
While verifying #64 (conflict resolution policy) live,
NikhilNamal17_popular-movie-quotes.jsonwas found to contain 9 pairs of rows that collide to the same quoteid, detected via the newSystem_ImportConflictslogging (a duplicate whosefirstSeenInFileandconflictFilewere bothNikhilNamal17_popular-movie-quotes.json— i.e. an internal duplicate within the same bundled file, not a cross-file one).Root cause:
QuoteIdentity.StableId(quote, source)(src/Quotinator.Core/Import/QuoteIdentity.cs) derives the id fromSHA-256(normalize(quote) + "|" + normalize(source))only — deliberately excludingdate/year, and case-insensitive viaNormalise. This is correct, frozen, documented behaviour (ported from the historicalscripts/seed.csx) — not a bug. The 9 collisions happen because the raw upstream NikhilNamal17/popular-movie-quotes dataset itself has the same quote attributed to the same movie twice, with only the year differing (or, in one case, only the movie title's letter case differing):Since these collide to the same
id, the seeder's first-occurrence-wins (or configured conflict policy) behaviour silently keeps only one of the two — this has always happened silently; #64's new conflict logging is what made it visible for the first time.Why Data Enrichment
This is upstream data quality in a bundled source, not a code bug — it belongs with other data-quality/enrichment work rather than the Data Import & Sources pipeline milestone.
Possible directions (not decided here)
QuoteIdentity.StableIdis documented as frozen and must not change casually, since altering it would silently duplicate or orphan existing database rows on next refresh.No action taken in this issue yet — filed for tracking and future decision.