About this project
Why I built CaseLens
I built CaseLens to explore how a reviewer handles missing or conflicting evidence.
A result is easier to read when the screen also explains what information produced it. I wanted to make that connection visible, especially when a report arrives late and changes the result.
Try the demoOne case, before and after
A rule checks a set of conditions. This example checks whether the device is unrecognized, the locations differ, and there are at least five attempts. The complete copy meets all three conditions, so its result is Matched. These results describe the example rule; they don't approve or reject a payment.
The copy you review starts with its device report missing. A snapshot is a saved copy of the evidence at one step. Here's what happens as you review that copy and add the missing report.
- 01
The device report is missing
Device MissingLocations differ YesAttempts 5IndeterminateThat means the available evidence cannot tell us whether the rule matches.
- 02
You save a review
"The device report is missing. Request the original observation."
The note keeps the evidence and indeterminate result you saw when you wrote it.
- 03
The report arrives
Device UnrecognizedLocations differ YesAttempts 5MatchedCaseLens saves a new copy with the report. All three conditions now match.
The connection to Canonical
Canonical Labs works on fraud investigations and rules engineering. Its Shield product adds device, network and session observations to payment data. That made evidence review a useful subject for this project: how should the screen explain a result when some of those observations are missing or disagree?
Stripe Radar already documents missing-value conditions such as is_missing(...) and rule testing against historical payments. CaseLens explores a particular review interaction. I built it independently using public
product information and synthetic cases; it has no connection to Canonical's systems.
What I chose to build
The screen puts the complete evidence beside the version you're reviewing. Each condition explains its result and points back to its source observations. You can change the evidence and return to an earlier snapshot.
I kept the demo to twelve synthetic cases and three example conditions so you can follow the reasoning. The conditions illustrate evidence handling; they aren't a tested fraud policy. The tradeoff is deliberate: this project lets you inspect a small review workflow in detail, but it doesn't measure fraud detection accuracy.
For developers
A separate TypeScript evaluator applies the same rules to the same evidence every time. It uses the snapshot's saved evaluation time, so an old example won't change just because you open it tomorrow. SQLite stores the snapshots and review notes.
The interface uses Svelte. The evaluator runs separately from the screen so its evidence rules can be tested directly.