Home › Use Cases › Check an issued life policy's data page against the approved application and amendments
Use caseUC0302
🧪 Use-case kit · runnable

Check an issued life policy's data page against the approved application and amendments

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

An underwriter approves a life application — sometimes at a rate class the applicant did not ask for — and the case goes to issue. Between the approval and the printed contract, an applicant may sign an amendment: a smaller face amount, a different billing mode, a rider withdrawn, a later policy date. Somebody then has to hold the printed DATA PAGE against the approved application and every one of those amendments, field by field, before the contract goes out. Today that is an examiner reading two documents side by side under an issue service standard, and the amendment is the part that gets missed: 11 of the 20 amendments in this corpus were recorded only as a SENTENCE in the new business notes, and the amendment register panel on those packets says it has nothing. Reading a printed data page against an approved application and a pile of amendments, field by field, before a contract is released. It does not replace the correction, the reissue or the sign-off — none of the three exists anywhere in this kit.

Audience

A new business examiner working an issue queue, and the new business officer who reads what they produce. The decision this report is for is narrower than it looks: not 'should we buy a model', but 'which HALF of this comparison should a model touch'. Every number on these pages came from one real run of this code, not from a vendor page.

The inputThe actual life new business issue packet

The corpus is 62 life new business issue packet, 0.13 MB (txt 62). It is generated because it has to be. A real issue packet is a joined extract of a carrier's application record, its underwriting decision, its amendment file and a printed contract — it carries the applicant's medical history and their tax identifier, and there is no public version of one anywhere. So the corpus is invented from a fixed seed, and everything about it is arranged to make the READING hard rather than the parsing: both panels are deliberately easy labelled lists, and everything difficult is prose. Seven amendment sentence shapes, of which three say the thing almost literally and four name the field indirectly, put the figure in words or bury it in a longer sentence. Five beneficiary designation shapes, of which one states no number at all and one leaves a share to 'the balance'. Four BAIT packets whose notes discuss an amendment nobody signed. And four TRAP packets where the amendment's own figure is on the data page — on a rider.

The corpus

  • The 62 life new business issue packetgenerated 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 life new business issue packet. That is the whole change — there is no database to migrate.

One life new business issue packet, as the model receives itPIC-0001.txt · 1 of 62
LIFE NEW BUSINESS ISSUE PACKET                                      PIC-0001
Prepared 2026-09-03 under NBI-2026 | Westmarch Life Assurance Company
Life new business issue check

CASE FACTS
  Application number             APP-476120
  Packet reference               PIC-0001
  Underwriting completed         2026-06-09
  Contract issued                2026-07-01

APPLICATION AS APPROVED
  Plan applied for               Beacon Guaranteed Universal
  Face amount applied for        $   350,000.00
  Rate class approved            Table D Non-Tobacco
  Premium mode applied for       Annual
  Modal premium quoted           $     2,793.00
  Requested effective date       2026-06-26
  Owner as applied               Marla A Ashgrove
  Proposed insured               Bryn C Pellowe

RIDERS APPROVED
  Waiver of Premium Rider                    approved at  $         0.00

BENEFICIARY DESIGNATION AS APPLIED FOR
  Primary      Nessa B Rundlecombe            mother        75 pct
  Primary      Gideon N Marchand              father        25 pct

AMENDMENTS BETWEEN APPROVAL AND ISSUE
  none keyed to the amendment register for this case

NEW BUSINESS NOTES
  Requirements were complete at underwriting and no further evidence was ordered after the decision.
  Delivery instructions are the carrier's default: the contract goes to the producer for delivery to the owner.

ISSUED POLICY DATA PAGE
  Policy number                  WLA-2026-120305
  Plan                           Beacon Guaranteed Universal
  Amount of insurance            $   350,000.00
  Rate class                     Table D Non-Tobacco
  Premium mode                   Annual
  Modal premium                  $     2,793.00
  Policy date                    2026-06-26
  Owner of record                Marla A Ashgrove

Abridged — the file continues.

The outcomeWhat a good result looks like

One issue packet in, thirteen graded answers out: one of five verdicts on each of ten checked fields, the packet decision, the exact set of fields a RETURN-TO-ISSUE names, and the line that establishes the first of them, quoted verbatim and locatable at character offsets. On this corpus the paid call returns 62 of 62 packets with all ten verdicts right, 62 of 62 returned-field sets exact, 62 of 62 citations credited and — after NBI-2026 is re-applied in code — 62 of 62 decisions.

And when it cannot

And what it does when it cannot. ⚑ ALL 4 RAW DECISION MISSES ARE PACKETS WHOSE ANSWER IS NOT IN THE PACKET, and that is worth saying before the number is read as a reading failure. On the 4 declined, postponed and withdrawn cases the model answered every one of the ten field verdicts correctly — the data page genuinely matches the approved application — and then said ISSUE-CLEAN, which is what the packet says. The case register, which the model is never given and which src/policy.py reads as data, is the fact that makes them RETURN-TO-ISSUE. src/recheck.py applies NB-1, NB-2 and NB-3 and returns all 4. On the 58 packets where the packet itself carries the answer, the raw decision is 58 of 58. ⚠︎ THE FREE FLOOR DREW 6, and it did so with an advantage that is stated rather than buried: it is handed the case register as structured data and the model is not. Against that, the floor let 6 contracts out that the key says must come back and returned 6 correct contracts that nobody should have looked at again — every one of them a prose amendment or a prose designation it could not read.

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 eight structured fields checked and nothing else — the free rules floor alone — evals/baseline.py::read_packet
    an exact comparison of two labelled panels does plan, amount of insurance, rate class, mode, premium, owner, insured and policy date for $0.00, and a real application record and a real data page ARE labelled lists.
  • Amendments arrive as email, as a scanned signed page, or as a note — the paid call, and read the AMENDMENT-NOT-REFLECTED verdicts
    12 of 12 on the paid arm against the floor's 6. Every one of the floor's misses is a sentence that names the field indirectly, states the figure in words, or buries the change in a longer sentence.
  • Beneficiary designations are typed as free text — the paid call
    the floor fails CLOSED on a designation it cannot parse and returns 6 correct contracts because of it. Two of the five designation shapes here state no percentage in digits at all.
  • You want the packet DECISION and the field list to be defensible — either arm, with src/recheck.py bolted to the front of it
    the decision and the list are never taken from the reply on any arm — they are re-derived in code from the ten verdicts and the case register, and NB-1, NB-2 and NB-3 hold a contract on a case that was never clear to issue whatever the reading said. It moved 4 answers on the paid run.

At a glanceHow the whole thing runs

100%fields all correct pct · 2 runs, no ordering
22,116 msp50, end to end
$15.86per 1,000 life new business issue packet · 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 packets, data/cases.json with your own register rows (one per packet id, carrying case_state from the four states), and data/gold.jsonl with your own key — one row per packet carrying verdicts (ten fields), decision, return_fields, citation and citation_span. ⚠︎ WHAT STOPS BEING TRUE THE MOMENT YOU DO. Corpus lens →
When is this the wrong choice?Avoid: Paying for a string comparison. 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 eight structured fields checked and nothing else”). 4 scenarios scored in all, each with its own. Eval lens →
Where does it stop working?A scanned or photographed data page. Every arm here — the model's reading, the floor's comparison and the independent key check's comparison — rests on two fixed-layout labelled panels with a two-space gutter. 6 recorded failure modes, each from a run rather than a guess. Corpus lens →
What was never verified?How well this reads a HARDER amendment. The corpus saturated: 62 of 62 packets came back with all ten verdicts right, so nothing here bounds the paid arm's accuracy from above and no margin quoted against a different corpus follows from these numbers. 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 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 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-policy-issue-check. 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 renders the whole board on 127.0.0.1:9302 and scores every graded cell offline: the corpus rebuild from seed 20260903, the byte-for-byte check, the filler check, the independent label gate, both free floors over all 806 graded cells, and the replay of every committed model run off its own result file. The 'Check with the model' control is disabled and the page prints why beside it. That is the state tools/shoot_ui.mjs photographed — it forces API_KEY empty before it starts the server.

A living map of modern AI — kept current every morning