I wanted a news collector to explain and correct its own decisions. That meant it needed to know whether an item had appeared before. Counting the entries in the kept feed suggested 600 appearances. Normalizing their URLs and using the result as an identity reduced them to 194 distinct items. The other 406 were repeat appearances in that record, not 406 new things to read.
Identity before judgement
Two links can point to the same item while differing in their URL spelling. I standardized the scheme and the optional www prefix, then derived a stable identifier from the normalized URL. The backfill found no identifier collisions. That did not prove that two differently linked articles about the same event were one story; it solved the narrower problem of recognizing a repeated URL.
With that identity in place, the collector could record a verdict and a later correction against the same item. I re-ran nine days of decisions with the initial scoring rules and checked the number of kept items for every day. All nine daily totals matched the previous binary gate. That mattered because a new explanation layer should not silently change what gets published before anyone has chosen a new rule.
Keep what the decision left out
A correction system cannot learn from excluded material it has thrown away. I kept the raw collected layer and an excluded-items view alongside the published feed. In a forced failure test with the rules file removed, raw capture failed while the existing publication path still completed. The two paths had separate responsibilities, and the test showed where the boundary was.
The lesson was not that a hash makes a feed intelligent. It makes a specific question answerable: have I seen this link before? Keeping the raw input then makes a second question possible later: was the decision to include or exclude it justified?