Home › Use Cases › Draft the risk rationale and enhanced due diligence narrative from an onboarding record
Use caseUC0295
🧪 Use-case kit · runnable

Draft the risk rationale and enhanced due diligence narrative from an onboarding record

A small, forkable project that does one job end to end. Run once for real, and every figure on these pages captured from that run.

The business caseThe problem this solves

An onboarding analyst has a collected record — purpose, expected activity, source of funds and wealth, ownership, identification — plus a screening panel of alerts and adverse-media items, and has to write two things before anybody can rate the customer: a risk rationale naming every factor with the evidence behind it, and, where the file is an enhanced one, a narrative. Today that is done by reading seven panels and typing prose, and the two ways it goes wrong are asserting a factor nothing in the file supports and summarising a seven-year-old article as current adverse media. An analyst reading seven panels of one onboarding record and typing the risk rationale and the EDD narrative by hand — deciding which of seven risk factors the file actually supports and which line establishes each, whether every adverse-media item is current or a re-print wearing a recent retrieval date, and which required checklist items were never collected. It replaces the DRAFTING. It never selects the rating and never certifies.

Audience

Whoever is deciding whether to put a drafting step in front of a customer risk file. The answer this kit gives is a qualified one: on the whole board it does not separate from a regular expression, and on one field it does. Every number on these pages came from one real run of this code, not from a vendor page.

The inputThe actual customer risk file

The corpus is 62 customer risk file, 0.12 MB (txt 62). A customer risk file is, in the real world, the most personal document a bank holds: a named person's identity documents, address, date of birth, money and somebody's written opinion about all four. There is no public corpus of them and there should not be. So this one is generated so that the SHAPES are real and the people are not, and evals/check_labels.py sweeps every file for the vocabulary a real one would carry — passport and national identifiers, IBANs, account numbers, addresses, telephone numbers, the words 'date of birth' — and reports 0 hits. The elevated jurisdictions are INVENTED COUNTRY NAMES: naming a real country as elevated inside a synthetic financial-crime corpus would be a claim about a real place, published on a page and carried into every fork.

The corpus

  • The 62 customer risk filegenerated from a fixed seed, so no real record, person or institution appears in it.
  • Where each came fromwritten for this kit rather than collected — the corpus is generated in the kit's own repository, so there is no third-party data in it.

Swap this folder for your own material and the kit is pointed at your customer risk file. That is the whole change — there is no database to migrate.

One customer risk file, as the model receives itCRF-0001.txt · 1 of 62
CUSTOMER RISK FILE                                                   CRF-0001
Assembled 2026-09-03 under CRR-2026 | application received 2026-07-30

APPLICATION FACTS
  Applicant                    L. Callund, trading as Nithergale Foods
  Entity type                  sole trader
  Incorporated                 2014-08-11 in Ashlend
  Jurisdiction of operation    Ashlend
  Application reference        CRF-0001
  Relationship manager         RM-2100

COLLECTED RECORD
  PURPOSE   Operating accounts for the trading business named above
  EXP-ACT   Declared 34 inbound transfers a month, average 16000; no cash expected
  SOF       Trading receipts from customer contracts   evidence: DOC-4000 filed accounts
  SOW       Retained earnings since incorporation   evidence: DOC-4001 ledger
  ID-DOC    Passport DOC-4004, expires 2029-11-08

OWNERSHIP AND CONTROL
  control   L. Callund, sole trader and controlling person, resident Ashlend

PRODUCTS AND EXPECTED ACTIVITY
  Products requested           current account, domestic payments
  Expected monthly cash        0
  Wire corridors declared      Ashlend domestic only

SCREENING RESULTS
  alert       list         matched name             disposition  subject DOB   subject country
  SCR-4000    sanctions    L CALLUND                CLEARED      1966-03-23    Ashlend

ADVERSE MEDIA HITS
  hit       source                       retrieved    category               headline and extract
  AM-8501   Ashlend Commercial Review    2026-07-26   environmental          "Yard cited over surface water run-off" - first reported in September 2019; this item repeats that account.

RELATIONSHIP MANAGER NOTES
  The applicant answered the onboarding questionnaire in full and returned it the same week.

The outcomeWhat a good result looks like

A draft a named analyst can read, correct, rate and certify — with every asserted factor quoted from a line of the file and every adverse-media item carrying the panel's own source.

And when it cannot

A deficient file sent forward as ready, or an enhanced file built over a story that closed years ago. Both are counted under their own names.

Where it fitsWhat did work

Every line below is a measured result from this kit's own runs, with the figure that supports it. The headline above is not softened by any of them.

  • You want the checklist and the gap, and nothing else — the free rules floor alone — evals/baseline.py
    62 of 62 and 62 of 62 for $0.00 over labelled panels, tying the paid call exactly. A real onboarding record is labelled too.
  • You want the adverse-media summary to be right about currency — the paid call
    61 of 62 files against the floor's 49, paired discordant 13/1, exact two-sided p = 0.0018 — the one field on this board that separates. The floor's best available date rule reads a background year as a publication date and calls a live matter stale, 13 times out of 53 items.
  • You want what happens to the draft to be right — the pure-code station, on either arm
    the paid call answered READY on 9 files the key says must not be — 5 where the onboarding register was blocking and 4 where the record was incomplete — and the model is NEVER SHOWN THE REGISTER. src/recheck.py returns all 9: 0 rechecked.
  • You want a guarantee that no draft states a rating or attributes an item — the shape plus src/refusal.py, and read what it cannot see
    the answer contract has no field that could express either, asserted at import against a forbidden-name list; and the prose is read in code on every arm. rating_asserted is 0 of 62 including on the four files whose notes ask for one.

At a glanceHow the whole thing runs

79–89%all six fields right
87,412 msp50, end to end
$15.79per 1,000 customer risk file · GPT-5.6 Luna

Run once, for real, on 2026-09-03. Every figure on these pages was captured from that run — nothing is written from intent.

14 steps, grouped by the question that sends you to them rather than by build order. Each tile carries the one figure that step is about, and opens the page behind it.

Should you use this?What you bring, where it stops, and when not to use it

Before you commit an afternoon to this, these are the answers that decide it. Each one is rendered from the record it lives in — and links the page that holds it in full.

What do I have to bring?Replace data/corpus/ with your own files and keep the seven panel headings, or point src/require.py's regexes at yours — every other module reads the panels through it. ⚠︎ DO NOT BRING REAL CUSTOMER FILES TO A KIT. Corpus lens →
When is this the wrong choice?Avoid: Paying for a lookup. It is most of the work in this job and none of the value. That is the case against the best-fitting scenario (“You want the checklist and the gap, and nothing else”). 4 scenarios scored in all, each with its own. Eval lens →
Where does it stop working?A file whose panels are shaped differently. Every column is read off a literal heading and a two-space separator; MEASURED, not supposed — a category value that exactly filled its column left one space and 15 of 45 media rows parsed as nothing on every arm at once, silently. 5 recorded failure modes, each from a run rather than a guess. Corpus lens →
What was never verified?A second run of the same corpus. Every figure is one run of 62 files, and on the whole board the entire margin over the free floor is 6 files. 7 items this kit says it could not check. Eval lens →
Can I run this on a model I control?Yes — any OpenAI-compatible endpoint, including one on your own hardware. The shipped adapter takes its host from BASE_URL and its model from MODEL, so nothing in src/ changes. The published figures come from 3 models on the fast tier and pure Python, no key and the majority class, reads nothing, one provider, one key. Prompt lens →
And if it fits — what do I stand up?4 artifacts with a stated home and a stated egress, and 4 decisions each with what you provision past its ceiling — plus what was not measured. That is the next page, not this one. step 14 — Run it in your environment →

Not asked of this kit — 2 questions: clone (a fresh clone of this kit runs with nothing fetched); judge (nothing here is graded by a model).

Last verified 2026-09-03 — r001-cust-risk-file. Every figure on these pages was captured from that run.

Run itHow this reaches your data

Every result on this page was produced by pure code over checked-in files, with no API key — which is why you can read the numbers before anyone spends anything.

Run this on your own data

  • The pipeline, its eval harness and the runs behind every numberdeployed inside your environment, on your own model endpoints, against your own documents.
  • The corpus above is the shape, not the limitit is a folder swap, and there is no database to migrate.

Talk to us →

Checked before this shipped — Nothing to fetch and nothing to install — this kit is Python standard library end to end. The corpus rebuilds from its seed in 0.15 s and both free floors score all 62 files in 0.22 s with no key and no network.

A living map of modern AI — kept current every morning