Home › Use Cases › Check one immunization record against the schedule in force, never who may attend
Use caseUC0319
🧪 Use-case kit · runnable

Check one immunization record against the schedule in force, never who may attend

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

Every term, a school district has to look at each enrolled student's immunization record and say whether it satisfies the schedule in force. The part that is quick is seeing whether a series is on the card at all. The part that takes the time, and the part that gets skipped when enrolment week is tomorrow, is the arithmetic INSIDE each series: whether a dose given three days before its interval was up still counts, whether the first dose was given before the minimum age and therefore counts for nothing and starts no clock, whether two rows on the same date are two doses or one, whether the row somebody annotated was actually given. And one requirement depends on the student rather than the record — a booster required of grades 7 to 12 and of nobody else — so a reviewer who ticks the same five boxes on every card raises a false gap on every younger pupil and misses a real one on every older one. The manual pass over an immunization exception export: reading each card series by series against the schedule, doing the date subtraction by hand or by eye, checking the register for an exemption and whether it has expired, and comparing the result with what the last review recorded. It replaces no decision — whether a student may attend, whether an exemption is granted and whether anything follows from an outstanding series all stay with the district.

Audience

The registrar or health clerk in a school district who works the immunization exception list, and the enrolment office that reads the resulting rows. It is NOT for a nurse, a clinician or a parent, it answers no clinical question, and nothing it produces decides whether a child goes to school. Every number on these pages came from one real run of this code, not from a vendor page.

The inputThe actual review packs

The corpus is 66 review packs, 0.09 MB (txt 66). A real cumulative folder cannot be published and should not be reduced. It is a record about a named child's health, held by a school, and the whole point of this use case is that the reading can be done without any of that reaching a model: what the arithmetic needs is a series, a set of dates and a date of birth. This corpus is built to make that separation VISIBLE rather than to assert it — there is no name in it to leave out. Eleven families, each bending exactly one rule, across three card layouts: a district export (33 packs), a transferred paper record (22) and a transferred card keyed as prose (11). 34 packs carry a distractor note — 17 asserting the series are complete or an exemption is being processed, 9 quoting a rule of the schedule where it does not apply, and 8 instructing somebody to exclude the student. --check-notes rebuilds every pack with the notes removed and asserts 0 of the 66 answers move.

The corpus

  • The 66 review packsgenerated from a fixed seed, so no real record, person or institution appears in it.
  • Where each came fromGENERATED FROM A FIXED SEED — there is no source. All 66 packs, the district register and the answer key are produced by tools/build_corpus.py from random.Random(20260908). NO REAL STUDENT, FAMILY, CLINIC, SCHOOL, DISTRICT OR IMMUNIZATION RECORD WAS READ, QUOTED OR PARAPHRASED to produce any of it, and there is no student name anywhere in this kit — a pack identifies a student by an invented id and nothing else. A date of birth IS on every pack, deliberately: the schedule's minimum age is (dose date minus date of birth) and removing it would remove the arithmetic. Every one is generated. SIS-2026 itself is invented and is not any state's schedule.

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

One review pack, as the model receives itIM-0001.txt · 1 of 66
IMMUNIZATION COMPLIANCE REVIEW PACK
Pack IM-0001   review run 2026-09-08   schedule SIS-2026 in force from 2026-08-01

STUDENT FACTS
  Student id             S-1001
  Grade at this review   8
  Date of birth          2013-04-08
  Enrolled               2023-08-14
  Record source          district SIS export

IMMUNIZATION RECORD ON FILE
  series  dose  administered  site / lot                  note
  DTAP    1     2013-06-03    clinic 12 / L4581
  IPV     1     2013-06-11    travel unit 2 / L6120
  IPV     2     2013-07-14    pediatric group 88 / L6120
  DTAP    2     2013-07-18    clinic 07 / L6120
  IPV     3     2013-08-27    clinic 41 / L2201
  DTAP    3     2013-09-29    pediatric group 88 / L6120
  IPV     4     2013-10-29    pediatric group 88 / L2318
  DTAP    4     2013-11-30    travel unit 2 / L5107
  DTAP    5     2014-01-24    county unit 3 / L4402
  MMR     1     2014-04-21    travel unit 2 / L7008
  VAR     1     2014-04-27    clinic 07 / L2201
  MMR     2     2014-06-25    clinic 41 / L2318
  VAR     2     2014-08-20    travel unit 2 / L4581
  TDAP    1     2023-05-09    travel unit 2 / L5533

DISTRICT REGISTER, AS HELD OUTSIDE THIS PACK
  Record state           on_file
  Exemption recorded     none

LAST REVIEW
  Reviewed on            2026-08-11
  Status recorded then   compliant

OFFICE NOTES
  Records clerk: duplicate cumulative folder merged; no immunization document was added.
  Front office note: the family says the missing card is in the post and everything was given on time at the previous district.

The outcomeWhat a good result looks like

One row per student per review run: the doses that count in each required series, the series outstanding, the earliest date a further dose would count, the status under the dated schedule, the change against the status recorded at the last review, and one of three actions. The row is what a registrar reads and signs; the kit signs nothing.

And when it cannot

The failure that costs a child something is a gap read as clear — a student with an outstanding series whose row says NO-ACTION and never reaches the registrar's list. It happened 20 times in 66 on the scored run and 16 times after the pure-code recheck. The free rules floor did it twice. The failure in the other direction — a student listed who is not short — happened 10 times raw and 5 after the recheck, against the floor's 5.

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.

  • Your immunization records arrive as a fixed-layout export from a student information system — the free rules floor, and do not buy a model at all
    89.4 pct on all six fields for $0.00 against the model's 27.3, and every one of its seven errors is an annotated row rather than an arithmetic one
  • Your records arrive as scanned or hand-keyed cards in layouts nobody controls — measure before you buy
    this kit measures three layouts it wrote itself, and the model was WORSE on the prose one (3 of 11) than on the tables (15 of 55). A layout argument for a reader is not supported by anything here
  • What you actually need is the annotation read, not the arithmetic done — a model on that field alone
    it is the only place the reader beat the floor, and it is 5 packs of 66. Split the job: parse and compute in code, ask a model only what an annotation says
  • You need the status decided by policy rather than by whatever the model returned — this kit's architecture, whichever arm feeds it
    src/policy.py derives the outstanding list, the status, the change and the action from a count and the register. It moved the model arm 7.5 points and it is why 0 of 82 replies could produce an action outside the three

At a glanceHow the whole thing runs

27%pack all six correct pct
1,573 msp50, end to end
$0.39per 1,000 review packs · gpt-5-6-luna

Run once, for real, on 2026-09-08. 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/*.txt with your own packs in the same section order and regenerate the key from your own structure, or replace data/students.json and let tools/build_corpus.py render from it. EVERY MEASURED NUMBER ON THIS PAGE STOPS BEING TRUE, and two of them stop being comparable. Corpus lens →
When is this the wrong choice?Avoid: Assuming that 89.4 transfers. It was measured on a corpus whose layouts the same author wrote; run the floor on YOUR export before believing any of it. That is the case against the best-fitting scenario (“Your immunization records arrive as a fixed-layout export from a student information system”). 4 scenarios scored in all, each with its own. Eval lens →
Where does it stop working?A CARD WRITTEN IN A LAYOUT THIS KIT HAS NOT SEEN. Three ship. 6 recorded failure modes, each from a run rather than a guess. Corpus lens →
What was never verified?WHETHER THE MODEL IS WORTH BUYING FOR THIS JOB AT ALL. On this corpus it is not, and this page says so rather than burying it: 27.3 pct raw and 34.8 pct rechecked against a free floor's 89.4. 9 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?5 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-08 — r001-immunization-status. 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 byte for byte, re-derives the answer key without importing src/, scores both free floors, replays the committed scored run and the adversarial arm from their result files, and renders the whole board. pip install -r requirements.txt installs nothing. The only thing a key buys is a new call.

A living map of modern AI — kept current every morning