Skip to content

How it works

A run processes exactly one watch. It is sequential, has no background work, and either ends with an alert or with a recorded reason why not.

The Watcher processing loop A watch run flows through seven stages: redeliver pending alerts, collect from sources, keep only new content, evaluate with a model, validate the evidence, decide an alert tier and deduplicate, then notify and persist state. Each stage can end the run early with a recorded outcome. 0. Redeliver queued alerts 1. Collect rss · page · search 2. Keep new content hashes 3. Evaluate model + condition 4. Validate quote + link 7. Persist state + history 6. Notify every channel 5. Decide tier + dedup no-candidates nothing-new not-triggered Dashed arrows are early exits: the run stops there and records that outcome. Steps 5 and 6 can also exit as below-threshold, already-notified, semantic-duplicate or notify-failed.
A single watch run. Dashed arrows are early exits.

The diagram in words: a run first replays any alert that failed to send, then collects from every source, discards content it has seen before, asks the model about what is left, checks the answer against the collected text, decides a tier, removes duplicates, delivers, and finally writes down what it learned.

Before collecting anything, the engine checks whether a previous run produced an alert it could not deliver. If so, it replays the stored alert on the watch’s current channels — without re-collecting or re-asking the model.

This runs first on purpose: an unchanged source would otherwise end the run at “nothing new” and the owed alert would never get another chance.

Every source with a collector is asked for candidate items. A source that throws is recorded and skipped; the run continues with the others.

The engine tracks every source that produced a given piece of content, which matters later: if two sources carry identical text, that counts as two corroborating sources, not one.

Exits here: collection-failed if every source threw (the last-run time is deliberately not recorded, so the watch stays due). no-candidates if the sources ran but returned nothing.

Each item is hashed on its URL plus its normalised text and compared against what this watch has already seen. Only genuinely new content survives.

Exits here: nothing-new — the most common outcome on a healthy watch, and the reason a quiet watch costs nothing.

The surviving items, your condition, and a short history of what this watch has already alerted on are sent to the model. It returns a verdict: triggered or not, a confidence, a summary, and the exact quote it relies on.

Large batches are split into chunks so nothing is silently dropped, and each item’s text is windowed around your condition’s keywords rather than simply truncated at the start.

Exits here: not-triggered.

Before the verdict is trusted, it is checked against reality:

  • The quote must appear in the collected text, after normalising entities, smart punctuation and whitespace. A near-verbatim quote is accepted; a paraphrase is not.
  • The link must be one Watcher fetched. A fabricated URL is repaired to the page that actually carries the quote, or dropped.
  • The date must be plausible. Far-future or pre-2000 dates are discarded.

Two things happen here. First, deduplication: an event whose identity matches one already alerted on is dropped. Then the tier: confidence, corroboration, grounding, source trust, second-opinion agreement and failover status together decide strong, weak or none. See Decision rules.

Then a second deduplication pass compares the event’s meaning against recent alerts, catching the same story reworded elsewhere.

Exits here: already-notified, below-threshold, semantic-duplicate.

The alert is delivered on every channel the watch lists that has a notifier wired. Delivery is best-effort per channel: if one channel fails and another succeeds, the run still counts as notified and the failure is recorded.

Exits here: notify-failed — every channel failed. The formatted alert is queued and stage 0 of the next run will replay it.

On a successful alert the engine records: the new content hashes, the event fingerprint, the event’s embedding, and a dated one-line entry in the watch’s ledger (which becomes the “already known” context for the next evaluation).

Whatever the outcome, a run record is written — outcome, source errors, collection counts, the models consulted, and the model’s own reasoning — which is what the panel’s run history shows you.

You see It means
nothing-new most of the time The system is healthy and cheap
not-triggered on new content The model looked and said no
below-threshold Something triggered but did not clear the bar — check the run’s reasoning
notified An alert went out
collection-failed Every source broke — a health alert was sent too

Full table: Run outcomes.