<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nirmal Joseph Ukken</title>
    <description>The latest articles on DEV Community by Nirmal Joseph Ukken (@nekku).</description>
    <link>https://dev.to/nekku</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4140381%2Fb95878a6-b12d-4b7d-b11f-13eabff5e543.png</url>
      <title>DEV Community: Nirmal Joseph Ukken</title>
      <link>https://dev.to/nekku</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nekku"/>
    <language>en</language>
    <item>
      <title>The Agent That Knows When to Stop: Agentic Fraud Investigation on TigerGraph</title>
      <dc:creator>Nirmal Joseph Ukken</dc:creator>
      <pubDate>Thu, 24 Sep 2026 09:22:08 +0000</pubDate>
      <link>https://dev.to/nekku/the-agent-that-knows-when-to-stop-agentic-fraud-investigation-on-tigergraph-5d18</link>
      <guid>https://dev.to/nekku/the-agent-that-knows-when-to-stop-agentic-fraud-investigation-on-tigergraph-5d18</guid>
      <description>&lt;p&gt;&lt;em&gt;Task #4 · TigerGraph problem statement · Hacker House Goa 2026&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A risk score pings. Is it fraud, a holiday, or a new phone?&lt;/p&gt;

&lt;p&gt;We built &lt;strong&gt;SentinelGraph&lt;/strong&gt;, an AI agent that works the alert like a sharp analyst: it digs through the graph, admits what it doesn't know, asks for the one piece of evidence that would settle it, and recommends the next move with the right person signing off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;590,742&lt;/strong&gt; transactions in the graph · &lt;strong&gt;5,565&lt;/strong&gt; closed cases as memory · &lt;strong&gt;16&lt;/strong&gt; GSQL queries via MCP · &lt;strong&gt;0.914&lt;/strong&gt; memory-model AUC (bank score: 0.866) · &lt;strong&gt;28&lt;/strong&gt; cards in the biggest ring we found&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Code:&lt;/strong&gt; &lt;a href="https://github.com/nirmaljosephukken/HH_GOA_Task_4" rel="noopener noreferrer"&gt;https://github.com/nirmaljosephukken/HH_GOA_Task_4&lt;/a&gt; &lt;/p&gt;




&lt;h2&gt;
  
  
  1. What we built
&lt;/h2&gt;

&lt;p&gt;Fraud teams are never short of alerts. They're short of time to turn each one into a call they can defend. For every ping an analyst pulls the card history, checks the device, hunts for other victims, rereads the policy, decides whether to phone the customer, and writes it all up. Usually after the money has moved.&lt;/p&gt;

&lt;p&gt;SentinelGraph runs that loop end to end:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Triggers:&lt;/strong&gt; a bank risk score, a customer report, or an analyst request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Investigates&lt;/strong&gt; the card, the latent cardholder, devices, emails, regions and &lt;em&gt;other cards&lt;/em&gt; through TigerGraph.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remembers&lt;/strong&gt; 5,565 closed investigations and every case it opened before.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measures its own uncertainty&lt;/strong&gt; and stops only when two independent lines of evidence agree.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Asks for more evidence&lt;/strong&gt; through policy-approved actions (customer validation, step-up authentication, analyst review) when it isn't sure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recommends the next best action&lt;/strong&gt; with its approval route (auto / L1 team lead / L2 fraud manager), drafts a SAR when policy requires one, and writes the whole case back into the graph.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SentinelGraph console&lt;/strong&gt; (Streamlit) shows the alert, the live investigation, what it found, how certain it is, what happens next, the evidence graph, and why it stopped.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We ran it on the 20 benchmark alerts: &lt;strong&gt;10 legitimate, 9 fraud, 1 uncertain, 6 SARs&lt;/strong&gt;. Re-running all 20 gives the same decisions every time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reading the room first
&lt;/h3&gt;

&lt;p&gt;The dataset is the IEEE-CIS card data with the fraud label taken away. In its place: a bank risk score, 5,565 closed investigations (July to October), a fraud policy, five documented patterns, and 20 alerts from November and December. Three findings shaped everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A "customer" isn't a person.&lt;/strong&gt; Customer IDs come from an issuer code, so one card can hold 2,788 transactions across dozens of billing regions. We added a &lt;code&gt;Client&lt;/code&gt; vertex: a latent cardholder built from card + billing region + account-open day. In closed cases, 85% of a fraud client's transactions are fraud.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The bank's memory is lopsided, and that's useful.&lt;/strong&gt; All 4,665 confirmed frauds began with a cardholder report. All 900 cleared cases began with a model score the cardholder explained (travel 716, new phone 158, intended purchase 26). &lt;em&gt;A risk score is a reason to look. Never a verdict.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Card IDs come back exactly.&lt;/strong&gt; Ranking each customer's &lt;code&gt;card6&lt;/code&gt; values reproduces every card ID in the closed cases and the case pack.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. The architecture
&lt;/h2&gt;

&lt;p&gt;Every layer has one job. Graph queries find facts. A deterministic evidence layer weighs them. A policy engine picks the actions. The LLM probes open questions and writes the story, and it never sets a probability or an action.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Trigger (score / customer / analyst)
   │
   ▼
Case orchestrator ── state machine + audit trail ──────────────┐
   │  MCP: tigergraph__run_installed_query   GraphRAG: vectorSearch
   ▼                                                            │
TigerGraph Savanna (FraudGraph)                                 │
   │                                                            │
   ▼                                                            │
Evidence layer ── detectors → likelihood ratios by family       │
   ▼                                                            │
Uncertainty engine ── log-odds fusion, confidence, open questions
   ▼                                                            │
Policy engine ── R1–R10, case vs report, stop rule, routes, guardrails
   │                       │                                    │
   ▼                       ▼                                    │
ask for evidence     next best action (auto runs, L1/L2 wait)   │
(verify / step-up)         │                                    │
   └──► re-assess          ▼                                    │
                     FraudCase + CaseEvents written back ◄──────┘

LLM (Gemini): bounded extra tool calls + narrative/SAR writer, output validated
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One alert, six moves:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open the case&lt;/strong&gt; with an audit trail.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dig the graph:&lt;/strong&gt; 16 installed GSQL queries through the TigerGraph MCP server, about 0.1 s each.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remember:&lt;/strong&gt; GraphRAG vector search over closed cases, earlier agent cases and policy clauses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weigh it:&lt;/strong&gt; each finding gets a likelihood ratio and an evidence family (ml, trigger, sequence, network, device, behaviour, history, customer). Within a family only the strongest counts, so correlated signals can't pile up. Families multiply in log-odds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stop or ask:&lt;/strong&gt; two independent families agree past 85% or 15%? Stop. Otherwise request the evidence that would settle it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Act and write back:&lt;/strong&gt; auto actions execute, L1/L2 actions wait for a human, the case goes back into the graph as memory.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  3. How TigerGraph is used
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;One graph, three layers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Evidence graph:&lt;/strong&gt; &lt;code&gt;Customer–Card–Client–Txn&lt;/code&gt;, with &lt;code&gt;Txn&lt;/code&gt; linked to &lt;code&gt;DeviceProfile&lt;/code&gt;, &lt;code&gt;EmailDomain&lt;/code&gt; (purchaser and recipient) and &lt;code&gt;BillingRegion&lt;/code&gt;, plus a &lt;code&gt;NEXT_TXN&lt;/code&gt; chain per card.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Case memory:&lt;/strong&gt; 5,565 &lt;code&gt;ClosedCase&lt;/code&gt; vertices linked to their transactions, cards, connected cards and pattern. Every &lt;code&gt;FraudCase&lt;/code&gt; the agent opens is stored too, with edges to the transactions, cards, devices and closed cases it used, and a &lt;code&gt;CaseEvent&lt;/code&gt; chain as its audit trail.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge:&lt;/strong&gt; &lt;code&gt;PolicyChunk&lt;/code&gt; vertices, one per policy rule, plus fraud typologies, a FinCEN/FATF/FFIEC digest and lessons mined from closed cases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;ClosedCase&lt;/code&gt;, &lt;code&gt;FraudCase&lt;/code&gt; and &lt;code&gt;PolicyChunk&lt;/code&gt; carry TigerGraph's &lt;strong&gt;native 256-dimension vector attribute&lt;/strong&gt;, so memory lookups are a &lt;code&gt;vectorSearch()&lt;/code&gt; inside an installed query, right next to the graph hops.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sixteen installed GSQL queries&lt;/strong&gt;, each exposed to the agent as a tool. Highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;peer_txns&lt;/code&gt;: two hops, flagged transaction → its device or email → purchases on &lt;em&gt;other&lt;/em&gt; cards at a similar amount within 48 hours. This is the "what happened on other cards?" question.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;card_profile&lt;/code&gt;: a behavioural baseline in one pass with &lt;code&gt;MapAccum&lt;/code&gt;s over products, regions, devices and emails.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ring_components&lt;/code&gt;: &lt;strong&gt;weakly connected components&lt;/strong&gt; (min-label propagation adapted from &lt;code&gt;tg_wcc&lt;/code&gt;) over the client↔device co-usage graph. It isolates the 28-card ring as one component.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;device_ring_scan&lt;/code&gt; and &lt;code&gt;amount_band_scan&lt;/code&gt;: sweep the whole exam period, so the agent raises alerts nobody reported (&lt;code&gt;monitor.py&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;prior_cases&lt;/code&gt; and &lt;code&gt;device_cases&lt;/code&gt;: memory by adjacency. Which closed cases touched this device?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;TigerGraph MCP.&lt;/strong&gt; The agent launches the official &lt;a href="https://github.com/tigergraph/tigergraph-mcp" rel="noopener noreferrer"&gt;&lt;code&gt;tigergraph-mcp&lt;/code&gt;&lt;/a&gt; server over stdio, discovers its tools, and calls &lt;code&gt;tigergraph__run_installed_query&lt;/code&gt; for every read, vector searches included. Argument names come from the tool schema at runtime. If MCP is unavailable it falls back to RESTPP, and every call in the trace records which transport served it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Loading.&lt;/strong&gt; Streamed parallel RESTPP upserts loaded 590k transactions and about 3M edges into Savanna in under two minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The agentic capabilities
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Explicit uncertainty.&lt;/strong&gt; Every detector returns a claim, the query it came from, the entity IDs it rests on, a likelihood ratio and a family. The case records the prior, the posterior, each family's contribution, which families argue each way, and the open questions ("device ownership not established", "evidence conflicts").&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A calibrated prior learned from case memory.&lt;/strong&gt; The closed cases cover about 3.4% of July to October transactions, close to the true fraud rate, so we trained a gradient-boosted model on them. Trained on July to September and tested on October: &lt;strong&gt;AUC 0.914 vs 0.866 for the bank's score, with nearly double the average precision.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Knowing when to stop.&lt;/strong&gt; Policy section 6, as code: stop at ≥ 0.85 or ≤ 0.15 with two independent families agreeing. Otherwise the agent picks the evidence request that best resolves the case: step-up authentication for an online score alert, customer verification for a dispute, R7 verification for a disputed charge that matches the customer's own recurring pattern. Replies aren't provided in this round, so a simulator assumes the reply the evidence supports, records the assumption and its basis, and the agent re-assesses. The next best action is recorded &lt;strong&gt;before&lt;/strong&gt; and &lt;strong&gt;after&lt;/strong&gt; the evidence, with what changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Policy as code, with permissions.&lt;/strong&gt; R1–R10, the case-vs-report rule, exposure-based routing, action ordering, and a guard that refuses breaches (blocking on a single weak signal, &lt;code&gt;BLOCK_ALL_CARDS&lt;/code&gt; without two compromised cards, blocking a recurring dispute). Only &lt;code&gt;auto&lt;/code&gt; actions execute. L1 and L2 actions wait in the console's approval queue, and every approval is written to the case's audit trail in TigerGraph.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory that changes the answer.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HHG-014:&lt;/strong&gt; &lt;code&gt;device_cases&lt;/code&gt; returns closed cases analysts labelled &lt;em&gt;undocumented&lt;/em&gt;, so the agent labels the new ring undocumented too and escalates under R9.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HHG-006:&lt;/strong&gt; vector retrieval surfaces five undocumented September structuring cases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Legitimate alerts:&lt;/strong&gt; cleared cases on the same card ("confirmed travel") are cited as precedent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The LLM where language is the product.&lt;/strong&gt; Gemini gets a bounded budget of extra tool calls to probe open questions, then writes the summary, pattern description and SAR narrative. Any text that cites an ID not present in the evidence is rejected. Its notes carry zero weight in the probability, which is why decisions are reproducible.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the graph caught
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HHG-006 · Threshold structuring.&lt;/strong&gt; Four online purchases in 30 minutes, each just under $500 ($1,906.07 total). Same trick on 11 other cards; matches five undocumented September cases. SAR, R9 escalation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HHG-014 · A 28-card device ring.&lt;/strong&gt; One Samsung profile behind an anonymous proxy, marked &lt;em&gt;New&lt;/em&gt; on every account. The November wave of the August ring.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HHG-019, HHG-011, HHG-016 · Rings you can't see from one card.&lt;/strong&gt; Each purchase looks ordinary on its own card. On the graph, the same rare device made near-identical purchases on 3–5 other cards within days. R6: report and monitor connected cards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HHG-018 · Disputed, but it recurs.&lt;/strong&gt; A $39.08 charge recurring at the same amount, region and product since August. R7: verify and remind, no block.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HHG-003 · Honest about doubt.&lt;/strong&gt; A denied $49 purchase in a region the card uses all the time. The card is blocked (R2), but the outcome stays &lt;em&gt;uncertain&lt;/em&gt; and goes to an analyst (R8).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Scoreboard: all 20 alerts
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Case&lt;/th&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;th&gt;P(fraud)&lt;/th&gt;
&lt;th&gt;Pattern&lt;/th&gt;
&lt;th&gt;Exposure&lt;/th&gt;
&lt;th&gt;Linked cards&lt;/th&gt;
&lt;th&gt;SAR&lt;/th&gt;
&lt;th&gt;Evidence asked&lt;/th&gt;
&lt;th&gt;Final next best action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HHG-001&lt;/td&gt;
&lt;td&gt;legitimate&lt;/td&gt;
&lt;td&gt;0.01&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ALLOW_TRANSACTION&lt;/code&gt; → &lt;code&gt;GENERATE_REPORT&lt;/code&gt; → &lt;code&gt;CLOSE_NO_FRAUD&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HHG-002&lt;/td&gt;
&lt;td&gt;legitimate&lt;/td&gt;
&lt;td&gt;0.01&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;step up auth&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ALLOW_TRANSACTION&lt;/code&gt; → &lt;code&gt;CREATE_CASE&lt;/code&gt; → &lt;code&gt;CLOSE_NO_FRAUD&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HHG-003&lt;/td&gt;
&lt;td&gt;uncertain&lt;/td&gt;
&lt;td&gt;0.63&lt;/td&gt;
&lt;td&gt;out of region use&lt;/td&gt;
&lt;td&gt;$49.00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;customer validation&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;BLOCK_CARD&lt;/code&gt; → &lt;code&gt;CREATE_CASE&lt;/code&gt; → &lt;code&gt;ESCALATE_TO_ANALYST&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HHG-004&lt;/td&gt;
&lt;td&gt;fraud&lt;/td&gt;
&lt;td&gt;0.73&lt;/td&gt;
&lt;td&gt;card not present new device&lt;/td&gt;
&lt;td&gt;$128.33&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;customer validation&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;BLOCK_CARD&lt;/code&gt; → &lt;code&gt;CREATE_CASE&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HHG-005&lt;/td&gt;
&lt;td&gt;legitimate&lt;/td&gt;
&lt;td&gt;0.01&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;step up auth&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ALLOW_TRANSACTION&lt;/code&gt; → &lt;code&gt;CREATE_CASE&lt;/code&gt; → &lt;code&gt;CLOSE_NO_FRAUD&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HHG-006&lt;/td&gt;
&lt;td&gt;fraud&lt;/td&gt;
&lt;td&gt;0.99&lt;/td&gt;
&lt;td&gt;undocumented&lt;/td&gt;
&lt;td&gt;$1,906.07&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;BLOCK_CARD&lt;/code&gt; → &lt;code&gt;CREATE_CASE&lt;/code&gt; → &lt;code&gt;FILE_REPORT&lt;/code&gt; → &lt;code&gt;MONITOR_CONNECTED_CARDS&lt;/code&gt; → &lt;code&gt;ESCALATE_TO_ANALYST&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HHG-007&lt;/td&gt;
&lt;td&gt;legitimate&lt;/td&gt;
&lt;td&gt;0.01&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ALLOW_TRANSACTION&lt;/code&gt; → &lt;code&gt;GENERATE_REPORT&lt;/code&gt; → &lt;code&gt;CLOSE_NO_FRAUD&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HHG-008&lt;/td&gt;
&lt;td&gt;fraud&lt;/td&gt;
&lt;td&gt;0.99&lt;/td&gt;
&lt;td&gt;card not present fraud&lt;/td&gt;
&lt;td&gt;$166.97&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;BLOCK_CARD&lt;/code&gt; → &lt;code&gt;CREATE_CASE&lt;/code&gt; → &lt;code&gt;FILE_REPORT&lt;/code&gt; → &lt;code&gt;MONITOR_CONNECTED_CARDS&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HHG-009&lt;/td&gt;
&lt;td&gt;fraud&lt;/td&gt;
&lt;td&gt;0.98&lt;/td&gt;
&lt;td&gt;card not present fraud&lt;/td&gt;
&lt;td&gt;$30.02&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;BLOCK_CARD&lt;/code&gt; → &lt;code&gt;CREATE_CASE&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HHG-010&lt;/td&gt;
&lt;td&gt;legitimate&lt;/td&gt;
&lt;td&gt;0.01&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;step up auth&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ALLOW_TRANSACTION&lt;/code&gt; → &lt;code&gt;CREATE_CASE&lt;/code&gt; → &lt;code&gt;CLOSE_NO_FRAUD&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HHG-011&lt;/td&gt;
&lt;td&gt;fraud&lt;/td&gt;
&lt;td&gt;0.95&lt;/td&gt;
&lt;td&gt;card not present new device&lt;/td&gt;
&lt;td&gt;$131.30&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;BLOCK_CARD&lt;/code&gt; → &lt;code&gt;CREATE_CASE&lt;/code&gt; → &lt;code&gt;FILE_REPORT&lt;/code&gt; → &lt;code&gt;MONITOR_CONNECTED_CARDS&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HHG-012&lt;/td&gt;
&lt;td&gt;legitimate&lt;/td&gt;
&lt;td&gt;0.01&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ALLOW_TRANSACTION&lt;/code&gt; → &lt;code&gt;GENERATE_REPORT&lt;/code&gt; → &lt;code&gt;CLOSE_NO_FRAUD&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HHG-013&lt;/td&gt;
&lt;td&gt;legitimate&lt;/td&gt;
&lt;td&gt;0.01&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;step up auth&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ALLOW_TRANSACTION&lt;/code&gt; → &lt;code&gt;CREATE_CASE&lt;/code&gt; → &lt;code&gt;CLOSE_NO_FRAUD&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HHG-014&lt;/td&gt;
&lt;td&gt;fraud&lt;/td&gt;
&lt;td&gt;0.89&lt;/td&gt;
&lt;td&gt;undocumented&lt;/td&gt;
&lt;td&gt;$439.61&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;BLOCK_CARD&lt;/code&gt; → &lt;code&gt;CREATE_CASE&lt;/code&gt; → &lt;code&gt;FILE_REPORT&lt;/code&gt; → &lt;code&gt;MONITOR_CONNECTED_CARDS&lt;/code&gt; → &lt;code&gt;ESCALATE_TO_ANALYST&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HHG-015&lt;/td&gt;
&lt;td&gt;legitimate&lt;/td&gt;
&lt;td&gt;0.01&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;step up auth&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ALLOW_TRANSACTION&lt;/code&gt; → &lt;code&gt;CREATE_CASE&lt;/code&gt; → &lt;code&gt;CLOSE_NO_FRAUD&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HHG-016&lt;/td&gt;
&lt;td&gt;fraud&lt;/td&gt;
&lt;td&gt;0.99&lt;/td&gt;
&lt;td&gt;card not present new device&lt;/td&gt;
&lt;td&gt;$59.67&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;BLOCK_CARD&lt;/code&gt; → &lt;code&gt;CREATE_CASE&lt;/code&gt; → &lt;code&gt;FILE_REPORT&lt;/code&gt; → &lt;code&gt;MONITOR_CONNECTED_CARDS&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HHG-017&lt;/td&gt;
&lt;td&gt;legitimate&lt;/td&gt;
&lt;td&gt;0.03&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ALLOW_TRANSACTION&lt;/code&gt; → &lt;code&gt;GENERATE_REPORT&lt;/code&gt; → &lt;code&gt;CLOSE_NO_FRAUD&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HHG-018&lt;/td&gt;
&lt;td&gt;legitimate&lt;/td&gt;
&lt;td&gt;0.02&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;customer validation&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;CREATE_CASE&lt;/code&gt; → &lt;code&gt;WARN_CUSTOMER&lt;/code&gt; → &lt;code&gt;CLOSE_NO_FRAUD&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HHG-019&lt;/td&gt;
&lt;td&gt;fraud&lt;/td&gt;
&lt;td&gt;0.99&lt;/td&gt;
&lt;td&gt;card not present new device&lt;/td&gt;
&lt;td&gt;$99.92&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;BLOCK_CARD&lt;/code&gt; → &lt;code&gt;CREATE_CASE&lt;/code&gt; → &lt;code&gt;FILE_REPORT&lt;/code&gt; → &lt;code&gt;MONITOR_CONNECTED_CARDS&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HHG-020&lt;/td&gt;
&lt;td&gt;legitimate&lt;/td&gt;
&lt;td&gt;0.01&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;step up auth&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ALLOW_TRANSACTION&lt;/code&gt; → &lt;code&gt;CREATE_CASE&lt;/code&gt; → &lt;code&gt;CLOSE_NO_FRAUD&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  5. What we learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Schema design is investigation design.&lt;/strong&gt; The &lt;code&gt;Client&lt;/code&gt; vertex and the device fan-out query did more for accuracy than any model tuning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Put the LLM where language is the product.&lt;/strong&gt; When it computed probabilities, runs weren't repeatable. As a bounded prober and a validated writer, it helps without drifting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Uncertain" is an honest answer.&lt;/strong&gt; When evidence disagrees, protect the customer now and let a human decide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graph memory beats flat memory.&lt;/strong&gt; Retrieving past cases by &lt;em&gt;adjacency&lt;/em&gt; (same device, same card) and by &lt;em&gt;similarity&lt;/em&gt; (vectors) together caught things neither did alone.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. What we'd improve with more time
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Real reply channels (SMS, app push) instead of simulated replies, feeding outcomes back as training signal.&lt;/li&gt;
&lt;li&gt;Streaming ingestion into TigerGraph with the ring and structuring scans running continuously.&lt;/li&gt;
&lt;li&gt;Likelihood ratios learned from resolved agent cases instead of set by hand.&lt;/li&gt;
&lt;li&gt;Louvain community detection over client↔device↔email to catch rings that share more than one element.&lt;/li&gt;
&lt;li&gt;External enrichment (BIN/issuer, IP reputation) as additional evidence families.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; TigerGraph Savanna · GSQL · TigerGraph MCP · native vector search · Python · Gemini · Streamlit&lt;/p&gt;

&lt;p&gt;Built for Hacker House Goa 2026 with @TigerGraphDB. Code, the 20 answer files and full investigation traces: &lt;a href="https://github.com/nirmaljosephukken/HH_GOA_Task_4" rel="noopener noreferrer"&gt;https://github.com/nirmaljosephukken/HH_GOA_Task_4&lt;/a&gt;&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/Rw8Wb1xVlPg" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>tigergraph</category>
      <category>ai</category>
      <category>graphrag</category>
      <category>python</category>
    </item>
  </channel>
</rss>
