A human-in-the-loop agent system for consumer-complaint operations

Fifteen days to answer.

A company named in a CFPB complaint has 15 days to answer, and the regulator sees every late or careless reply. In Recourse, an agent reads a public CFPB complaint, routes it, pulls the precedent and drafts the response. A person approves before anything resolves.

17,355,295public CFPB complaints
Every resolvewaits on a person
No loginpublic sandbox
Open the public sandbox →

The sandbox runs the same app over its own small database of real public cases. The first load can take about half a minute while the server wakes up.

Recourse capstone demo, 3 minutes.

The moment

Reviewers write those replies by hand.

Every reply goes on the record, against a regulatory clock. Recourse gives each reviewer a cited first draft, a case assistant that looks things up and proposes changes, and a queue ordered by that clock.

It is Alfonso's capstone build for DataExpert.io's Databricks AI Data Engineer Boot Camp, and it runs on Databricks. Capstone submitted; final grade and certificate pending.

The mechanism

He put the approval in the database.

01 · The complaints

Every public CFPB complaint, cleaned in Spark into bronze, silver and gold tables. Part of the written narratives, plus CFPB guidance documents, is split and indexed so the agent can search them and cite what it used.

Spark · Delta · Databricks

02 · The agent

For each case it finds similar past complaints and the guidance that applies, then writes a draft with its sources listed underneath. On a case, the assistant can look things up and propose a revised reply or an escalation. A proposal changes nothing until the reviewer confirms it.

cited drafts · proposals wait for Confirm

03 · The human gate

A case cannot reach resolved unless an approval for that case names one of its own final responses. That rule lives in the database as a trigger, and a test fails if anyone removes it. The role the agent runs under cannot write an approval.

database trigger · agent cannot approve
A case page in the Recourse public sandbox. A red banner reads Blocked by database policy, with the database's own message: case 222 cannot resolve without an approval on a final response. Below it, the public CFPB complaint, the agent's draft reply, the past complaints and CFPB guidance it cited, and the Approve, Reject and Escalate controls.
The public sandbox, 14 October 2026. Demonstrate the gate tried to resolve this case with no approval, and the database refused.
Stated plainly

Real, replayed, and pending.

Real. The complaints, every one a public CFPB record with the narratives scrubbed by the CFPB. The agent's drafts and the sources it cited. Every database write, including the refusal above.

Replayed. The arrival timing. Complaints enter the queue on a replayed clock, and the product labels it as a replay. In the sandbox the clocks run from its last reset, so a case can already show as breached.

Pending. The boot camp's final grade and certificate. The capstone is submitted.

The staffing figures in the app's capacity view rest on assumed handle times. They are left off this page, because they would read as a result.

The receipt
17,355,295

Public complaints, every one in the database.

Built on 17,355,295 public complaints, with the arrival timing replayed and labelled as a replay. A capstone build for DataExpert.io's Databricks AI Data Engineer Boot Camp. The sandbox needs no login.

See it running

Open the sandbox.

The queue, a case with its cited draft, and the approval step. Press Demonstrate the gate on a case and the database refuses the resolve. The full system runs in a Databricks workspace behind a login, and Alfonso walks through it on request.

Open the public sandbox → Request a walkthrough → All builds →