Home › Use Cases › Reconcile one student-section enrollment across the SIS, the LMS and billing
Use caseUC0248
🧪 Use-case kit · runnable

Reconcile one student-section enrollment across the SIS, the LMS and billing

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

A registrar's office holds one enrollment in three places: the SIS where the registration is entered, the LMS where the course-site roster lives, and the billing system that assesses tuition against the credit hours. Nightly integrations move rows between them and people edit all three by hand. At census the three have to agree, because the count that leaves the institution is reported federally. Today somebody opens three systems in three tabs, per row, and the queue is worked in the order it happens to be sorted in. The per-row hand comparison of three systems and the queue triage in front of a census certification — not the determination itself, which stays with a named registrar staff member, and not the correction, which happens in the system that owns the record.

Audience

A registrar deciding whether a reconciliation pack can be trusted to put every mismatch in front of a named staff member before they certify a census count personally — and a systems lead deciding whether the reading is worth paying a model for when a regular expression already does the arithmetic. Every number on these pages came from one real run of this code, not from a vendor page.

The inputThe actual reconciliation packets

The corpus is 64 reconciliation packets, 0.14 MB (txt 64). A real registrar's reconciliation extract cannot be published by anybody, ever. Every row is a student education record under FERPA, and the fields that make a reconciliation legible — which section, which credit value, which system, which staff member resolved it — are exactly the fields that identify the student and the person who worked the row. Redaction does not help: a redacted reconciliation packet is not a reconciliation packet. So the corpus is invented and the report says what that costs — the distribution of discrepancy classes was CHOSEN, not observed. Nobody is named, no institution is named, and there is no academic-performance, financial-aid, disability or disciplinary information in it at all; check_labels sweeps for that vocabulary and reports 0 hits.

The corpus

  • The 64 reconciliation packetsunder its source's terms — Generated. tools/build_corpus.py, seed 20260901, standard library only, re-runnable to the byte.
  • 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 reconciliation packets. That is the whole change — there is no database to migrate.

The outcomeWhat a good result looks like

One row per enrollment: the credit-hour difference to the hundredth, one of eight discrepancy classes with the line that establishes it, what the three values did, and whether the row goes to a named registrar staff member. Plus, per census cycle, whether the certification fired while any row was still open.

And when it cannot

It closes a mismatch nobody worked — a row leaves the queue, the census certifies over it, and the count that was reported is wrong. Or it routes rows the three systems agree on, which is queue noise, and on a certified cycle it reports a breach that never happened.

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.

  • A reconciliation extract whose panels are fixed-layout and whose feed log writes each failure the same way — the free rules floor alone
    Measured: 64 of 64 figures exact and 62 of 64 rows all-correct, for $0.00. On this corpus the paid arm scores 59 and 48.
  • A queue where a wrongly-routed clean row costs a certification review — the model
    The free floor routed 2 clean rows and CG-1 turned both into reported breaches on cycles that certified clean. The paid arm routed 0 and reproduced all 4 cycles exactly.
  • A feed log written by three different integrations in three different styles — the model, and measure the floor beside it
    The floor's phrase lists were written from this corpus by its own author. Its reading number is a ceiling on writing this regular, and nothing here measures what it does on writing that is not.
  • You only need to know whether a census cycle certified over an open row — CG-1 alone, on whatever dispositions you already have
    It is arithmetic over labels that exist. It costs $0.00 and it is the measurement that actually reaches the reported count.

And where nothing here is good enough:

  • A population that is 98 pct in sync — neither, yet
    This corpus is 65.6 pct routed by construction. Nothing here measures a false-route rate on a realistic clean majority, and that is the number that would decide it.

At a glanceHow the whole thing runs

75%row all correct pct
25,537 msp50, end to end
$21.17per 1,000 reconciliation packets · Gemini 3 Flash

Run once, for real, on 2026-09-01. 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 and data/gold.jsonl, and edit data/policy.json — the rule table, the discrepancy vocabulary, the register states and the certification gate's own rule are all data. EVERY MEASURED NUMBER STOPS BEING TRUE, and one in particular. Corpus lens →
When is this the wrong choice?Avoid: The model, until you have measured your own feed log's phrasing. That is the case against the best-fitting scenario (“A reconciliation extract whose panels are fixed-layout and whose feed log writes each failure the same way”). 5 scenarios scored in all, each with its own. Eval lens →
Where does it stop working?A packet whose panel headings differ from these eight. Both the free floor and check_labels split on the heading text; a differently-shaped extract simply yields empty sections and the floor answers none to everything without raising. 6 recorded failure modes, each from a run rather than a guess. Corpus lens →
What was never verified?Whether the labelled line is the line a registrar staff member would have quoted. The key names ONE per named discrepancy and scores a neighbouring one carrying the same fact at zero. 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?7 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-01 — r001-enrollment-recon. 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, scores both free floors offline, re-derives the answer key independently, computes the certification gate, and replays the committed scored run — none of which needs a credential. The board prints whether a key is set and disables the one control that spends.

A living map of modern AI — kept current every morning