Inspiration
Somewhere right now, someone is opening a letter about a car they never bought.
Their name is not on the loan. Their Social Security number is. A stranger glued that number to a made-up name, a fake pay stub and a borrowed phone number, signed at a dealership, and drove away. The fake person disappears. The real one is left with the damage.
Then that loan gets bundled with 999 others and sold to a bank.
Americans owe $1.71 trillion on car loans. Point Predictive estimates $10.4 billion in auto-lending fraud exposure in 2025, up 13% in a single year. That is about $28.5 million every day.
And it rarely comes one fake person at a time. It comes in rings: six "strangers" from the same dealer who share two phones, one bank account, and the same pay stub with the names swapped.
So why does it slip through? When a bank buys a pool of loans, its team checks a sample, one loan at a time. Each fake borrower looks fine on their own. The ring only shows up when you look at all of them together.
But the obvious fix scared us even more.
"Flag everyone who shares something" sounds smart until you meet the people it catches. Two nurses work at the same hospital. A husband and wife share a phone. Two hundred families live in the same apartment building. To a matching rule, every one of them looks like a fraud ring. To us, they look like our neighbors, our parents, ourselves.
An AI that accuses people is easy to build. We wanted to build one that is fair.
So we stopped asking "Who looks suspicious?" and started asking a harder question:
What if our first suspicion is wrong?
That question became Threadpull.
What it does
Threadpull is an AI investigator for banks that are about to buy a portfolio of car loans. Hand it the loan list, and it answers three questions:
- Which borrowers probably don't exist?
- Which ones only look suspicious, and why are they innocent?
- How much less should we pay?
Meet Hazel, our squirrel detective. She works a 1,000-loan portfolio the way a detective works a corkboard.
** She pulls the threads.** Every loan is a card on the board. When two loans share a phone number, a bank account, a device or a pay stub template, a red thread connects them. A rare match counts a lot: two strangers sharing one bank account is strange. A common match counts a little: forty people working at one big employer is normal. Where someone lives is never treated as a clue on its own.
** She checks before she accuses.** Hazel runs real identity and credit checks through CRS. In our demo, loan #37 fails a live identity check: the Social Security number does not belong to that name.
** She takes threads down.** This is our favorite moment. Two borrowers share an address. Hazel checks it: a 212-unit apartment building. The red thread falls off the board, with the proof pinned right where it was. The connection stays on record. The suspicion is gone.
** She works on a budget.** Every check costs acorns, and she only gets 60. So she has to think like a real investigator: which question is worth paying to answer?
** She asks once, and remembers.** When Hazel truly can't decide, she asks the right person one clear question. Their answer becomes a rule, so next time she clears that kind of lookalike on her own.
** She can't be tricked.** One pay stub in our data hides a message telling the reviewer to approve the loan. It never reaches Hazel as an instruction. It gets logged as an attack and changes nothing.
** She hands over a decision, not a pile of red flags.** The Chief Risk Officer gets one screen: which loans to exclude, which to reprice, buyback demands drafted for the dealer, and a revised bid for the whole deal. A person approves every action. Hazel cannot buy, reject, sign or send anything.
Hazel investigates. A human decides.
How we built it
Our one rule: Claude does the thinking. Code holds the truth.
The investigator (Claude). Hazel runs on Claude Sonnet 5.5 through the Anthropic TypeScript SDK tool runner. She chooses the next check and writes short notes that cite their sources. Claude Haiku 4.5 reads pay stubs our fixed parser can't, and code only accepts a value if it appears on the exact line Haiku cites. Sonnet also drafts the CRO memo, and code keeps only sentences it can tie back to a recorded event.
The guardrails (plain code). The model never sets a status, computes a price, or touches the budget. A budget ledger reserves each check's price and refuses anything that would overspend. Zod validates every tool input and data contract. Code decides every status and can overrule Hazel when the evidence disagrees with her.
The evidence graph. Built with graphology in TypeScript. Loans link when they share a phone, bank account, device, IP address, employer, dealer or document template, and each link is weighted by how rare the shared value is.
Real verification. We call the CRS sandbox API: TransUnion identity verification, the three-bureau credit report, AtData Fraud Finder and AccurateAppend reverse phone. Every result keeps its CRS RequestID for the audit trail. A persona guard builds requests only from the 20 sandbox identities, so nothing else is ever sent. Address and employer reference lookups are simulated, and the board labels them that way every time.
The board. Next.js 16, React 19, React Flow, Tailwind CSS and Motion. Every animation is a row in a Supabase Postgres event log, streamed live over Supabase Realtime or replayed in order. A thread appears because the investigation recorded it. A thread falls because a check explained it. Nothing on the board is decoration.
The data and the proof. A seeded generator (Bun and Faker) builds messy loan portfolios with planted fraud rings and innocent lookalikes, plus a separate answer key that only the evaluator is allowed to read. 868 tests guard the system, including architecture tests that enforce rules like that one. Deployed on Vercel.
Challenges we ran into
1. Teaching a detective when to stop suspecting. Finding shared information was the easy part. Knowing what it means was hard. We had to separate a fact ("these two share an address") from a suspicion ("these two are working together"), and build checks that could withdraw the suspicion without erasing the fact. Sometimes the honest answer is simply "not enough evidence."
2. Letting AI be curious without letting it make things up. We wanted Hazel to act on her own. We could not let her invent a verification result or quietly overspend. So the model proposes, and code enforces. We also hid attack instructions inside loan documents to make sure a pay stub stays evidence, never a boss.
3. Real data is messy. Sandbox identity checks need exact test identities. A credit report can come back "successful" while the file underneath is frozen. Sources disagree. We learned to treat missing or conflicting evidence as uncertainty instead of forcing an answer.
4. Proving we didn't just memorize our own test. Any system looks great on examples its builders already know. So we froze our detection code with a git tag. Then a teammate who wrote zero detection code built a brand-new portfolio with two fraud rings and new innocent lookalikes. We ran Hazel on it exactly once and reported what came out.
Accomplishments that we're proud of
Our proudest result isn't just that Hazel found the fraud. It's that she found it without accusing a single innocent person.
On the held-out portfolio, with frozen detection code:
| Fraud ring members found | Innocent people flagged | Acorns spent | |
|---|---|---|---|
| Threadpull (Hazel) | 12 of 12 | 0 of 65 | 59 |
| Fixed rules, same budget | 12 of 12 | 8 of 65 | 60 |
| Check everything, no budget | 3 of 12 | 0 of 65 | 233 |
The fixed rules found the same ring, but they also accused 8 innocent people. Checking every loan with all four CRS products cost almost 4 times the budget and still found only 3 of 12, because one loan at a time can't see a ring.
Hazel had every ring member marked for investigation after just 17 acorns.
We are just as proud of being honest about the limits. These results come from synthetic portfolios and sandbox identities, not real borrowers. Hazel reached only 1 of 3 special review cases on both portfolios. Every number above is generated by our evaluator from recorded runs, and the full method is in docs/PROOF.md.
What the experiment showed us matters more than any single number: you don't have to choose between catching more fraud and accusing fewer innocent people. Careful investigation does both.
What we learned
We came to this hackathon excited about what autonomous AI can do.
We are leaving thinking much harder about what it should be allowed to do.
We learned that being smart is not just spotting patterns. It is knowing when a pattern matters, looking for the evidence that could prove you wrong, and saying "I don't know" when you don't.
We learned that a good investigation needs more than a confident answer. It needs a trail someone else can follow.
And we learned that restraint is a form of intelligence. An AI that can raise suspicion is useful. An AI that knows when suspicion is no longer fair, and shows you why, is worth building.
What's next for Threadpull
Threadpull is a hackathon prototype, not a production lending system. Next, we want to:
- Test Hazel on larger and more varied portfolios, and measure more budget sizes.
- Add sign-in, long-term audit storage, and more verified data sources.
- Work with lending and compliance experts. Real use would need a permissible purpose under the FCRA and a legal review.
- Make Hazel's learned rules smarter, so one human answer safely carries forward to exactly the right future cases.
Our bigger dream is financial AI that doesn't just do work faster, but makes big decisions fairer, clearer and easier to check.
Because behind every row in a spreadsheet is a real person.
And behind every financial decision should be evidence, not just suspicion.
Find the ring. Protect the innocent. Decide the deal.
Sources: auto loan balance from the Federal Reserve Bank of New York, Q2 2026 Household Debt and Credit Report; fraud exposure from Point Predictive's 2026 Auto Lending Fraud Trends Report. $10.4 billion ÷ 365 days ≈ $28.5 million per day.
Built With
- anthropic
- atdata
- bun
- claude
- claude-haiku
- claude-sonnet
- crs-credit-api
- faker
- graphology
- motion
- next.js
- postgresql
- react
- react-flow
- supabase
- tailwindcss
- transunion
- typescript
- vercel
- zod

Log in or sign up for Devpost to join the conversation.