Explainable trace for a single (watch, trademark) pair — why an alert did or didn’t fire
Documentation Index
Fetch the complete documentation index at: https://docs.signa.so/llms.txt
Use this file to discover all available pages before exploring further.
portfolios:manage.
wat_*).tm_*) to evaluate against this watch. Cross-org IDs return
404 (info-disclosure prevention).wat_*).tm_*).uspto, euipo).true if the watch evaluator processed this trademark in the current
retention window. false either because the trademark wasn’t in candidacy,
or because the relevant provenance has aged out of the retention window
(see data_window below). When false, reason explains why.true if this watch’s filters include this trademark’s office. Watch +
office routing happens via watch_office_checkpoints; if the checkpoint
is missing or superseded_at is set, this is false.true if a trademark_changes row exists for this trademark within the
retention window. Candidacy is a prerequisite for evaluation; if no change
was recorded the evaluator never saw the mark.trademark.created,
trademark.updated, trademark.status_changed, etc.). When an alert was
fired this is the frozen value from watch_alerts.event_type; otherwise
it’s derived from the most recent trademark_changes row.true if trigger_event_type is allowed by the watch’s
query.trigger_events filter. When false, the evaluator silently dropped
the candidate — that’s the answer to “why no alert”.null — the evaluator does not persist the per-trademark
score on the alert row. Documented gap; will populate on a future schema bump.query.score_threshold (0..1) for similarity
watches. null for non-similarity watches.true if a watch_alerts row exists for this (watch, trademark) pair.
When true, outbox_event_id is the cross-system trace handle."alert fired" — an alert row exists."watch does not include office {code}" — checkpoint missing/superseded."trademark evaluated more than {N} days ago; provenance no longer available" — past the diagnostic freshness horizon."trademark not in candidacy window for sync_run {id}" — no recent
trademark_changes row."trigger event {type} not in watch.trigger_events" — change exists
but the event type is filtered out."score {n} below threshold {t}" — similarity match below threshold
(only fires when both are populated)."would alert but rolled into digest" — the watch’s effective
delivery mode resolved to digest; alert is queued for the digest job."no matching reason available" — fallback; surface to support if
you see it.digest_above_threshold this depends on the trailing 24h alert volume,
so the value is “current effective” not “effective at evaluation time” —
documented in the API contract.held is unambiguous (active lease started < 15min ago);
epoch_raced indicates the evaluator’s evaluation_epoch_seen lags
behind the watch’s current epoch (replay race); released is the
default post-iteration state. abandoned / cas_lost are heuristic
hints, not guarantees.evaluation_epoch. Bumped by POST /v1/watches/{id}/replay.evaluation_epoch. null when the watch was never replayed (epoch=0)
or no alert exists.sync_runs row referenced by the watch+office checkpoint’s
last_evaluated_sync_run_id.event_outbox UUID emitted alongside the alert. Cross-references the
webhook-id on delivery audit rows under
GET /v1/webhooks//deliveries.
null when no alert fired.null when the
trademark has no publication_date_first or no rule applies for the
jurisdiction/route.reason will
surface “provenance no longer available”.trademark_id query parameter missing.portfolios:manage.trademark_changes are retained for 90 days; webhook_deliveries for 30
days. Diagnostics queries past the 90-day horizon return evaluated=false
with reason explaining the freshness limit.
Authorization: Bearer $SIGNA_API_KEY. Org-scoped:
the watch must belong to the calling org.
outbox_event_id from this response with the delivery audit log
to confirm webhook receipt.