-
-
FraudGraph dashboard showing the Jac Agent Walkers panel — all four walkers for account ACC-4CE8E824.
-
Account Risk Distribution scatter plot showing fraud scores across 17 accounts, color-coded by risk level (low → critical).
-
Transaction Feed showing high-confidence flagged transactions with reasons like geo anomaly, velocity spike, and device mismatch
💡 Inspiration
Fraud detection today is mostly reactive — rules fire after the damage is done. We wanted to build something that thinks like a fraud investigator: one that follows the money, spots patterns across accounts, and makes judgment calls autonomously. When we discovered Jac's Object Spatial Programming model, it clicked — walkers traversing a graph are investigators walking a case file.
🔨 How We Built It
FraudGraph is built around four Jac walkers that traverse a live transaction graph, each with a specialized role:
| Walker | Role |
|---|---|
FraudDetectionWalker |
ML-scores every transaction using Isolation Forest |
AnomalyPatternWalker |
Detects velocity spikes, geo anomalies, merchant risk |
EscalationWalker |
Uses by llm() to recommend block / freeze / verify |
SynthesisWalker |
Uses by llm() to write an executive fraud report |
The backend is Python FastAPI with SQLAlchemy + SQLite, exposing walker endpoints that the React + Tailwind frontend calls in real time. The walkers genuinely traverse account → transaction nodes, collecting evidence before making decisions — this is not a UI wrapper around a single API call.
🚧 Challenges We Faced
- Jaclang versioning — the
by llm()syntax and walker APIs evolved rapidly; getting a stable version compatible with Python 3.10 on Windows took significant debugging. - Graph ↔ REST bridge — wiring Jac walker state back into FastAPI responses
cleanly required building a custom
jac_runner.pybridge layer. - Realistic fraud simulation — generating seed data that actually exercises all four walkers meaningfully (velocity attacks, cross-border anomalies, merchant clusters) took careful design.
📚 What We Learned
- Object Spatial Programming is a genuinely different way to think about agentic AI — agents live in the graph rather than being called externally.
by llm()makes LLM-powered decisions feel like first-class language features, not bolted-on API calls.- Building a graceful simulation fallback was the right call — it kept the demo reliable regardless of environment issues.
🚀 What's Next
- Swap SQLite for a native graph database (Neo4j or Memgraph)
- Add streaming walker logs via WebSockets for real-time UI updates
- Extend
EscalationWalkerwith multi-step human-in-the-loop review flows
Built With
- css
- fastapi
- forest
- isolation
- jac
- jaclang
- python
- react
- recharts
- scikit-learn
- sqlalchemy
- sqlite
- tailwind
- uvicorn
- vite
Log in or sign up for Devpost to join the conversation.