Triggers and comparison semantics
A watch selects one JSON value using an RFC 6901 JSON Pointer. Empty string selects the root. /items/0/id selects the first item’s ID. Escape a key’s ~ as ~0 and / as ~1. A missing path is a failed observation. A present null is a valid value.
Change
The first successful observation sets a baseline without an event. A, A, B, B, A produces two watch.changed events: A→B and B→A. JSON is canonicalized using JCS before hashing: object key order is ignored; array order and JSON types matter. The string "1" differs from the number 1. No field exclusion or array record matching is performed.
Condition
Supported operators: eq, neq, gt, gte, lt, lte. Equality compares canonical JSON values; ordering requires numbers. Emit watch.matched only on a successful false→true transition. Repeated true values do not repeatedly emit events. fire_on_initial_match=true also emits if the first observation matches. stop_after_match=true atomically emits and completes the watch. Use both for a job that might already be completed when monitoring starts.
Failed checks and edits
Network, parse and selection failures never overwrite the last successful baseline or condition state. A valid 304 preserves it. Source, credential, selector or trigger edits create a new generation and establish a fresh baseline. Metadata/name/schedule-only API edits retain the baseline. A completed or expired watch requires restart, which clears its baseline. Pause/resume retains it.
Lifecycle and health
Lifecycle: active, paused, completed, expired, quota_paused, disabled, deleted. Health: initializing, healthy, degraded after one failure, failing after three consecutive failures. Recovery emits watch.recovered. Twenty consecutive failures disable the watch; unsafe targets and HTTP 401/403 disable it immediately. Operational events also include watch.failing, watch.disabled, watch.expired and watch.quota_paused. Operational webhook delivery can be switched off; events remain in the inbox.