Deduplication
A single announcement can appear on an official page, in three news write-ups and in a search result — and the same page can be re-fetched every hour for a week. Watcher is built so that all of that produces one alert.
Three mechanisms do the work, at three different stages.
1. Content memory — “have I read this already?”
Section titled “1. Content memory — “have I read this already?””Before anything is sent to a model, every collected item is hashed on its URL plus its normalised text. Items whose hash the watch has already seen are dropped.
That means:
- an unchanged page costs nothing after the first run,
- a page that genuinely changed produces a new item,
- and trivial churn — a re-encoded character, reflowed whitespace, curly quotes swapped for straight ones — does not count as a change.
If nothing survives this stage the run ends with nothing-new, which is the most
common outcome on a healthy system.
2. Event identity — “have I told you about this already?”
Section titled “2. Event identity — “have I told you about this already?””When a verdict does trigger, Watcher computes a stable fingerprint for the event, from the evidence URL plus the normalised quote and date — not from the model’s free-text summary.
This distinction matters in both directions:
- The same event summarised differently on two runs keeps the same fingerprint, so it is not alerted twice.
- Two different announcements posted at the same URL — a notice board that gets a new row — get different fingerprints, so both fire.
A fingerprint you have already been alerted about produces the
already-notified outcome.
3. Semantic similarity — “is this the same story, reworded?”
Section titled “3. Semantic similarity — “is this the same story, reworded?””Exact fingerprints cannot catch five different sites describing one event in five
different sentences. So before delivering, Watcher embeds a canonical description
of the event and compares it against recent alerts for the same watch. If the
similarity is at or above 0.92, the alert is suppressed as a
semantic-duplicate.
Watcher keeps the last 50 notified-event vectors per watch for this comparison.
What this means in practice
Section titled “What this means in practice”| You observe | Why |
|---|---|
| First run alerts, later runs are quiet | Content memory: nothing is new |
| A notice board fires twice in a day | Two distinct events at one URL — correct behaviour |
| Five sites covered one story, you got one alert | Semantic deduplication |
| You edited the condition and nothing happened | Seen content is not re-read |
| An alert repeated once after an outage | A rare duplicate when embedding was unavailable |
Going deeper
Section titled “Going deeper”- Run outcomes —
nothing-new,already-notified,semantic-duplicatein context. - Duplicate or noisy alerts — what to change.