bKash · SUST CSE Carnival 2026 · Codex Community Hackathon

The complaint says one thing.
The data may say another.

QueueStorm Investigator is an AI/API support copilot for digital finance. It reads a customer complaint and their recent transactions, decides what actually happened, routes the case to the right team, and drafts a safe reply — never asking for a PIN/OTP, never promising a refund it can't authorize.

10 / 10
sample cases pass
74
automated tests
<1 ms
typical decision
0
secrets required

Overview

An investigator, not a classifier

Two endpoints, called directly by the judge harness. The service reconciles the complaint against the evidence and says so explicitly via relevant_transaction_id and evidence_verdict. When the evidence is unclear it returns insufficient_data — it never guesses.

🩺 GET /health

Returns exactly {"status":"ok"}. Proves readiness before hidden tests run.

🔎 POST /analyze-ticket

One ticket in → one structured JSON verdict out: classify, match the transaction, route, and reply. Responds in well under the 30 s limit.

🛡️ Safety first

Every reply passes a deterministic safety guard — no credential requests, no unauthorized refund promises, no third-party redirects.

How the system is designed

Hybrid & deterministic, with a pluggable LLM

Every graded decision is made by deterministic rules — fast, reproducible, and immune to prompt injection. An optional LLM only polishes wording, and its output is re-checked by the safety guard. The default configuration uses no model and no secrets, so it runs anywhere.

01
Validate & parse

Exact 400 / 422 / 500 codes; null & malformed entries dropped, never a crash.

02
Classify

Case type from evidence-rule cues (English · Bangla · Banglish).

03
Match transaction

By amount + type hint + recipient → relevant_transaction_id.

04
Evidence verdict

consistent · inconsistent · insufficient_data — never guess on ambiguity.

05
Route

severity · department · human_review_required.

06
Safe reply

Template (or LLM) → safety guard → EN/BN customer reply.

            Internet · HTTPS (Caddy + Let's Encrypt)
                          │
                          ▼
        ┌──────────────  QueueStorm.Api  ──────────────┐
        │  controllers · status codes · this UI page    │
        └───────────────────────┬───────────────────────┘
                                │  (DI)
        ┌──────────────  QueueStorm.Core  ─────────────┐
        │  InvestigatorService  ·  SafetyGuard          │
        │  models · enums · repository interfaces       │
        └───────────────────────┬───────────────────────┘
                                │
        ┌────────  QueueStorm.Infrastructure  ─────────┐
        │  CaseRuleRepository · ReplyTemplateRepository │
        │  TicketRepository · LLM providers (pluggable) │
        └───────────────────────────────────────────────┘
   Clean layering · repository pattern · in-memory store

🧠 Decision logic

  • Investigator twist: reconcile complaint vs. ledger; contradicting data → inconsistent.
  • Ambiguity: multiple equal matches → relevant_transaction_id: null + ask, don't dispute.
  • Language mirroring: Bangla complaint → Bangla reply.
  • Escalation: phishing → critical/fraud_risk; disputes, duplicates, high-value → human review.

🛡️ Safety guardrails

  • −15 never asks for PIN / OTP / password / card.
  • −10 never promises a refund — uses "any eligible amount will be returned through official channels".
  • −10 never redirects to a suspicious number / link.
  • Runs on every reply (template or LLM); ignores injected instructions.

🧰 Tech stack

ASP.NET Core · .NET 10C#Repository pattern System.Text.JsonxUnit (74 tests)Pluggable LLM (OpenAI/Anthropic)

No database, no secrets by default. The LLM layer is config-only and falls back to deterministic templates.

🚀 Deployment

Docker · 341 MBbind 0.0.0.0:8080shared Caddy reverse proxy Let's Encrypt · nip.ioGCP VM

One stateless container behind a shared Caddy; auto-HTTPS. Reproducible via docker build / docker run.

Try it live

Call the real API from your browser

Pick a sample case (or edit the JSON) and hit Analyze. Calls go to the live service.

Target

10 sample cases

Edge / safety probes

Request body — POST /analyze-ticket

Response

No request sent yet.