<?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: jitin raju</title>
    <description>The latest articles on DEV Community by jitin raju (@jrine).</description>
    <link>https://dev.to/jrine</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%2F4141654%2F738a8a9c-5319-42e9-85d5-5f8d4fb95c1c.jpeg</url>
      <title>DEV Community: jitin raju</title>
      <link>https://dev.to/jrine</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jrine"/>
    <language>en</language>
    <item>
      <title>The graph gathers, the rules decide, the model explains: building an agentic fraud investigator on TigerGraph</title>
      <dc:creator>jitin raju</dc:creator>
      <pubDate>Thu, 24 Sep 2026 17:16:06 +0000</pubDate>
      <link>https://dev.to/jrine/the-graph-gathers-the-rules-decide-the-model-explains-building-an-agentic-fraud-investigator-on-2kjo</link>
      <guid>https://dev.to/jrine/the-graph-gathers-the-rules-decide-the-model-explains-building-an-agentic-fraud-investigator-on-2kjo</guid>
      <description>&lt;p&gt;&lt;em&gt;Tidewatch: our build for the TigerGraph × Hacker House Goa 2026 Agentic Fraud Investigation challenge.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A fraud alert is a question with an expensive wrong answer in both directions. If you block a&lt;br&gt;
real customer's card, you've failed them. If you wave through a stolen card, you've failed the&lt;br&gt;
bank. The challenge handed us 590,742 card transactions, a fraud policy with ten rules, 5,565 closed&lt;br&gt;
investigations and 20 open alerts. It asked for an agent that investigates each alert, decides what&lt;br&gt;
to do next, knows when to ask for more evidence, and explains itself well enough for an analyst,&lt;br&gt;
and eventually a regulator, to act on it.&lt;/p&gt;

&lt;p&gt;This post covers what we built, how TigerGraph sits at the centre of it, and the numbers. It also&lt;br&gt;
covers the two times our own tools caught us being wrong.&lt;/p&gt;




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

&lt;p&gt;Tidewatch works a fraud alert the way a careful analyst would:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Investigate.&lt;/strong&gt; It pulls the evidence out of a transaction graph on TigerGraph Savanna: the
flagged transaction, the card's own history, the device it ran on, whether that device is
shared with other customers' cards, card-testing bursts, recurring charges, and the customer's
past cases along with the closest prior cases across the whole book.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assess.&lt;/strong&gt; It scores that evidence with a transparent log-odds rubric, so every point of
probability can be traced to a named signal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decide whether to ask.&lt;/strong&gt; It prices every question it could put to the customer or an analyst
by how far the answer could move the recommended action, minus the cost of asking. It asks only
when that net value is positive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Act within policy.&lt;/strong&gt; It recommends actions from the policy's vocabulary. Each action carries
the approval route the policy assigns it: &lt;code&gt;auto&lt;/code&gt;, &lt;code&gt;L1&lt;/code&gt; or &lt;code&gt;L2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remember.&lt;/strong&gt; It writes the finished case back into the graph as a &lt;code&gt;FraudCase&lt;/code&gt; vertex, then
reads it back before the answer file is allowed to say it was written.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On top of that sit an &lt;strong&gt;analyst console&lt;/strong&gt; and a &lt;strong&gt;Claude copilot&lt;/strong&gt;. The console replays every&lt;br&gt;
investigation step by step, shows the case's neighbourhood in the graph, and runs an autonomous&lt;br&gt;
monitor over the book. The copilot explains and challenges the decision, but never makes it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The design choice everything else follows from: no language model sits in the decision loop.&lt;/strong&gt;&lt;br&gt;
Every verdict, probability, action and route comes from graph queries, the rubric and the policy&lt;br&gt;
engine. Every answer file can be reproduced to the byte and audited line by line. The model does&lt;br&gt;
the thing a deterministic engine can't: it talks to the human.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2exv7uu71s252et2yi6s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2exv7uu71s252et2yi6s.png" alt=" " width="800" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The investigation runs in seven stages: open, investigate, assess, gather more evidence, take&lt;br&gt;
action, explain, update memory. Each stage is metered: graph queries, model calls, tokens, dollars,&lt;br&gt;
wall time. Each step also goes into a millisecond-stamped trace, which the console replays.&lt;/p&gt;

&lt;p&gt;There are two interchangeable graph backends behind one interface: TigerGraph (GSQL over REST++)&lt;br&gt;
and a parquet backend for offline runs and backtests. A &lt;strong&gt;contract test suite&lt;/strong&gt; runs the same&lt;br&gt;
queries against both and fails if they disagree. It caught six divergences during the build, and&lt;br&gt;
one would have crashed at runtime: the two backends returned card-testing episodes in different&lt;br&gt;
shapes.&lt;/p&gt;




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

&lt;h3&gt;
  
  
  The schema
&lt;/h3&gt;

&lt;p&gt;We modelled the domain the way the investigation traverses it. The vertex types are &lt;code&gt;Customer&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;PaymentCard&lt;/code&gt;, &lt;code&gt;Transaction&lt;/code&gt;, &lt;code&gt;DeviceProfile&lt;/code&gt;, &lt;code&gt;BillingRegion&lt;/code&gt;, &lt;code&gt;EmailDomain&lt;/code&gt;, &lt;code&gt;ClosedCase&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;FraudCase&lt;/code&gt; and &lt;code&gt;PolicyChunk&lt;/code&gt;. The edges follow the questions an investigator asks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;OWNS&lt;/code&gt; and &lt;code&gt;USED_IN&lt;/code&gt;:&lt;/strong&gt; whose card, and which transactions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;NEXT_TXN&lt;/code&gt;:&lt;/strong&gt; the card's timeline, as a linked list, so burst and velocity questions are walks
rather than sorts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ON_DEVICE&lt;/code&gt;:&lt;/strong&gt; which device profile ran the transaction, carrying &lt;code&gt;device_state&lt;/code&gt; and
&lt;code&gt;proxy_kind&lt;/code&gt; as edge attributes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;SHARES_DEVICE&lt;/code&gt;:&lt;/strong&gt; card-to-card links through a common device, the backbone of ring detection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ABOUT&lt;/code&gt;, &lt;code&gt;CASE_CARD&lt;/code&gt;, &lt;code&gt;TRIGGERED_BY&lt;/code&gt;, &lt;code&gt;SIMILAR_TO&lt;/code&gt;:&lt;/strong&gt; our own cases, attached to the entities
they're about so the next investigation can find them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dataset has no card identifier, so we first reconstructed cards from the six card fields per&lt;br&gt;
customer, giving 14,893 cards across 13,553 customers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Loading the full book
&lt;/h3&gt;

&lt;p&gt;All 590,742 transactions went in, along with 575,849 &lt;code&gt;NEXT_TXN&lt;/code&gt; edges, 144,432 &lt;code&gt;ON_DEVICE&lt;/code&gt; edges&lt;br&gt;
and 128,852 &lt;code&gt;SHARES_DEVICE&lt;/code&gt; edges. Every count matched the source exactly. The first attempt, a&lt;br&gt;
single 14 MB POST, hit a 504 gateway timeout, so the loader now sends 50,000-row chunks. The full&lt;br&gt;
load takes about eleven minutes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Queries in the loop
&lt;/h3&gt;

&lt;p&gt;Each investigation makes 10 or 11 graph calls: up to nine reads (card-present transactions skip the device lookup), then a write and a read-back.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question the agent asks&lt;/th&gt;
&lt;th&gt;GSQL query&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;What exactly happened?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;get_transaction&lt;/code&gt;, &lt;code&gt;get_customer&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is this normal &lt;em&gt;for this card&lt;/em&gt;?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;card_baseline&lt;/code&gt; (percentile of the amount in the card's own history, new region, new product, 1h/24h velocity)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What device, and is it new or proxied?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;device_for_transaction&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is the device shared with other customers' cards inside the window?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;shares_device_edges&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Was the card tested first (R5)?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;card_testing_window&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is this a subscription the cardholder forgot (R7)?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;same_amount_priors&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Has this customer been investigated before?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;prior_cases_for_customer&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What did similar past cases conclude?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;similar_closed_cases&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Did our write land?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;read_case&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The ranking of similar cases deliberately runs outside the query. The channel, pattern and&lt;br&gt;
exposure filters are &lt;em&gt;relaxable&lt;/em&gt;: a loosely filtered set of five is better evidence than a&lt;br&gt;
perfectly filtered set of one. When the query applied them itself, the graph backend returned zero&lt;br&gt;
similar cases where the parquet backend returned three. The one filter that is never relaxed, the&lt;br&gt;
as-of cut, stays in GSQL, because a case closed after the one being replayed would hand the agent&lt;br&gt;
its own answer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case memory
&lt;/h3&gt;

&lt;p&gt;Every finished case becomes a &lt;code&gt;FraudCase&lt;/code&gt; vertex with edges to its customer, card, triggering&lt;br&gt;
transactions and the prior cases it drew on. &lt;code&gt;written_to_graph&lt;/code&gt; in an answer file is never a&lt;br&gt;
constant. It's set only after &lt;code&gt;read_case&lt;/code&gt; finds the vertex. All 20 graded cases are in the graph.&lt;/p&gt;

&lt;h3&gt;
  
  
  Making it fast on Savanna
&lt;/h3&gt;

&lt;p&gt;The first TigerGraph run took about &lt;strong&gt;12 seconds per case&lt;/strong&gt;. Three changes brought it to about&lt;br&gt;
&lt;strong&gt;3 seconds&lt;/strong&gt;, with identical answers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Concurrent waves.&lt;/strong&gt; Seven of the nine reads depend only on the alert, so they go out together.
The other two need the channel and amount from the first wave.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One write, not eight.&lt;/strong&gt; The case vertex and all its edges now go in a single &lt;code&gt;upsertData&lt;/code&gt; call:
1.6 s → 0.23 s.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An immutable pool fetched once.&lt;/strong&gt; The closed-case history never changes, so it's read once per
process and cut by date locally: 1.4–1.9 s per case → 9 ms.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the in-memory parquet backend, the same investigation takes a &lt;strong&gt;median of 40 ms&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. How the agent reasons
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The rubric.&lt;/strong&gt; Probability starts from a prior of 0.30 and moves in log-odds, one named&lt;br&gt;
contribution per signal. Signals are grouped into &lt;em&gt;families&lt;/em&gt;: amount behaviour, geography, device,&lt;br&gt;
shared origin, customer response, and so on. One family on its own can't push a case out of the&lt;br&gt;
0.15–0.85 band, however strong it looks. The bank's own risk score is deliberately capped just below&lt;br&gt;
the materiality floor, so it's a reason to look but never an independent signal. The policy says&lt;br&gt;
the same thing: "a score is a reason to look, never a verdict".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Asking for evidence.&lt;/strong&gt; Before asking anything, the agent prices every option: step-up&lt;br&gt;
authentication (friction 0.05), a call to validate with the customer (0.12), or a request to an&lt;br&gt;
analyst (0.20). For each one it simulates the likely answers, re-runs the rubric and the policy on&lt;br&gt;
each, and measures how far the &lt;em&gt;recommended action&lt;/em&gt; would move. It asks only when expected movement&lt;br&gt;
minus friction clears 0.05. Four of the twenty cases asked a question, and in all four the&lt;br&gt;
recommendation changed. The dataset contains no real customer replies, so every response is&lt;br&gt;
simulated and labelled &lt;code&gt;SIMULATED&lt;/code&gt; wherever it appears.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The policy engine.&lt;/strong&gt; Rules R1–R10 are encoded as functions that each cite their own rule. §3a,&lt;br&gt;
"a case is not a report", is enforced as a gate. A regulatory filing needs a fraud verdict &lt;em&gt;and&lt;/em&gt; an&lt;br&gt;
aggravating condition: exposure over $1,000, a rare shared device, or an undocumented pattern.&lt;br&gt;
Across 5,565 closed cases, only 7.1% ended in a report.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Where Claude fits
&lt;/h2&gt;

&lt;p&gt;The copilot is &lt;code&gt;claude-opus-5&lt;/code&gt; at low effort, called through the Anthropic Python SDK. It reads the&lt;br&gt;
answer file, the diagnostics (every rubric contribution, every priced question, the decision log)&lt;br&gt;
and the Fraud Policy. It cites evidence as &lt;code&gt;E3&lt;/code&gt; and rules as &lt;code&gt;R6&lt;/code&gt;. It may disagree out loud, but&lt;br&gt;
changing the decision is a human's job through the approval route. The policy and the case form a&lt;br&gt;
cached prefix, so a follow-up question costs about &lt;strong&gt;$0.02&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It earned its place. Asked to "challenge the decision" on HHG-010, it pointed out that the&lt;br&gt;
shared-device evidence came from a &lt;em&gt;different device&lt;/em&gt; than the flagged transaction ran on. It also&lt;br&gt;
noticed that the draft suspicious-activity report named the wrong device as the one the&lt;br&gt;
transaction "ran on". It was right. The ring query looks at every device the card used in the&lt;br&gt;
window, and the report builder was picking the first profile from an alphabetically sorted list.&lt;br&gt;
We fixed it, and the evidence text now says when the linked device isn't the transaction's own.&lt;br&gt;
That's the division of labour we wanted: deterministic decisions, with a model that reads them&lt;br&gt;
critically.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Verdicts across the 20 cases&lt;/td&gt;
&lt;td&gt;6 fraud · 9 uncertain · 5 legitimate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regulatory reports&lt;/td&gt;
&lt;td&gt;3 of 20 (HHG-010 over $1,000; HHG-011 and HHG-019 on a rare device shared across customers)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Asked for evidence&lt;/td&gt;
&lt;td&gt;4 cases; the recommendation changed in all 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Actions needing a human&lt;/td&gt;
&lt;td&gt;10 cases have an &lt;code&gt;L1&lt;/code&gt;/&lt;code&gt;L2&lt;/code&gt; action awaiting sign-off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model spend on decisions&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;$0.00&lt;/strong&gt; (0 model calls)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Graph queries&lt;/td&gt;
&lt;td&gt;215 across the pack; 85% of evidence items come straight from the graph&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Median investigation&lt;/td&gt;
&lt;td&gt;40 ms (parquet) · ~3 s (Savanna)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Validation&lt;/td&gt;
&lt;td&gt;20/20 pass the answer-file invariants; 276 tests pass&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The autonomous monitor&lt;/strong&gt; watches the 4,462 highest-risk authorisations in the book, those the&lt;br&gt;
bank's model scores at 0.85 or above, excluding the 20 graded ones. It investigates each end to end,&lt;br&gt;
lets actions routed &lt;code&gt;auto&lt;/code&gt; run (simulated, as the brief permits), and queues everything else for a&lt;br&gt;
person. On a 300-alert sample it takes a median of 53 ms per alert and files reports on 12% of them.&lt;br&gt;
That's more than the closed-case rate of 7.1%, which fits: these are the riskiest 2% of&lt;br&gt;
transactions.&lt;/p&gt;

&lt;h3&gt;
  
  
  The calibration story
&lt;/h3&gt;

&lt;p&gt;The monitor did more than demo well: it found a bug. Early on, it labelled &lt;strong&gt;90 of 300 unseen&lt;br&gt;
alerts&lt;/strong&gt; as an &lt;code&gt;undocumented&lt;/code&gt; typology. The closed-case history has &lt;em&gt;nine&lt;/em&gt; such cases in 5,565.&lt;br&gt;
We had loosened ring detection to catch a 52-card device profile named in one of the 20 cases, and&lt;br&gt;
that loosened link was quietly qualifying for "new typology", which carries a mandatory report.&lt;br&gt;
The fix was to require a &lt;em&gt;rare&lt;/em&gt; device link. On the same alerts, &lt;code&gt;undocumented&lt;/code&gt; dropped from 90 to&lt;br&gt;
10 and reports from 33% to 12%.&lt;/p&gt;

&lt;p&gt;The same review caught two more issues, both visible only when you read the answers against the&lt;br&gt;
data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;An online purchase labelled &lt;code&gt;out_of_region_use&lt;/code&gt;.&lt;/strong&gt; All 955 closed cases with that pattern are
in person.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A report filed on a case the rubric itself held &lt;code&gt;uncertain&lt;/code&gt;.&lt;/strong&gt; "Strongly suspected" now means
the engine reached &lt;code&gt;fraud&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this would have surfaced if we'd only looked at the 20 graded cases.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Honest limits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simulated customer responses.&lt;/strong&gt; The dataset has none, so the agent assumes the most likely
answer and says so every time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A GSQL ring gap.&lt;/strong&gt; The ring query on TigerGraph undercounts device profiles that were also
active outside the investigation window, because a precomputed edge attribute spans each card
pair's whole history. The graded answers use the parquet computation. The gap is tracked as a
strict expected-failure test, so a fix can't go unnoticed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vector search isn't live yet.&lt;/strong&gt; The TigerVector upgrade, semantic policy search and hybrid
similar-case retrieval, is written in &lt;code&gt;vector_upgrade.gsql&lt;/code&gt; but wasn't deployed for the graded run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nothing real is actioned.&lt;/strong&gt; Blocks and reports are recorded, never executed. What &lt;em&gt;is&lt;/em&gt; real is
which actions the policy allowed to run without a human.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  8. What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A window-scoped ring traversal over &lt;code&gt;ON_DEVICE&lt;/code&gt;, so the graph backend matches parquet exactly.&lt;/li&gt;
&lt;li&gt;TigerVector for policy retrieval and hybrid case similarity.&lt;/li&gt;
&lt;li&gt;Replaying the 5,565 closed cases as a backtest, with a calibration curve.&lt;/li&gt;
&lt;li&gt;Letting the analyst's approvals flow back into the graph as labelled outcomes.&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>tigergraphdb</category>
      <category>hhoga</category>
      <category>hackathon</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
