-
Notifications
You must be signed in to change notification settings - Fork 3
Added the route which will detect fraud using graph db #19
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -310,4 +310,76 @@ | |
| "narrative": "Sanjay Kumar, born 2000-01-14, is a student with a declared annual income of INR 0. His KYC was last updated on 2023-11-02, and he is categorized as a High-risk customer. Account XXXX4401, a savings account, was opened on 2023-12-01. The usual transaction pattern for this account is described as 'Minimal student spending', with an average monthly credit of INR 7,000.\n\nOn 2026-02-10, a series of four high-value transactions, totaling INR 800,000, occurred within approximately one hour, which is inconsistent with the customer's profile and usual account activity.\nAt 12:00:00Z, account XXXX4401 received INR 200,000 via UPI from ACC_P1.\nAt 12:05:00Z, INR 200,000 was transferred via UPI from account XXXX4401 to ACC_P2.\nAt 12:10:00Z, account XXXX4401 received INR 200,000 via UPI from ACC_P2.\nAt 12:20:00Z, INR 200,000 was transferred via SWIFT from account XXXX4401 to DUBAI_NODE_888 in UAE.\n\nThis activity demonstrates a same-day inflow of INR 400,000 and outflow of INR 400,000. A circular fund flow pattern was detected among accounts ACC_P1, XXXX4401, and ACC_P2. The total transaction volume of INR 800,000 significantly exceeds the customer's declared annual income of INR 0 and the expected annual credit based on the average monthly credit of INR 7,000. An alert for 'Mule Funnel Activity' (ALERT_44001) was triggered at 2026-02-10T13:12:00Z, indicating the account is receiving and forwarding funds for multiple entities. The presence of an international transfer to UAE further raises concerns regarding the nature and purpose of these transactions.", | ||
| "recommended_action": "Further investigation and enhanced monitoring of the subject's account and related activities are recommended." | ||
| } | ||
| } | ||
| } | ||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
| ///Prompt | ||
| Generate a highly realistic AML investigation case in STRICT JSON format. | ||
|
|
||
| ⚠️ Output ONLY valid JSON. No explanation text. | ||
|
|
||
| Follow EXACTLY this schema: | ||
|
|
||
| { | ||
| "case_id": "...", | ||
| "generated_at": "...", | ||
| "institution": "...", | ||
| "customer_kyc": { ... }, | ||
| "account_profile": { ... }, | ||
| "alerts": [ ... ], | ||
| "transactions": [ ... ] | ||
| } | ||
|
|
||
| Requirements: | ||
|
|
||
| 1. Make transaction network COMPLEX and GRAPH-DEPENDENT: | ||
| - Use at least 15–25 transactions. | ||
| - Include layering (3–5 hops). | ||
| - Include circular fund routing (money eventually returns to origin via different path). | ||
| - Include split-and-merge structuring (1 amount → split into 3 → merged again). | ||
| - Include pass-through behavior (same amount within 10 minutes). | ||
| - Include cross-border transfers via 2 jurisdictions. | ||
| - Include at least 2 intermediary shell accounts. | ||
| - Include 1 account that acts as both receiver and sender multiple times. | ||
|
|
||
| 2. Make it HARD for rule-based detection: | ||
| - Slightly vary amounts (299,800; 300,200; etc). | ||
| - Spread transactions across multiple hours. | ||
| - Use different channels (NEFT, IMPS, SWIFT, RTGS, Online). | ||
| - Mix legitimate-looking retail deposits with suspicious activity. | ||
| - Add noise transactions that look normal. | ||
|
|
||
| 3. Ensure the suspicious pattern is ONLY clearly visible if someone: | ||
| - Traverses graph paths | ||
| - Detects multi-hop fund flow | ||
| - Detects circular return to origin | ||
| - Detects structuring across accounts | ||
|
|
||
| 4. Customer profile: | ||
| - Medium income individual | ||
| - Declared income much lower than total suspicious volume | ||
| - Realistic Indian KYC details | ||
|
|
||
| 5. Alerts: | ||
| - Add 3–4 alerts: | ||
| - Layering Pattern | ||
| - Structured Deposits | ||
| - Rapid Movement | ||
| - Cross Border Escalation | ||
|
|
||
| 6. Ensure: | ||
| - All accounts referenced in transactions exist in flow | ||
| - Timestamps are chronological | ||
| - At least 1 transaction chain is 4 hops deep | ||
| - Total suspicious flow > 15x declared annual income | ||
|
|
||
| 7. Currency: INR | ||
| 8. Use realistic names and Indian geography. | ||
|
|
||
| Output ONLY JSON. | ||
|
Comment on lines
+322
to
+385
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Prompt template embedded as raw text in a The AML case generation prompt (lines 322–385) is appended as plain text after JSON content, making the entire file invalid JSON. This prompt should live in its own file (e.g., 🧰 Tools🪛 Biome (2.4.4)[error] 322-327: End of file expected (parse) [error] 323-323: unexpected character (parse) [error] 325-325: unexpected character (parse) [error] 325-325: unexpected character (parse) [error] 325-325: unexpected character (parse) [error] 325-325: unexpected character (parse) [error] 333-333: unexpected character (parse) [error] 333-333: unexpected character (parse) [error] 333-333: unexpected character (parse) [error] 334-334: unexpected character (parse) [error] 334-334: unexpected character (parse) [error] 334-334: unexpected character (parse) [error] 335-335: unexpected character (parse) [error] 335-335: unexpected character (parse) [error] 335-335: unexpected character (parse) [error] 336-336: unexpected character (parse) [error] 336-336: unexpected character (parse) [error] 329-337: End of file expected (parse) [error] 336-336: unexpected character (parse) [error] 339-339: String values must be double quoted. (parse) [error] 339-342: End of file expected (parse) [error] 341-341: Missing fraction (parse) [error] 341-341: Minus must be followed by a digit (parse) [error] 342-342: Minus must be followed by a digit (parse) [error] 342-342: End of file expected (parse) [error] 342-342: unexpected character (parse) [error] 342-342: End of file expected (parse) [error] 342-342: String values must be double quoted. (parse) [error] 342-342: unexpected character (parse) [error] 343-343: Minus must be followed by a digit (parse) [error] 343-343: String values must be double quoted. (parse) [error] 343-343: String values must be double quoted. (parse) [error] 343-343: unexpected character (parse) [error] 343-343: End of file expected (parse) [error] 343-343: unexpected character (parse) [error] 343-343: End of file expected (parse) [error] 343-343: String values must be double quoted. (parse) [error] 343-343: unexpected character (parse) [error] 343-343: unexpected character (parse) [error] 344-344: Minus must be followed by a digit (parse) [error] 344-344: String values must be double quoted. (parse) [error] 344-344: String values must be double quoted. (parse) [error] 344-344: String values must be double quoted. (parse) [error] 344-344: String values must be double quoted. (parse) [error] 344-344: unexpected character (parse) [error] 344-344: String values must be double quoted. (parse) [error] 344-344: String values must be double quoted. (parse) [error] 344-344: String values must be double quoted. (parse) [error] 344-344: String values must be double quoted. (parse) [error] 344-344: String values must be double quoted. (parse) [error] 344-344: String values must be double quoted. (parse) [error] 344-344: String values must be double quoted. (parse) [error] 344-344: String values must be double quoted. (parse) [error] 344-344: unexpected character (parse) [error] 344-344: unexpected character (parse) [error] 345-345: Minus must be followed by a digit (parse) [error] 345-345: String values must be double quoted. (parse) [error] 345-345: String values must be double quoted. (parse) [error] 345-345: Minus must be followed by a digit (parse) [error] 345-345: String values must be double quoted. (parse) [error] 345-345: Minus must be followed by a digit (parse) [error] 345-345: String values must be double quoted. (parse) [error] 345-345: String values must be double quoted. (parse) [error] 345-345: unexpected character (parse) [error] 345-345: End of file expected (parse) [error] 345-345: String values must be double quoted. (parse) [error] 345-345: unexpected character (parse) [error] 345-345: String values must be double quoted. (parse) [error] 345-345: String values must be double quoted. (parse) [error] 345-345: End of file expected (parse) [error] 345-345: unexpected character (parse) [error] 345-345: String values must be double quoted. (parse) [error] 345-345: String values must be double quoted. (parse) [error] 345-345: unexpected character (parse) [error] 345-345: unexpected character (parse) [error] 346-346: Minus must be followed by a digit (parse) [error] 346-346: String values must be double quoted. (parse) [error] 346-346: String values must be double quoted. (parse) [error] 346-346: Minus must be followed by a digit (parse) [error] 346-346: String values must be double quoted. (parse) [error] 346-346: String values must be double quoted. (parse) [error] 346-346: unexpected character (parse) [error] 346-346: String values must be double quoted. (parse) [error] 346-346: String values must be double quoted. (parse) [error] 346-346: String values must be double quoted. (parse) [error] 346-346: End of file expected (parse) [error] 346-346: String values must be double quoted. (parse) [error] 346-346: unexpected character (parse) [error] 346-346: unexpected character (parse) [error] 347-347: Minus must be followed by a digit (parse) [error] 347-347: String values must be double quoted. (parse) [error] 347-347: String values must be double quoted. (parse) [error] 347-347: Minus must be followed by a digit (parse) [error] 347-347: String values must be double quoted. (parse) [error] 347-347: String values must be double quoted. (parse) [error] 347-347: String values must be double quoted. (parse) [error] 347-347: End of file expected (parse) [error] 347-347: String values must be double quoted. (parse) [error] 347-347: unexpected character (parse) [error] 348-348: Minus must be followed by a digit (parse) [error] 348-348: String values must be double quoted. (parse) [error] 348-348: String values must be double quoted. (parse) [error] 348-348: String values must be double quoted. (parse) [error] 348-348: End of file expected (parse) [error] 348-348: String values must be double quoted. (parse) [error] 348-348: String values must be double quoted. (parse) [error] 348-348: String values must be double quoted. (parse) [error] 348-348: unexpected character (parse) [error] 349-349: Minus must be followed by a digit (parse) [error] 349-349: String values must be double quoted. (parse) [error] 349-349: End of file expected (parse) [error] 349-349: String values must be double quoted. (parse) [error] 349-349: String values must be double quoted. (parse) [error] 349-349: String values must be double quoted. (parse) [error] 349-349: String values must be double quoted. (parse) [error] 349-349: String values must be double quoted. (parse) [error] 349-349: String values must be double quoted. (parse) [error] 349-349: String values must be double quoted. (parse) [error] 349-349: String values must be double quoted. (parse) [error] 349-349: String values must be double quoted. (parse) [error] 349-349: String values must be double quoted. (parse) [error] 349-349: unexpected character (parse) [error] 351-351: End of file expected (parse) [error] 351-351: Missing fraction (parse) [error] 351-351: String values must be double quoted. (parse) [error] 351-351: String values must be double quoted. (parse) [error] 351-351: String values must be double quoted. (parse) [error] 351-351: String values must be double quoted. (parse) [error] 351-351: String values must be double quoted. (parse) [error] 351-351: Minus must be followed by a digit (parse) [error] 351-351: String values must be double quoted. (parse) [error] 351-351: String values must be double quoted. (parse) [error] 351-352: End of file expected (parse) [error] 352-352: Minus must be followed by a digit (parse) [error] 352-352: unexpected character (parse) [error] 352-352: End of file expected (parse) [error] 352-352: End of file expected (parse) [error] 352-352: End of file expected (parse) [error] 352-352: unexpected character (parse) [error] 352-352: End of file expected (parse) [error] 352-352: End of file expected (parse) [error] 352-352: End of file expected (parse) [error] 352-352: unexpected character (parse) [error] 352-352: String values must be double quoted. (parse) [error] 352-352: unexpected character (parse) [error] 352-352: unexpected character (parse) [error] 353-353: Minus must be followed by a digit (parse) [error] 353-353: String values must be double quoted. (parse) [error] 353-353: String values must be double quoted. (parse) [error] 353-353: String values must be double quoted. (parse) [error] 353-353: String values must be double quoted. (parse) [error] 353-353: String values must be double quoted. (parse) [error] 353-353: unexpected character (parse) [error] 354-354: Minus must be followed by a digit (parse) [error] 354-354: String values must be double quoted. (parse) [error] 354-354: String values must be double quoted. (parse) [error] 354-354: String values must be double quoted. (parse) [error] 354-354: unexpected character (parse) [error] 354-354: String values must be double quoted. (parse) [error] 354-370: End of file expected (parse) [error] 354-354: unexpected character (parse) [error] 354-354: unexpected character (parse) [error] 355-355: Minus must be followed by a digit (parse) [error] 355-355: Minus must be followed by a digit (parse) [error] 355-355: unexpected character (parse) [error] 356-356: Minus must be followed by a digit (parse) [error] 356-356: unexpected character (parse) [error] 358-358: Missing fraction (parse) [error] 359-359: Minus must be followed by a digit (parse) [error] 360-360: Minus must be followed by a digit (parse) [error] 360-360: Minus must be followed by a digit (parse) [error] 361-361: Minus must be followed by a digit (parse) [error] 362-362: Minus must be followed by a digit (parse) [error] 364-364: Missing fraction (parse) [error] 365-365: Minus must be followed by a digit (parse) [error] 366-366: Minus must be followed by a digit (parse) [error] 367-367: Minus must be followed by a digit (parse) [error] 369-369: Missing fraction (parse) [error] 370-370: Minus must be followed by a digit (parse) [error] 370-370: End of file expected (parse) [error] 370-370: unexpected character (parse) [error] 370-370: End of file expected (parse) [error] 370-370: String values must be double quoted. (parse) [error] 370-379: End of file expected (parse) [error] 371-371: Minus must be followed by a digit (parse) [error] 372-372: Minus must be followed by a digit (parse) [error] 373-373: Minus must be followed by a digit (parse) [error] 374-374: Minus must be followed by a digit (parse) [error] 376-376: Missing fraction (parse) [error] 377-377: Minus must be followed by a digit (parse) [error] 378-378: Minus must be followed by a digit (parse) [error] 379-379: Minus must be followed by a digit (parse) [error] 379-379: End of file expected (parse) [error] 379-379: String values must be double quoted. (parse) [error] 379-379: String values must be double quoted. (parse) [error] 379-379: String values must be double quoted. (parse) [error] 379-379: End of file expected (parse) [error] 379-379: String values must be double quoted. (parse) [error] 379-379: String values must be double quoted. (parse) [error] 380-380: Minus must be followed by a digit (parse) [error] 380-380: String values must be double quoted. (parse) [error] 380-380: String values must be double quoted. (parse) [error] 380-380: String values must be double quoted. (parse) [error] 380-380: unexpected character (parse) [error] 380-380: End of file expected (parse) [error] 380-380: String values must be double quoted. (parse) [error] 380-380: String values must be double quoted. (parse) [error] 380-380: String values must be double quoted. (parse) [error] 380-380: String values must be double quoted. (parse) [error] 382-382: End of file expected (parse) [error] 382-382: Missing fraction (parse) [error] 382-382: String values must be double quoted. (parse) [error] 382-385: End of file expected (parse) [error] 383-383: Missing fraction (parse) [error] 383-383: unexpected character (parse) [error] 385-385: unexpected character (parse) |
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sensitive-looking data in test fixtures — confirm it is fully synthetic.
This file contains PAN numbers, Aadhaar (last 4), full names, DOBs, and addresses. Even for test data, ensure none of these correspond to real individuals. Consider adding a comment at the top of the file stating the data is entirely fictitious.
🧰 Tools
🪛 Biome (2.4.4)
[error] 458-535: End of file expected
(parse)