Home › Use Cases › Extract an entity client's beneficial ownership chain and flag what the KYC form misses
Use caseUC0300
🧪 Use-case kit · runnable

Extract an entity client's beneficial ownership chain and flag what the KYC form misses

A small, forkable project that does one job end to end. Run twice for real over the same set, and every figure on these pages captured from those runs.

The business caseThe problem this solves

A wealth manager opens an account for an ENTITY — a holding company, a family trust, a limited partnership — and has to write down the natural people behind it before anything else happens. What arrives is a pack: a formation excerpt, one or more ownership certificates, an operating agreement or trust deed with ownership and control stated in prose, and the KYC form the client filled in. Nobody in that pack has done the arithmetic. An onboarding analyst composes the chain out of four documents by hand, multiplies percentages through every intermediate entity, and then compares the answer with what the client declared — which is exactly where the commonest defect in the file comes from: a stake in a holding company written on the form as though it were a stake in the client entity. Composing an ownership chain out of four documents by hand and reconciling it against the KYC form, person by person, before a beneficial ownership record is written.

Audience

The onboarding or client-lifecycle analyst who has to produce the beneficial ownership record, and the person who reviews it. The decision they are making is whether the pack ESTABLISHES the chain — not whether the client is acceptable, which is a different job, a different kit (cust-risk-file) and a different set of rules. Every number on these pages came from one real run of this code, not from a vendor page.

The inputThe actual entity client onboarding packs

The corpus is 62 entity client onboarding packs, 0.13 MB (txt 62). It is generated because it has to be. The fields that make a real beneficial ownership review hard — a name, a date of birth, an identity document, an address — are exactly the fields nobody may publish about a real person, and a real onboarding pack is that file. Generating it is what lets the whole corpus, the key and both floors ship. It also lets the answer key be DERIVED: every pack is built as a graph first and rendered second, so a corpus edit cannot leave a stale label behind.

The corpus

  • The 62 entity client onboarding packsgenerated from a fixed seed, so no real record, person or institution appears in it.
  • Where each came fromNowhere. Every client entity, holding entity, trust, partnership, natural person, jurisdiction, registered office, filing reference, unit count, percentage, agreement clause and KYC form entry is invented. See data/SOURCES.md.

Swap this folder for your own material and the kit is pointed at your entity client onboarding packs. That is the whole change — there is no database to migrate.

One entity client onboarding pack, as the model receives itUBO-0001.txt · 1 of 62
ENTITY CLIENT ONBOARDING PACK                                        UBO-0001
Prepared 2026-09-03 under BOR-2026 | beneficial ownership threshold 25.00 pct

PACK FACTS
  Client entity                Verrand Capital Partners LP
  Entity type                  limited partnership
  Relationship                 new custody and execution relationship
  Pack reference               UBO-0001
  Documents enclosed           formation excerpt, 1 ownership certificate(s), agreement or deed excerpt, KYC form

FORMATION DOCUMENT (excerpt)
  Entity name                  Verrand Capital Partners LP
  Jurisdiction of formation    Calmoor
  Formed                       2015-01-28
  Registered office            Suite 880, 7 Semmering Way
  Filing reference             ES-LP-171889

OWNERSHIP CERTIFICATE - Verrand Capital Partners LP
  holder                                   kind      units        of total     pct
  Tobias Achterberg                        person      64,000       100,000   64 pct
  Lucienne Harrowby                        person      21,000       100,000   21 pct
  Verity Beaumaris                         person       5,000       100,000    5 pct
  Juna Mordaunt                            person      10,000       100,000   10 pct

AGREEMENT OR DEED (excerpt)
  7.3   Standing note: a certificate showing 100 units of 400 shows a twenty-five per cent holding in that entity and not in the client entity.
  8.2   Ottilie Rothstein is appointed Manager of the Company with authority to direct its affairs, and holds no interest in it.

KYC FORM AS FILED BY THE CLIENT
  declared beneficial owners
    Tobias Achterberg                         64.00 pct
    Verity Beaumaris                           5.00 pct
  declared control persons
    none declared

The outcomeWhat a good result looks like

One pack in; one row per natural person the pack names out — the effective interest in the client entity to two decimal places, whether a document names them in a control role, a BOR-2026 verdict, and one line of the pack copied verbatim that names them. The chain is multiplied along each route and summed across routes, and where the pack documents no owner for an intermediate entity the answer is UNKNOWN rather than zero.

And when it cannot

And what it does when it cannot. On 3 of 62 packs the reply was cut off at the output ceiling and NOTHING came back — not a partial answer, not a shorter list, nothing. The board draws that pack with every person marked NOT RETURNED and the beneficial owners painted red, and the run counts all of them wrong. That is the honest shape of this kit's failure: it is not a wrong percentage, it is an empty answer, and a pipeline that did not check finish_reason would file an empty beneficial ownership record without noticing.

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 to know whether a model beats free code on YOUR onboarding packs — run both floors first, before buying a single call
    On this corpus the rules floor gets 34 of 62 packs entirely right for $0.00. The margin the paid call publishes is a margin over THAT, and it is earned on prose the expressions cannot read — spelled-out shares, nominee clauses, contingent interests and resigned officers. If your certificates carry the whole chain, the floor is most of your answer.
  • Your certificates are a fixed-layout table and the whole chain is on them — the free rules floor
    It composes the chain exactly and costs nothing. 316 of 343 people right on the arithmetic with no key and no network.
  • Ownership or control lives in the agreement or deed — the paid call
    This is where the whole margin is. Spelled-out percentages, an implicit balance, a nominee holding and a contingent interest are four different sentences and each one needs a different expression; the call reads all four.
  • You want a risk rating, an EDD file or a screening result — a different kit
    cust-risk-file rates a customer and builds an enhanced-due-diligence file. This kit reads an ownership chain and has no field that could express a rating, a screen, an approval or a filing.

And where nothing here is good enough:

  • You want an LLM judge over the answers — do not
    Every grader here is pure Python and exact: an integer comparison in basis points, a boolean, an enum and a character-overlap locator. Re-scoring a committed run costs $0.00 and needs no provider.

At a glanceHow the whole thing runs

95–98%pack all correct pct · 2 runs, no ordering
121,461 msp50, end to end
$55.18per 1,000 entity client onboarding packs · Gemini 3 Flash

Run twice over the same set, for real, the last on 2026-09-03. Every figure on these pages was captured from those runs — 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/*.txt with your own packs and data/packs.json with your own KYC form entries, then write data/gold.jsonl yourself — the key here is generated alongside the packs and there is no way to derive one for documents the generator did not build. ⚠︎ WHAT STOPS BEING TRUE THE MOMENT YOU DO. Corpus lens →
When is this the wrong choice?Avoid: Quoting this kit's headline without the floor beside it. That is the case against the best-fitting scenario (“You want to know whether a model beats free code on YOUR onboarding packs”). 5 scenarios scored in all, each with its own. Eval lens →
Where does it stop working?A register of members that is not a fixed-layout table — a scan, a PDF, a spreadsheet with merged cells. The free floor's expressions die first and hardest. 8 recorded failure modes, each from a run rather than a guess. Corpus lens →
What was never verified?A THIRD MODEL. Two identical runs on ONE tier were fired. 8 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 1 model on the fast tier, one provider, one key. Prompt lens →
And if it fits — what do I stand up?8 artifacts with a stated home and a stated egress, and 3 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-ubo-extract. 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 — A clean checkout with no key configured rebuilds the corpus, re-derives the answer key, runs both free floors, runs the label gate at 0 problems, renders the whole board on 127.0.0.1:9300 and replays every committed run. Nothing in that list makes a network call or needs a credential.

A living map of modern AI — kept current every morning