Correct Identity, Duplicated Shelf
Canonical-URL identity is right. Two rows with the same cleaned URL are the same article, the uniqueness constraint enforces it, and nothing gets stored twice. And a shelf can still show one event seven times.
The measurement: roughly eight percent of a day's rows were repeats of a story already present, with a worst case of one story arriving seven times through seven different wrapper URLs. Every one of those URLs was genuinely distinct. Every row was a real delivery through a real source. Identity was not violated — it simply does not answer the question a reader is asking, which is not "is this the same URL?" but "is this the same news?"
Two Different Relations, One Confusing Word
It helps to name them separately. Identity is exact, cheap, and a property of the record: same canonical URL, same row. Sameness is fuzzy, judgmental, and a property of the world: two records describing one event. Identity belongs at ingest, where it prevents storing the same delivery twice. Sameness belongs at render, where it decides what a person should see.
Collapsing sameness at ingest is the tempting shortcut and it destroys things you cannot get back. Provenance disappears — you can no longer tell which sources carried a story, which is real information about how the day propagated. The decision becomes irreversible. And a fuzzy rule applied destructively will eventually merge two genuinely different articles with similar titles, with nothing left to recover from.
Keep the Most Useful Copy, in the First Copy's Position
When collapsing at render you must decide which copy survives, and the answer is not "the first one." The copies differ in quality: one may already be pre-processed, another may carry a picture, another may point at the publisher directly rather than at a wrapper. Rank them and keep the best.
But keep it where the first one was. Position carries meaning on a time-ordered shelf, and promoting a copy to its own later position would reorder the shelf as a side effect of deduplication — one mechanism quietly doing two jobs, which is how a shelf becomes inexplicable.
Grouping Key: Punctuation-Blind, Not Clever
The key that decides sameness should be the dullest thing that works — a normalized title with punctuation and case flattened. The temptation is similarity scoring, and it is a poor trade here: it introduces a threshold to tune, it can merge unrelated pieces, and it costs real time on every render. A blunt key under-merges, which is the safe direction: a duplicate that slips through is a mildly untidy shelf, while a wrong merge hides an article the reader will never know existed.