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.
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-filerates 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
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.
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.




