Tick this before the first scheduled run of a competitor change monitor. Watchlist, polite fetch, text diff, severity rules, one model step, a human review queue, and a kill switch.
Start with three to five rivals and one to three pages each. If you cannot clear the queue in ten minutes a week, the list is too long.
Expect the first two or three runs to be tuning. Noise on day one means fix the selector, not fire the monitor.
flowchart LR
W["Watchlist"] --> F["Fetch"]
F --> D["Diff (code)"]
D --> S["Severity (code)"]
S --> L["LLM describes"]
L --> Q["Review queue"]
Q --> N["Notify"]
Watchlist
Column
Fill in
Drop the row if
url
One exact public page
It is a homepage with no clear purpose
selector
The main content area
You cannot isolate it from menus and banners
watch_for
Price, plans, limits, claims, new offers
Blank
decision_it_informs
The choice this page could change
Nobody can name one
owner
One person who clears alerts
Blank
Watchlist is small enough to review in ten minutes a week
Every URL is public. No logins or paywall workarounds.
Fetch
Schedule set (weekly is a sane default)
User-Agent names us and includes a contact address
robots.txt respected. Site terms read.
One request per page per run, with a pause between hosts
Navigation, footers, banners, timestamps, and rotating blocks stripped before diffing
Cleaned text and fetch date stored for every run
Diff and severity
The diff is computed by code, not by a model
High severity rules written down (prices, free tiers, limits, discontinuations)
Medium rules written down (new offers, plan names, your watch_for terms)
Diffs above a line threshold skip the model and go straight to a human
The one model step
Prompt describes the change only. No advice, no motives, no recommended response.
Output is JSON with summary and substantive. Validated before it enters the queue.
The model has no tools. It cannot send, post, or write.
Page text is treated as untrusted data
The raw diff is always shown next to the summary. If they disagree, the diff wins.