Monitors cannabis industry activity: licenses, regulatory filings, compliance events, and entity relationships.
The WatchedItem is the single monitored entity (#191): one row = one URL = one
fingerprint = one change signal. It owns its effective_url, source_specs, schedule
(default_schedule_config + an optional 1:1 TemporalProfile), domain_name /
domain_suspended, health/timestamps, and its notification surface. A periodic
schedule_tick enqueues check_watched_item for each due item; the pipeline extracts,
fingerprints, writes a ChangeRevision, and dispatches CHANGE_DETECTED once per item.
Canonical content provenance (InfoItem / InfoSource / SourceRevision) lives in the sibling
Archiver service (separate repo, port 8020), consumed over the bus via info.registry
announcements — Watcher holds no Archiver SDK and makes no HTTP calls to it (#254).
archiver_info_item_id and archiver_info_source_id on a WatchedItem are required
cross-schema references (#251) — every WatchedItem is an InfoItem being watched, and
Archiver provisions it. Every detected change is reported to Archiver as a
source_revision_observed fact on the content.revisions bus stream (#253), with a local
pending_archiver_sync outbox + drain worker guaranteeing delivery across broker
outages. Notifications dispatch through the sibling Notifier service via the
NotifierClient SDK.
Operate WatchedItems at /api/v1/watched-items (API) and /watched-items (dashboard).
Full conventions: AGENTS.md. Operator install: docs/DEPLOYMENT.md;
env files and every variable: docs/ENVIRONMENT.md.
Fetch/revision path and the Archiver linkage: docs/CONTENT-PIPELINE.md.
The WatchedItem entity in full: docs/WATCHED-ITEMS.md; the API
and dashboard surfaces that operate it: docs/WATCHED-ITEMS-DASHBOARD.md. Module
layout and bus topology: docs/ARCHITECTURE.md.
Collapse design: docs/plans/2026-06-16-collapse-watcheditem-watch-design.md.
git submodule update --init --recursive
uv sync# Dev server on port 8001 against a non-production database (#233).
# Port 8000 belongs to the systemd service — never bind it by hand.
bash scripts/dev_server.shuv run pytestSee docs/COMMANDS.md for full command reference.