<?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: spideyy</title>
    <description>The latest articles on DEV Community by spideyy (@kishore1035).</description>
    <link>https://dev.to/kishore1035</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%2F4142407%2Fbbe50548-3059-49b6-9d7f-e69b8d35bdf8.jpg</url>
      <title>DEV Community: spideyy</title>
      <link>https://dev.to/kishore1035</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kishore1035"/>
    <language>en</language>
    <item>
      <title>We Built a 3D Game Where Your Voice Breaks Reality, As Our Hacker House Submission</title>
      <dc:creator>spideyy</dc:creator>
      <pubDate>Tue, 06 Oct 2026 17:47:38 +0000</pubDate>
      <link>https://dev.to/kishore1035/we-built-a-3d-game-where-your-voice-breaks-reality-as-our-hacker-house-submission-4gec</link>
      <guid>https://dev.to/kishore1035/we-built-a-3d-game-where-your-voice-breaks-reality-as-our-hacker-house-submission-4gec</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"How much of the world are you willing to destroy to create the world you want?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Our team — &lt;strong&gt;Alt F4&lt;/strong&gt; — built this as our submission for &lt;strong&gt;Hacker House Goa 2026&lt;/strong&gt; in collaboration with &lt;strong&gt;&lt;a href="https://wisprflow.ai/?utm_source=dub.co&amp;amp;utm_medium=affiliate&amp;amp;utm_campaign=AffiliateProgram&amp;amp;via=promo68&amp;amp;dub_id=ljjzSMfkPGUViLAi&amp;amp;gad_source=1" rel="noopener noreferrer"&gt;Wispr Flow&lt;/a&gt;&lt;/strong&gt;. And we decided to break every rule we set for ourselves.&lt;/p&gt;

&lt;p&gt;No game engine. No Unity. No Godot. Just &lt;strong&gt;React, TypeScript, Three.js&lt;/strong&gt;, and a slightly deranged idea:&lt;br&gt;
&lt;strong&gt;What if your voice was the controller?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the story of &lt;strong&gt;ECHO&lt;/strong&gt; — a cel-shaded dark fantasy RPG where you speak commands into the browser and the world obeys. Soldiers retreat. Bridges collapse. Rain drowns out torches. And every edit to reality leaves a scar.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Premise (and Why It's Dangerous)
&lt;/h2&gt;

&lt;p&gt;The player wakes up in the Meadowlands with no memory — but they have a power called &lt;strong&gt;The Echo&lt;/strong&gt;. Whatever they speak aloud &lt;strong&gt;manifests in the physical world&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Say &lt;code&gt;"Call the rain"&lt;/code&gt; → storm clouds roll in, torches extinguish, raiders break rank and flee.&lt;br&gt;
Say &lt;code&gt;"Destroy the bridge"&lt;/code&gt; → the stone bridge shatters into rubble, cutting off the enemy vanguard.&lt;br&gt;
Say &lt;code&gt;"Protect Rowan"&lt;/code&gt; → a shimmering Chronal Barrier envelops your miller friend, making him immune to blades.&lt;/p&gt;

&lt;p&gt;Cool, right? Here's the catch:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Rewriting reality doesn't erase what happened. It fractures the world into alternate branches.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every command leaves a silent scar. Mira the Seer carries the agonizing memory of every erased timeline. The ancient Architect tried to build a world without sorrow — and cracked the foundations of reality. You're next.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧠 The Architecture That Makes It Tick
&lt;/h2&gt;

&lt;p&gt;Here's a bird's eye view of the pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       Microphone Input
             │
             ▼
   Web Speech API (streaming)
             │
             ▼
   CommandParser
   ├── Local keyword fallback (zero-latency, offline)
   └── Gemini Flash API (structured JSON, natural language)
             │
             ▼
   Command Dispatcher
   ├── WorldState (entities, weather, physics)
   ├── CampaignSystem (missions, objectives, dialogue)
   └── TimelineSystem (snapshots, branches, rewind engine)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No bloated middleware. No event bus spaghetti. Each layer is a Zustand store, and commands flow downward like water.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎙️ The Voice Engine: Two Modes, One Experience
&lt;/h2&gt;

&lt;p&gt;The hardest design constraint I imposed on myself: &lt;strong&gt;the game must feel instant&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If Gemini is slow, you can't feel it. So I built a two-layer system:&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 1 — Zero-Latency Local Fallback
&lt;/h3&gt;

&lt;p&gt;Mission-critical commands (&lt;code&gt;retreat&lt;/code&gt;, &lt;code&gt;shield&lt;/code&gt;, &lt;code&gt;rain&lt;/code&gt;, &lt;code&gt;rewind&lt;/code&gt;) are matched locally via keyword parsing. No network call. No latency. Fires in the same animation frame as the mic input.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 2 — Gemini Structured JSON
&lt;/h3&gt;

&lt;p&gt;For nuanced natural language (&lt;code&gt;"Tell the soldiers of Shadowfang to go back where they came from"&lt;/code&gt;) — Gemini parses it and returns a clean structured command object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;INTERACT_ENTITY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;entityName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;soldiers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;retreat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The dispatcher doesn't care how it was parsed. It just runs.&lt;/p&gt;

&lt;p&gt;The real magic is the fallback ordering: &lt;strong&gt;try local first, call Gemini only when you need it&lt;/strong&gt;. Zero perceived latency, full natural language support.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌳 The Echo Tree — One Physical Anchor for All of Time
&lt;/h2&gt;

&lt;p&gt;This was the wildest design decision.&lt;/p&gt;

&lt;p&gt;Timeline manipulation in most games is a menu. In ECHO, it's a &lt;strong&gt;place&lt;/strong&gt;. The Echo Tree is a singular location in the world at coordinates &lt;code&gt;(-13, -1.5)&lt;/code&gt; — a glade west of the forest. You physically walk to it. You stand in its radius. You interact with it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ECHO_TREE_COORDS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;13.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;z&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;interactionRadius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;4.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nl"&gt;checkProximity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hypot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;ECHO_TREE_COORDS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;ECHO_TREE_COORDS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isNear&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;dist&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;ECHO_TREE_COORDS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;interactionRadius&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;isNear&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;isNear&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tree maintains deep immutable world snapshots — every entity state, weather condition, chaos score, and dynamic prop. You can fork realities, jump between branches, or rewind to narrative junctions. And critically: &lt;strong&gt;control configurations persist through timeline rewrites&lt;/strong&gt;. Your key bindings survive the apocalypse.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚔️ Mission 3: Where Simulation Gets Real
&lt;/h2&gt;

&lt;p&gt;Mission 3 is the first major test of the system. Warlord Vorn's Shadowfang Vanguard is marching across the bridge toward Rowan's Mill with lit torches.&lt;/p&gt;

&lt;p&gt;The player has &lt;strong&gt;5 solutions&lt;/strong&gt;, all of them real physics events:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Voice Command&lt;/th&gt;
&lt;th&gt;What Actually Happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"Protect Rowan"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Chronal barrier activates. Entity gains &lt;code&gt;aiState: 'cheering'&lt;/code&gt;, full HP restore&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"Call the rain"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Weather flips to storm. Torch entities extinguished. Raiders enter &lt;code&gt;fleeing&lt;/code&gt; state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"Destroy the bridge"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bridge mesh collapses. &lt;code&gt;setBridgeDestroyed(true)&lt;/code&gt;. Raiders halt or reroute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"Make the soldiers retreat"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All Shadowfang entities get &lt;code&gt;aiState: 'fleeing'&lt;/code&gt;, despawn after 3.5s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Direct combat&lt;/td&gt;
&lt;td&gt;Melee/spell physics, knockback, stagger, health depletion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Rowan's fate is &lt;strong&gt;never faked through dialogue&lt;/strong&gt;. It derives directly from his simulated health state at the end of the mission. Die at 0 HP? He collapses. Survive at 59 HP? He bandages his wounds. The game acknowledges the struggle. No cutscene tricks.&lt;/p&gt;

&lt;p&gt;And here's what the interaction code actually looks like when a player shields Rowan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;updateEntity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;shieldTarget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;health&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;shieldTarget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;maxHealth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;dialogBark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;The air around me... it holds! The strikes cannot touch me!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;aiState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cheering&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;record&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;player_helped&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;actorId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;player&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;actorName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;The Voice&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;targetId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;shieldTarget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`The Voice manifested an impenetrable chronal shield around &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;shieldTarget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;significance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;TimelineSystem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createCheckpoint&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Shielded &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;shieldTarget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;significance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;story&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One action. Three systems updated. Memory ledger written. Timeline checkpoint created. State broadcasted.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔊 Audio: Zero External Assets, 100% Procedural
&lt;/h2&gt;

&lt;p&gt;This was a point of pride. ECHO has &lt;strong&gt;zero audio files&lt;/strong&gt;. Every sound is synthesized at runtime using the Web Audio API.&lt;/p&gt;

&lt;h3&gt;
  
  
  River Ambience
&lt;/h3&gt;

&lt;p&gt;A continuous 6-second pink noise buffer runs through parallel dual-band filters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deep flow path&lt;/strong&gt; → Lowpass at 420 Hz (the body of rushing water)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Surface trickle path&lt;/strong&gt; → Bandpass at 920 Hz, Q=1.1 (water rippling over stones)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distance attenuation&lt;/strong&gt; → Logarithmic falloff based on player proximity to the riverbank&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Shoreline Hysteresis
&lt;/h3&gt;

&lt;p&gt;This one's my favorite detail. The water entry/exit logic uses a &lt;strong&gt;deadband&lt;/strong&gt; to prevent oscillation at the shoreline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entry triggers at ≥ 0.08m depth&lt;/li&gt;
&lt;li&gt;Exit triggers only at &amp;lt; 0.03m depth (6cm deadband)&lt;/li&gt;
&lt;li&gt;450ms debounce timer prevents rapid re-triggering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No more "splash splash splash" when walking along the water's edge.&lt;/p&gt;

&lt;h3&gt;
  
  
  Underwater Acoustics
&lt;/h3&gt;

&lt;p&gt;A master lowpass filter ramps down to 320 Hz to muffle the world. A 52 Hz sub-aquatic pressure drone hums while submerged. Surfacing restores the full 22 kHz spectrum with a crisp air-breach emergence splash.&lt;/p&gt;

&lt;p&gt;All of it synthesized. All of it reactive. No audio files.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎨 Cel-Shading in React Three Fiber
&lt;/h2&gt;

&lt;p&gt;The visual direction is stylized dark fantasy cel-shading. Custom toon color ramps (&lt;code&gt;getToonGradient3&lt;/code&gt;, &lt;code&gt;getToonGradient4&lt;/code&gt;) applied to procedurally textured meshes: stone masonry, timber grain, heraldic tabards, character attire.&lt;/p&gt;

&lt;p&gt;The UI follows a cinematic dark fantasy palette across all 18 UI surfaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Typography&lt;/strong&gt;: Warm ivory/parchment &lt;code&gt;#E8E3D8&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Highlights&lt;/strong&gt;: Muted antique gold &lt;code&gt;#B59A4A&lt;/code&gt; / &lt;code&gt;#8F7836&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Panels&lt;/strong&gt;: Near-black charcoal &lt;code&gt;#070B12&lt;/code&gt; / &lt;code&gt;#0C1119&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Borders&lt;/strong&gt;: Dark bronze/stone &lt;code&gt;#292923&lt;/code&gt; / &lt;code&gt;#3A3628&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cohesion across Title Screen, Dialogue Box, Memory Panel, Timeline Tree, Save/Load modal — all 18 surfaces. When a UI element appears, it &lt;em&gt;belongs&lt;/em&gt; in this world.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ The Full Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technologies&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Frontend Core&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;React 19, TypeScript, Vite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3D Rendering&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Three.js, React Three Fiber, Drei&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;State Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Zustand (modular: &lt;code&gt;WorldState&lt;/code&gt;, &lt;code&gt;CampaignSystem&lt;/code&gt;, &lt;code&gt;TimelineSystem&lt;/code&gt;, &lt;code&gt;EchoTreeState&lt;/code&gt;, &lt;code&gt;SettingsStore&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Speech &amp;amp; AI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Web Speech Recognition API + Google Gemini Flash (structured JSON)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Audio&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Procedural Web Audio API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Styling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vanilla CSS, Glassmorphic overlays&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Testing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Node.js + tsx TypeScript test runner&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧪 Actually Testing a Narrative Game
&lt;/h2&gt;

&lt;p&gt;Most game test suites are a lie. Unit tests for "did the menu open?" don't catch whether your story systems stay coherent across timeline rewrites.&lt;/p&gt;

&lt;p&gt;I wrote four test suites that actually matter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Full narrative vertical slice (M1 → M2 → M3 → M4, branches, Echo Tree)&lt;/span&gt;
npx tsx scripts/verify_narrative_slice.ts

&lt;span class="c"&gt;# Controls &amp;amp; key rebinding (bindings, conflict resolution, timeline isolation)&lt;/span&gt;
npx tsx scripts/verify_controls_system.ts

&lt;span class="c"&gt;# Water audio &amp;amp; acoustic physics (proximity falloff, hysteresis, splash synthesis)&lt;/span&gt;
npx tsx scripts/verify_water_audio.ts

&lt;span class="c"&gt;# Mission 3 battle simulation (all 4 Echo solutions, raider pathing, Rowan fates)&lt;/span&gt;
npx tsx scripts/verify_m3_battle.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zero regressions across storyline logic, audio synthesis, and world simulation. That's the bar.&lt;/p&gt;







&lt;h2&gt;
  
  
  🤝 Alt F4 × Wispr Flow — The Collaboration
&lt;/h2&gt;

&lt;p&gt;ECHO is &lt;strong&gt;Team Alt F4's submission for Hacker House Goa 2026&lt;/strong&gt;, built in collaboration with &lt;strong&gt;Wispr Flow&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Wispr Flow is a voice-first input layer that makes speaking to software feel natural and frictionless — which made them the perfect partner for a game where your voice is the &lt;em&gt;only&lt;/em&gt; weapon that matters. Their philosophy of making voice a first-class input shaped how we thought about the Echo's command pipeline: if it feels clunky to say, it feels clunky to play.&lt;/p&gt;

&lt;p&gt;Building ECHO as a selection submission meant every architectural decision had to be a fast, confident bet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zustand&lt;/strong&gt; over Redux (less boilerplate, same power)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Audio API&lt;/strong&gt; over audio files (zero asset pipeline, zero loading time)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local keyword fallback&lt;/strong&gt; over pure LLM (playable even when the API is slow)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simulation over scripting&lt;/strong&gt; (Rowan's fate is real, not cinematic)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pressure of a tight deadline forced exactly the kind of ruthless simplicity that made the systems clean.&lt;/p&gt;




&lt;h2&gt;
  
  
  💭 What We Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Simulation over scripting.&lt;/strong&gt; The temptation to fake outcomes with dialogue is real. Resist it. When Rowan's fate comes from his actual HP value in the simulation, the game &lt;em&gt;means&lt;/em&gt; something. Players feel it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Voice input has two enemies: latency and ambiguity.&lt;/strong&gt; Solve latency with local fallback. Solve ambiguity with LLMs. Use both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Procedural audio is worth the complexity.&lt;/strong&gt; The river doesn't loop awkwardly, the underwater acoustics feel real, and there are zero licensing concerns. The investment pays off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The world should react, not the UI.&lt;/strong&gt; No giant overlays when you speak a command. The rain falls. The bridge breaks. The soldiers run. The world tells you what happened.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. React + Three.js is totally viable for games.&lt;/strong&gt; The component model for scene graph management is actually great. Zustand handles game state better than any bespoke solution I've tried. Don't sleep on this stack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Deadline pressure is a feature, not a bug.&lt;/strong&gt; Having a hard deadline forced us to bet fast and ship. Every cut we made improved the core. If you have a wild idea, go find a challenge that forces you to build it.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔗 Try It / Explore It
&lt;/h2&gt;

&lt;p&gt;The repo is &lt;strong&gt;public&lt;/strong&gt; — go break things:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/kishore1035/echo" rel="noopener noreferrer"&gt;github.com/kishore1035/echo&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/kishore1035/echo.git
&lt;span class="nb"&gt;cd echo
&lt;/span&gt;npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;span class="c"&gt;# Open http://localhost:5173 and start speaking&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Optionally drop a Gemini API key in &lt;code&gt;.env&lt;/code&gt; for full natural language parsing — the game is fully playable without it using the local keyword fallback.&lt;/p&gt;

&lt;p&gt;If you're building something at the intersection of web tech and games — or you're interested in what we're working on — &lt;strong&gt;hit us up&lt;/strong&gt;. This space is criminally underexplored and the tools are better than you think.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Team Alt F4&lt;/strong&gt; · Submission for &lt;strong&gt;Hacker House Goa 2026&lt;/strong&gt; · In collaboration with &lt;strong&gt;&lt;a href="https://wisprflow.ai/?utm_source=dub.co&amp;amp;utm_medium=affiliate&amp;amp;utm_campaign=AffiliateProgram&amp;amp;via=promo68&amp;amp;dub_id=ljjzSMfkPGUViLAi&amp;amp;gad_source=1" rel="noopener noreferrer"&gt;Wispr Flow&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;React 19 · TypeScript · Three.js · Google Gemini · Web Audio API · and an embarrassing amount of late nights.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>typescript</category>
      <category>threejs</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Building FraudGraph Agent: Autonomous Fraud Investigation &amp; Policy-Compliant Next-Best Action with TigerGraph</title>
      <dc:creator>spideyy</dc:creator>
      <pubDate>Fri, 25 Sep 2026 06:52:43 +0000</pubDate>
      <link>https://dev.to/kishore1035/building-fraudgraph-agent-autonomous-fraud-investigation-policy-compliant-next-best-action-with-525m</link>
      <guid>https://dev.to/kishore1035/building-fraudgraph-agent-autonomous-fraud-investigation-policy-compliant-next-best-action-with-525m</guid>
      <description>&lt;h1&gt;
  
  
  Building FraudGraph Agent: Autonomous Fraud Investigation &amp;amp; Policy-Compliant Next-Best Action with TigerGraph
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;How we combined TigerGraph 4.2.5, Model Context Protocol (MCP), calibrated Graph ML, Vector GraphRAG, and deterministic policy enforcement to build an enterprise-grade autonomous fraud investigator.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Billion-Dollar Dilemma in Modern Payment Fraud
&lt;/h2&gt;

&lt;p&gt;Financial fraud is evolving at machine speed. Fraud rings no longer rely on simple stolen credit card numbers; they operate coordinated syndicates utilizing synthetic identities, recycled device fingerprints across hundreds of cards, micro-transaction card testing sequences, and distributed structuring schemes designed to evade static rule thresholds.&lt;/p&gt;

&lt;p&gt;Yet inside modern fraud operations centers, the investigation workflow looks remarkably dated:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Information Fragmentation&lt;/strong&gt;: An alert fires from an ML risk scoring engine or a customer support ticket.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual Graph Traversal&lt;/strong&gt;: An analyst spends 45 to 90 minutes manually opening six different dashboard tabs, issuing SQL queries across relational databases, checking whether a device ID was previously linked to chargebacks, and evaluating whether an out-of-region transaction represents travel or credential theft.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The False Positive Nightmare&lt;/strong&gt;: Over 90% of flagged alerts end up being legitimate customer activity. Prematurely blocking a card causes churn and reputational damage; failing to act within minutes results in thousands of dollars in unrecoverable chargebacks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Hallucination Danger of Generative AI&lt;/strong&gt;: While Large Language Models (LLMs) excel at synthesizing unstructured text, deploying a naive LLM agent in financial fraud is an operational non-starter. &lt;strong&gt;An LLM cannot be trusted to hallucinate card block decisions, ignore banking policy, or bypass regulatory approval hierarchies.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To solve this, we engineered &lt;strong&gt;FraudGraph Agent&lt;/strong&gt; for the &lt;strong&gt;TigerGraph x Hacker House Goa challenge&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;FraudGraph Agent is an autonomous, graph-native fraud investigator that takes raw alerts, navigates a 590,000+ transaction TigerGraph knowledge graph, diagnoses the exact fraud typology, gathers multi-source evidence, enforces a deterministic policy engine for next-best actions, drafts regulatory FinCEN Suspicious Activity Reports (SARs), and writes its findings back into graph memory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────────────┐
│ FraudGraph Agent Analyst Dashboard                                      │
├───────────────┬─────────────────────────────────────────────────────────┤
│ Alert Queue   │ Case Details &amp;amp; Live Investigation Stream                │
│  - HHG-001    │ ┌─────────────────────────────────────────────────────┐ │
│  - HHG-006    │ │ Live Streamed Timeline             [Steps 1 to 8]   │ │
│  - HHG-018    │ ├─────────────────────────────────────────────────────┤ │
│               │ │ Uncertainty &amp;amp; Calibrated Verdict                    │ │
│ Filters:      │ │   Stop Rule: p &amp;gt;= 0.85 or p &amp;lt;= 0.15     [0.92 FRAUD]│ │
│  - All (20)   │ ├─────────────────────────────────────────────────────┤ │
│  - Fraud (10) │ │ Next Best Action Evolution                          │ │
│  - Legit (10) │ │   Initial: VERIFY_WITH_CUSTOMER -&amp;gt; Final: BLOCK_CARD│ │
│               │ ├─────────────────────────────────────────────────────┤ │
│ Stats:        │ │ Subgraph Topology &amp;amp; Grounding Evidence              │ │
│  - 590k Txns  │ │   Grounded Facts: 14 | Prior Cases: 5 | Ring Hops: 2│ │
│  - 14.8k Cards│ ├─────────────────────────────────────────────────────┤ │
│  - 5.5k Cases │ │ Case Memory Loop (TigerGraph Vector Retrieval)      │ │
└───────────────┴─┴─────────────────────────────────────────────────────┴─┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Architectural Philosophy: Reason with LLMs, Decide with Policy
&lt;/h2&gt;

&lt;p&gt;The foundational design principle of FraudGraph Agent is strict separation of concerns:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Knowledge Graph provides ground truth.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;The Machine Learning models estimate calibrated probabilities.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;The Policy Engine determines next-best actions and approval routes.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;The LLM reasons, synthesizes, and explains.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;               ┌────────────────────────────────────────────────────────┐
               │              Trigger Alert (Risk / Report)             │
               └──────────────────────────┬─────────────────────────────┘
                                          │
                                          ▼
                      ┌───────────────────────────────────────┐
                      │    1. TigerGraph Graph Traversal      │
                      │  (card_txns, device_rings, history)   │
                      └───────────────────┬───────────────────┘
                                          │
                                          ▼
                      ┌───────────────────────────────────────┐
                      │   2. Calibrated Graph ML + Episodes   │
                      │ (GBDT AUC 0.987, Card Testing, Rings) │
                      └───────────────────┬───────────────────┘
                                          │
                                          ▼
                      ┌───────────────────────────────────────┐
                      │    3. Hybrid Vector GraphRAG (1024d)  │
                      │  (5.5k Closed Cases + Bank Policies)  │
                      └───────────────────┬───────────────────┘
                                          │
                                          ▼
                      ┌───────────────────────────────────────┐
                      │   4. Deterministic Policy Engine      │
                      │    (Rules R1-R10, L1/L2 Approval)     │
                      └───────────────────┬───────────────────┘
                                          │
                                          ▼
                      ┌───────────────────────────────────────┐
                      │    5. Dynamic Evidence &amp;amp; Stopping     │
                      │ (Customer Outreach, p &amp;gt;= .85 / &amp;lt;= .15)│
                      └───────────────────┬───────────────────┘
                                          │
                                          ▼
                      ┌───────────────────────────────────────┐
                      │     6. Grounded Synthesis &amp;amp; SAR       │
                      │ (LLM strictly constrained by facts)   │
                      └───────────────────┬───────────────────┘
                                          │
                                          ▼
                      ┌───────────────────────────────────────┐
                      │    7. Graph Memory Flywheel (MCP)     │
                      │ (AgentCase vertex &amp;amp; embeddings saved) │
                      └───────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By decoupling action execution from LLM generation, FraudGraph Agent guarantees that regulatory requirements (such as mandatory SAR filing over $1,000 exposure or senior manager sign-off for card freezes) can never be bypassed by model drift or prompt injection.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Graph Foundation: TigerGraph 4.2.5
&lt;/h2&gt;

&lt;p&gt;At the core of the system sits &lt;strong&gt;TigerGraph 4.2.5 Community Edition&lt;/strong&gt;, hosting the IEEE-CIS fraud topology comprising:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;590,742+&lt;/strong&gt; Transactions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;14,893+&lt;/strong&gt; Cards &amp;amp; Customers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5,565+&lt;/strong&gt; Historical Closed Cases with detailed resolution narratives&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Device Profiles, IP subnets, Email Domains, and Billing Regions&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;erDiagram
  Customer ||--o{ Card : OWNS
  Card ||--o{ Transaction : MADE
  Transaction ||--o{ DeviceProfile : FROM_DEVICE
  Transaction ||--o{ EmailDomain : PURCHASER_EMAIL
  Transaction ||--o{ BillingRegion : BILLED_IN
  Transaction ||--o{ Transaction : NEXT
  ClosedCase ||--o{ Transaction : INVOLVES
  ClosedCase ||--o{ Card : ON_CARD
  ClosedCase ||--o{ Card : CONNECTED_TO
  AgentCase ||--o{ Transaction : AC_INVOLVES
  AgentCase ||--o{ Card : AC_ON_CARD
  AgentCase ||--o{ Card : AC_CONNECTED
  AgentCase ||--o{ DeviceProfile : AC_DEVICE
  AgentCase ||--o{ ClosedCase : AC_SIMILAR
  AgentCase ||--o{ AgentCase : AC_SIMILAR_AGENT&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Rather than performing slow relational table joins, our investigator issues high-performance GSQL queries compiled into C++:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;card_txns&lt;/code&gt;: Extracts the temporal transaction baseline for a cardholder.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;device_txns&lt;/code&gt; &amp;amp; &lt;code&gt;device_closed_cases&lt;/code&gt;: Traverses 2 hops to identify if a physical device has participated in confirmed fraud on other accounts.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ring_expand&lt;/code&gt;: Performs multi-hop BFS across shared cards, devices, and email domains to uncover coordinated fraud syndicates.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Standardizing Graph Access via Model Context Protocol (MCP)
&lt;/h2&gt;

&lt;p&gt;To enable seamless agentic orchestration, we integrated the &lt;strong&gt;TigerGraph Model Context Protocol (MCP)&lt;/strong&gt; server (&lt;code&gt;agent/mcp_client.py&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Through a persistent stdio JSON-RPC session, the agent treats the graph as a first-class toolset:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Graph Queries&lt;/strong&gt;: Reads execute via &lt;code&gt;tigergraph__run_installed_query&lt;/code&gt; and &lt;code&gt;tigergraph__get_node&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graph Mutation&lt;/strong&gt;: Investigated case memory writes back through &lt;code&gt;tigergraph__add_node&lt;/code&gt; and &lt;code&gt;tigergraph__add_edge&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High-Availability Fallback&lt;/strong&gt;: The client automatically senses environment readiness, falling back to direct pyTigerGraph connections when running against managed TigerGraph Cloud instances.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# The agent executes GSQL queries seamlessly through standard MCP tool calls:
&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tigergraph__run_installed_query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;query_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;card_txns&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;c&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;card_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. The 8-Step Autonomous Investigation Lifecycle
&lt;/h2&gt;

&lt;p&gt;When an alert enters the queue, FraudGraph Agent executes an 8-phase autonomous pipeline:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Deep Subgraph Traversal
&lt;/h3&gt;

&lt;p&gt;The agent queries TigerGraph to extract the card’s behavioral history, device graph, geographic region baseline, and prior closed disputes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Episode Modeling &amp;amp; Heuristic Detectors
&lt;/h3&gt;

&lt;p&gt;A dedicated episode reconstruction algorithm scans the temporal transaction sequence to detect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Card Testing&lt;/strong&gt;: Rapid sequences of low-value authorizations designed to validate stolen PANs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structuring&lt;/strong&gt;: Transactions systematically kept just below regulatory reporting thresholds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Device Ring Proliferation&lt;/strong&gt;: Sudden expansion of new cards bound to a single hardware fingerprint.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: Hybrid Vector GraphRAG
&lt;/h3&gt;

&lt;p&gt;Using 1,024-dimensional cosine vector embeddings (&lt;code&gt;gsql/vectors.gsql&lt;/code&gt;), the agent searches:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;similar_cases&lt;/code&gt;: 5,565 historical human-analyst case closures.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;similar_agent_cases&lt;/code&gt;: Past investigations conducted by the agent itself.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;policy_search&lt;/code&gt;: Bank fraud manuals and regulatory compliance articles.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 4: Calibrated Probability &amp;amp; Typology Assessment
&lt;/h3&gt;

&lt;p&gt;Rather than relying on uncalibrated model scores or the bank's raw trigger score (which introduces severe confirmation bias), FraudGraph Agent uses a &lt;strong&gt;Gradient Boosting classifier&lt;/strong&gt; trained on 60+ graph-derived structural features.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Validation&lt;/strong&gt;: Grouped 5-fold cross-validation achieves &lt;strong&gt;0.987 ROC-AUC&lt;/strong&gt;, &lt;strong&gt;83% pattern accuracy&lt;/strong&gt;, and &lt;strong&gt;0.80 episode F1&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence Counting&lt;/strong&gt;: The agent counts independent signals (e.g., geographic deviation, device reputation, velocity spike) to ensure decisions rest on corroborating evidence.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 5: Next-Best Action Engine (Rules R1 - R10)
&lt;/h3&gt;

&lt;p&gt;Next-best actions are governed by deterministic rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rule R1 (Single Weak Signal)&lt;/strong&gt;: If fraud probability is elevated but supported by only one signal, &lt;strong&gt;do not freeze the card&lt;/strong&gt;. Action: &lt;code&gt;VERIFY_WITH_CUSTOMER&lt;/code&gt; + &lt;code&gt;CREATE_CASE&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rule R2 (Account Takeover / Multiple Signals)&lt;/strong&gt;: High probability ($p \ge 0.85$) with confirmed device compromise triggers immediate &lt;code&gt;BLOCK_CARD&lt;/code&gt; with &lt;strong&gt;L1 Fraud Analyst&lt;/strong&gt; routing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rule R9 (High Exposure / Undocumented)&lt;/strong&gt;: Exposure exceeding $1,000 or uncataloged fraud syndicates requires mandatory &lt;code&gt;FILE_REPORT&lt;/code&gt; (FinCEN SAR) routed strictly to &lt;strong&gt;L2 Fraud Manager Approval&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rule R10 (Clean Baseline)&lt;/strong&gt;: $p \le 0.15$ with normal baseline routes to &lt;code&gt;CLOSE_NO_FRAUD&lt;/code&gt; and &lt;code&gt;ALLOW_TRANSACTION&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 6: Evidence Verification &amp;amp; Uncertainty Stop Rule
&lt;/h3&gt;

&lt;p&gt;The agent simulates customer communication (recording all assumptions transparently). If the customer confirms they still hold their card and did not authorize the charge, the agent updates its beliefs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fraud probability recalibrates.&lt;/li&gt;
&lt;li&gt;Initial action (&lt;code&gt;VERIFY_WITH_CUSTOMER&lt;/code&gt;) dynamically mutates into &lt;code&gt;BLOCK_CARD&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The stop rule triggers when certainty crosses &lt;strong&gt;$p \ge 0.85$&lt;/strong&gt; or drops to &lt;strong&gt;$p \le 0.15$&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 7: Fact-Grounded Explanation &amp;amp; FinCEN SAR Generation
&lt;/h3&gt;

&lt;p&gt;The LLM generates an executive summary and, when applicable, an official FinCEN SAR narrative. Crucially, the prompt is injected solely with structured, verified graph facts and policy rule outputs. &lt;strong&gt;No hallucinated details can enter the compliance record.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 8: Case Memory Flywheel
&lt;/h3&gt;

&lt;p&gt;The closed investigation is committed to TigerGraph as an &lt;code&gt;AgentCase&lt;/code&gt; vertex, connected to associated cards, devices, and transactions via &lt;code&gt;AC_ON_CARD&lt;/code&gt; and &lt;code&gt;AC_INVOLVES&lt;/code&gt; edges, with 1024-d embeddings stored on the vertex. &lt;strong&gt;The next case investigated immediately benefits from this memory.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Live Case Studies: The Agent in Action
&lt;/h2&gt;

&lt;p&gt;Here is how FraudGraph Agent resolves distinct real-world alert profiles from the 20-case benchmark:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Case ID&lt;/th&gt;
&lt;th&gt;Trigger Alert&lt;/th&gt;
&lt;th&gt;Grounded Graph Findings&lt;/th&gt;
&lt;th&gt;Initial Action&lt;/th&gt;
&lt;th&gt;Final Action&lt;/th&gt;
&lt;th&gt;Approval Route&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HHG-001&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Out-of-region card-present txn&lt;/td&gt;
&lt;td&gt;Billing region 444; cardholder baseline is region 120. Device is clean.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;VERIFY_WITH_CUSTOMER&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;BLOCK_CARD&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;L1 Analyst&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HHG-006&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Velocity alert on eCommerce card&lt;/td&gt;
&lt;td&gt;Coordinated multi-device cluster; $1,906.07 exposure; undocumented ring pattern.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CREATE_CASE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;BLOCK_CARD&lt;/code&gt; + &lt;code&gt;FILE_REPORT&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;L2 Fraud Manager&lt;/strong&gt; (Mandatory SAR)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HHG-018&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High risk score alert (0.89)&lt;/td&gt;
&lt;td&gt;Legitimate IP subnet; frequent historical merchant; normal ticket size ($35.00).&lt;/td&gt;
&lt;td&gt;&lt;code&gt;FLAG_TRANSACTION&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;CLOSE_NO_FRAUD&lt;/code&gt; + &lt;code&gt;ALLOW_TXN&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Automated / Auto-resolve&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Spotlighting HHG-001: Avoiding Customer Friction
&lt;/h3&gt;

&lt;p&gt;In &lt;code&gt;HHG-001&lt;/code&gt;, an out-of-region transaction triggered a medium-risk alert. A naive rule engine would have blocked the card immediately, infuriating a traveling customer. FraudGraph Agent recognized that only a single signal was present:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It issued an initial recommendation: &lt;code&gt;VERIFY_WITH_CUSTOMER&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Upon customer verification confirming the charge was unauthorized, calibrated certainty surged to &lt;strong&gt;0.92&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The recommendation automatically evolved to &lt;code&gt;BLOCK_CARD&lt;/code&gt; with complete audit provenance.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Spotlighting HHG-006: High Exposure &amp;amp; Autonomous SAR
&lt;/h3&gt;

&lt;p&gt;In &lt;code&gt;HHG-006&lt;/code&gt;, exposure totaled &lt;strong&gt;$1,906.07&lt;/strong&gt; across coordinated eCommerce transactions with an undocumented topology. The policy engine automatically elevated the case:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It selected Rule R9.&lt;/li&gt;
&lt;li&gt;It assigned approval strictly to &lt;strong&gt;L2 Fraud Manager&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;It synthesized a complete, audit-ready FinCEN Suspicious Activity Report detailing subject identifiers, transaction hashes, timestamps, and suspicious activity codes.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. The Analyst Dashboard &amp;amp; GRIP GraphRAG Studio
&lt;/h2&gt;

&lt;p&gt;To provide investigators with an exceptional operational experience, we built a modern React dashboard:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Monochrome &amp;amp; Emerald Aesthetic&lt;/strong&gt;: Clean, high-density UI designed for professional fraud analysts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Streamed Investigation&lt;/strong&gt;: Server-Sent Events (SSE) stream investigation stages in real-time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calibrated Uncertainty Gauge&lt;/strong&gt;: Visualizes exact fraud confidence against the $0.15$ and $0.85$ policy action thresholds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action Evolution Panel&lt;/strong&gt;: Explicitly compares Initial Actions against Final Actions, highlighting exactly why and how evidence shifted the decision.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive Subgraph Topology&lt;/strong&gt;: Canvas-based interactive exploration of cards, devices, and connected transactions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GRIP GraphRAG Studio&lt;/strong&gt;: An embedded comparison harness that pits Direct LLM Generation vs. Vector-only RAG vs. Agentic TigerGraph Multi-Hop GraphRAG side-by-side:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pipeline&lt;/th&gt;
&lt;th&gt;Retrieval Method&lt;/th&gt;
&lt;th&gt;Grounding Source&lt;/th&gt;
&lt;th&gt;Hallucination Risk&lt;/th&gt;
&lt;th&gt;Relational Context&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1. Direct LLM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;None (Parametric)&lt;/td&gt;
&lt;td&gt;Internal weights&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Zero&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2. Vector RAG&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cosine similarity&lt;/td&gt;
&lt;td&gt;Flat text chunks&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;None (isolated chunks)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3. Agentic GraphRAG&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Autonomous BFS Traversal&lt;/td&gt;
&lt;td&gt;Multi-hop Graph Topology&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Zero (Cryptographically Verified)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Full Ring Context&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Benchmark Results
&lt;/h2&gt;

&lt;p&gt;Running across the official 20 benchmark test cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;100% Policy Compliance&lt;/strong&gt;: Every recommended action adhered strictly to banking policy rules R1–R10.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Premature Declines&lt;/strong&gt;: Weak-signal alerts were safely held for verification before account restriction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;12.7s Average Latency&lt;/strong&gt;: Full 8-step deep graph investigation, ML scoring, vector retrieval, and SAR generation completed in under 13 seconds per case.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0.987 ROC-AUC&lt;/strong&gt;: Graph-derived feature engineering proved vastly superior to raw transaction scoring.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What We Learned
&lt;/h2&gt;

&lt;p&gt;Building an agentic system on top of a graph database revealed three essential truths:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Graphs are the Ultimate Agent Memory&lt;/strong&gt;: Text embeddings tell you what words sound similar; knowledge graphs tell you who is transacting with whom, what devices they share, and where money is flowing. Combining vector similarity with relational graph topology provides unmatched contextual grounding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic Guardrails are Non-Negotiable&lt;/strong&gt;: In high-stakes finance, you cannot prompt an LLM to "be careful with banking rules." The policy engine must be hardcoded, verifiable, and authoritative; the LLM's job is translation, synthesis, and explanation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Feedback Loop Changes Everything&lt;/strong&gt;: Giving an agent the ability to write its own investigations back into the graph turns static models into compounding intelligence assets. Case #20 was measurably smarter than Case #1 because it stood on the shoulders of the prior 19 investigations.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Reproduce and Explore
&lt;/h2&gt;

&lt;p&gt;The entire repository—including the TigerGraph schema, GSQL queries, training pipelines, benchmark cases, and analyst UI—is open-source and reproducible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/kishore1035/HackerHouse" rel="noopener noreferrer"&gt;kishore1035/HackerHouse&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tech Stack&lt;/strong&gt;: TigerGraph 4.2.5, TigerGraph MCP, Python, FastAPI, React, Vite, OmniRoute, PyTigerGraph.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Built for the TigerGraph Hacker House Goa Challenge.&lt;/em&gt;&lt;/p&gt;

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