Examples
Fraud Review Loop
What this example shows
Fraud queues move faster than human teams can triage manually. This pattern uses AI scoring for prioritization and keeps final decision authority with a human analyst. Every escalation and disposition remains attributable for audit.
Loop diagram
1IDLE --[ingest_flag]--> FLAGGED --[start_scoring]--> SCORING2SCORING --[submit_score]--> PENDING_REVIEW3PENDING_REVIEW --[dismiss_case]--> DISMISSED (terminal)4PENDING_REVIEW --[analyst_review]--> REVIEWED --[close_case]--> CLOSED (terminal)Actors
| Actor | Type | Role | Guards that apply |
|---|---|---|---|
| transaction ingestor | automation | Flags incoming transactions | none |
| risk scorer | ai-agent | Computes fraud likelihood and patterns | evidence-required, confidence-threshold |
| analyst reviewer | human | Final disposition on escalated cases | human-only |
Key annotated snippet
1import OpenAI from "openai";2import { createOpenAIActorAdapter } from "@loop-engine/adapter-openai";3 4const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });5const scorer = createOpenAIActorAdapter(openai, { modelId: "gpt-4o" });6 7const { actor, decision } = await scorer.createSubmission({8 loopId: "fraud.review",9 loopName: "Fraud Review",10 currentState: "SCORING",11 availableSignals: [{ signalId: "submit_score", name: "Submit Score" }],12 instruction: "Score fraud risk and provide suspicious patterns.",13 evidence: { merchantId: "m-42", ipRisk: "high", velocitySpike: true }14});15 16await engine.transition({17 aggregateId: "txn-884422" as never,18 transitionId: "submit_score" as never,19 actor,20 evidence: {21 ...decision,22 fraud_score: decision.confidence,23 flagged_patterns: ["velocity_spike", "new_device", "geo_mismatch"],24 transaction_context: { amount: 1480, currency: "USD" }25 }26});What emitted events look like
1{2 type: "loop.transition.executed",3 loopId: "fraud.review",4 aggregateId: "txn-884422",5 transitionId: "analyst_review",6 fromState: "PENDING_REVIEW",7 toState: "REVIEWED",8 actor: { type: "human", id: "analyst@bank.com" },9 evidence: { disposition: "confirm_fraud", caseId: "FR-92011" }10}