Bretton Lattice

About this project

A working demo of a cross-case intelligence layer for financial crime investigations, built to sit on top of a bank's completed case history.

What it is

Lattice reads a bank's closed case files as one body of evidence instead of one file at a time.

Feed it a batch of investigations that have already been worked and signed off. It pulls out the identifying details, compares every case against every other case, and reports back on the structure it finds sitting between them.

The problem

An investigation can only see what sits inside the case it was opened for. That constraint is reasonable and it is also the blind spot.

Picture six shell companies. Each one has its own clean file. Each one was cleared on its own merits by an analyst who did nothing wrong. They quietly share a registered agent address, or an owner's phone number, or a run of incorporation dates a few days apart. No single review would catch any of that, since no single review has any reason to look at the other five. Proof of a ring lives in the gaps between cases, never inside one of them.

How it works

Claude reads every closed narrative and pulls out structured attributes: addresses, phone numbers, registered agents, beneficial owners, formation dates. The original strings get stored untouched, since an auditor needs to trace a finding back to the exact words in the source file.

Matching then splits in two. Mechanical rules settle whatever canonicalization can settle, so “2810 West Charleston Boulevard, Ste. 84” and “2810 W Charleston Blvd, Suite 84” collapse into one value with no model call at all. Those findings are reproducible byte for byte and cost nothing to defend.

Only genuinely ambiguous pairs reach Claude for a judgement call. That leaves the model doing what it is actually better at: deciding whether “Harborline Logistics” and “Harbourline Logistics”, filed a day apart in the same state, mean something. Cases that link up, directly or through a chain of other cases, group into networks by connected components. Each network gets a written brief.

What the demo shows

The corpus holds 18 fictional businesses that all passed enhanced due diligence. Eleven are genuine controls with nothing in common. Seven carry planted structure across two rings.

The pipeline recovers both rings exactly, at five cases and two cases, and links none of the eleven controls to anything. That second number matters more than the first. A false connection sends an analyst chasing a network that was never there, which is a faster way to lose a compliance team's trust than missing a real one.

The five-case brief makes the point better than any summary of it can: two independent attribute chains converge on the same entities, and either chain on its own would be unremarkable.

Where it fits

This layer never re-opens a case or argues with a disposition. Bretton's agent already handles per-case investigation, applies the bank's written policy, and produces the cited narrative. It does that job well.

Lattice takes that finished output as its raw material. Every investigation a bank completes becomes an input to the next question rather than a document that stops being useful the moment the case closes. The more case history a bank has worked, the more this layer has to work with.

Built with

Next.js and TypeScript on Vercel, Tailwind and shadcn/ui for the interface, Supabase Postgres for storage, the Anthropic API for extraction and reasoning, and a canvas force-directed graph for the network view.

The pipeline runs as a batch job over the whole corpus and writes its results to Postgres. The screens read from that stored output, so a demo never waits on a model call. The scripts and the in-app run button call the same library functions.

Every business, person, address and phone number in this demo is synthetic and fictional. Nothing here reflects a real customer or a real investigation.