Skip to content

Advisory intelligence contract (pilot)

All Waspada FMS alerts are advisory intelligence. The bank owns any freeze / risk-score decision.

Machine-readable fields (gateway-signed)

FieldPilot valueNotes
dispositionadvisoryactionable requires corroboration_count ≥ CORROBORATION_ACTIONABLE_THRESHOLD (default 3). Unreachable with a single design partner.
client_reported_confidence0–1SDK extraction_confidenceclient-claimed, not gateway-assessed. Signed for integrity only.
mule_keysha256(account|bic)Stable identity for dedupe / future corroboration.
corroboration_count1This submission only (Phase A). Partner-signed counts only — see source tier.
action_requestedMONITORNever ELEVATE_RISK_SCORE while advisory.
urgencyHIGH / CRITICALEnrichment signal (e.g. young domain). Not a freeze instruction.
advisory_noticefixed stringAlso covered by gateway_signature.
source_tierpartner_signed (pilot)First-class trust field — see below.

Do not wire urgency alone to an auto-freeze. Verify gateway_signature over the canonical signed payload (includes disposition / client_reported_confidence / mule_key).

STIX egress stamps the same advisory framing on indicator and threat-actor objects (x_waspada_disposition, real mapped confidence — never a fabricated 95). Auto-actionable STIX indicators are suppressed while disposition is advisory (federation rule).

Analyst dispositions

POST /api/v1/alerts/disposition records { alert_id, mule_key, disposition } as a structured disposition_recorded log event (Phase A). There is no queryable store until Phase B.


Source tier & public-triage quarantine (ADV-005)

Status: Contract locked before public ingest / WhatsApp magic-link surfaces exist.
Pilot today: only the partner_signed path is live. Quarantine table and source_tier enforcement land with public ingest — not after.

Crowd / anonymous reports are a poisoning vector into corroboration and FMS. Most “report a scam” apps let crowd reports drive blocklists directly. Waspada does not: crowd reports are structurally incapable of affecting a bank decision without corroboration or accountable analyst promotion. That is a differentiator — put it in the CISO pack, not only here.

Taxonomy (source_tier)

TierOriginTrust
partner_signedPartner RS256 JWT ingestMay increment corroboration, may reach FMS (advisory), may federate via STIX under advisory rules.
public_triageAnonymous sandbox / WhatsApp magic-link funnelQuarantine tier. Never bank-affecting on its own.
analyst_promotedA public_triage indicator an analyst explicitly reviewedAnalyst is the accountable party; only then may the indicator count / federate as if partner-grade (still advisory until corroboration threshold).

mule_key remains the join key across tiers. Promotion happens only via (a) analyst action that sets analyst_promoted, or (b) an independent partner_signed event for the same mule_key.

Hard “never”s — public_triage (named checkpoints)

InvariantEnforcement point
Never increments corroboration.report_countCorroboration UPSERT in persistAlert / alerts-repo — skip when source_tier = public_triage.
Never creates a delivery_outbox row / reaches a bank FMSenqueueDelivery — refuse / no-op for public_triage.
Never counts toward the corroboration_count that gates advisory → actionableresolveAdvisoryContract — only partner_signed (+ post-promotion analyst_promoted) reports contribute.
Never emits an auto-actionable STIX indicator SDOSTIX formatter — suppress actionable indicators while disposition is advisory; public_triage never raises disposition.
Never is written to alertsPublic ingest routes to triage_quarantine, not alerts.

What public_triage may do

  • Extract and show indicators to the submitting user on-device (sandbox).
  • Persist to a separate triage_quarantine table (encrypted envelopes / tenancy pattern aligned with B0 where applicable).
  • Surface on an analyst queue for review.
  • Join later to a partner_signed event on the same mule_key (partner event remains the bank-facing authority).

Quarantine store governance (PDPA)

Anonymous-sourced account numbers are still pseudonymous personal data. triage_quarantine is its own governed surface — not an ungoverned side pool.

ControlRule
Retention30 days default (retention_expires_at) — shorter than the 90-day partner alerts default.
ErasureCrypto-shred / delete row + purge mule_key from quarantine indexes; same backup-bound discipline as partner stores.
DPIAOwn line in DPIA — purpose, legal basis, retention, poisoning residual risk.
RunbookRow in Retention & erasure.

STIX federation

Automated STIX federation suppresses auto-actionable indicator SDOs while disposition is advisory. public_triage origin never produces actionable disposition. Federation of quarantined indicators (if any) must carry x_waspada_source_tier: public_triage and remain non-actionable until promotion + contract rules allow.

Implementation gate

Do not ship WhatsApp magic-link mint, anonymous sandbox→gateway ingest, or a triage_quarantine writer until:

  1. source_tier is present on the ingest/alert path and checked at the four checkpoints above, and
  2. Mint endpoints (if any) are authenticated + rate-limited (never an open link-minting oracle).

Until then, public sandbox stays client-local (draft police report on-device; no anonymous gateway write into alerts / corroboration / outbox).

Waspada AI: Enterprise infrastructure powering public defense.