The business caseThe problem this solves
A district's state funding claim is arithmetic over its own attendance register: which days count, at what fraction of a day, under enrolment status, excused and unexcused absence, minimum-day thresholds, part-time and dual-enrolment proration, and the board's adopted calendar. The claim goes out; months later a state apportionment auditor reads the same register and asks the same question. What a business analyst does today is subtract two numbers in a spreadsheet -- days present against funded days claimed -- and that subtraction cannot tell a holiday from a day before enrolment from a short day from a duplicate, cannot see a prorated day at all, and cites nothing. The pre-certification pass a district business analyst makes over an apportionment claim: reading the daily attendance register against the state's funding rules, claim line by claim line, and then against the district's own correspondence file for the amendments, waivers and backdated transactions that answer half of what the register appears to say.
Audience
The business analyst who signs the certification, and the person who will answer for it at audit. The decision is not 'is this number wrong' -- it is 'which rule was misapplied, which provision says so, and what document proves it'. This report's own answer on that decision is measured against a free calculator that answers most of it for nothing, and the calculator's number is printed beside every one of the model's. Every number on these pages came from one real run of this code, not from a vendor page.
The inputThe actual funding claim reconciliation pack (one SYNTHETIC claim period for one school -- every district, student reference and register row INVENTED)
The corpus is 48 funding claim reconciliation pack (one SYNTHETIC claim period for one school -- every district, student reference and register row INVENTED), 0.79 MB (txt 48). Because the answer is COMPUTED rather than opined, and that is rare enough in a document task to be worth building a kit around. The funded-days figure is arithmetic over stated rules: given the register, the calendar, the enrolment window, the minimum-day threshold and the rate table, the number of funded days a claim line supports is not a matter of judgement. So a deterministic checker produces ground truth, every arm is scored against a calculator rather than against an author, and evals/check_labels.py property 13 re-performs the whole arithmetic from the rendered text to prove it. The price is that no real attendance data exists here, and none could: daily attendance is a student record.
The corpus
- The 48 funding claim reconciliation pack (one SYNTHETIC claim period for one school -- every district, student reference and register row INVENTED)generated 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 funding claim reconciliation pack (one SYNTHETIC claim period for one school -- every district, student reference and register row INVENTED). That is the whole change — there is no database to migrate.
Funding Claim Reconciliation
----------------------------------------------------------------
Pack FCR-0001
District Weatherly Unified School District
School Tarnbury Middle School
Claim period 2026-01-05 to 2026-01-30
Instructional days 17
Apportionment cycle First Period (P-1)
Prepared by District Business Office
Funding Rules And Rates
----------------------------------------------------------------
Apportionment rules
AR-1.1 A day is fundable only while the student's enrolment is active on that day
AR-1.2 A day recorded under an attendance code the table below marks not fundable earns no apportionment, whether the absence is excused or unexcused
AR-1.3 An excused absence does not affect the student's continuing eligibility, but it is still not a fundable day
AR-2.1 A day on which the student received fewer than the claim line's minimum-day minutes is not fundable
AR-2.2 A day is funded at the rate the enrolment status recorded for that day carries
AR-2.3 A day not in session on the governing board's adopted instructional calendar is not fundable
AR-2.4 One instructional day earns apportionment once only, across every program code the student is enrolled in
Attendance codes
AC-P Present fundable
AC-S Suspension, in-school fundable
AC-I Independent study, signed agreement on file fundable
AC-E Excused absence not fundable
AC-U Unexcused absence not fundable
AC-X Day not in session not fundable
Enrolment ratesAbridged — the file continues.
The outcomeWhat a good result looks like
One entry per claim line, in the pack's order: the disposition, and on an overstatement the rule that was misapplied, the provision the pack itself prints for it, the record that proves it, and the funded days overstated to two decimal places. All five together, scored as one cell -- that is attendance_claim_accuracy_pct.
And when it cannot
When the pack does not settle a claim line -- a register row under an attendance code the pack's own table does not carry, or a difference with no attendance certification on file -- the honest output is INSUFFICIENT_EVIDENCE naming what is missing, not a finding. 36 of the 288 claim lines in this corpus are exactly that, and how often an arm recognises them is published on its own denominator.
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 register is a clean table and your rules are printed beside it — the free floor (evals/baseline.py, claim-gate)
It takes every rule the printed columns prove, cites the provision correctly and attaches the record, for $0.00 and under a second. - Half your answers are in an email thread, a board minute or a note — the paid arm
It is the only thing here that reaches the district-file channel at all -- every free floor scores 0.00 pct there by construction. - You need the number, not the verdict — read overstated_days_accuracy_pct, not the discriminator
A claim amendment is built on a figure. The verdict is the easy half. - You are deciding whether to buy anything at all — run both and read the channel split
The two columns answer different questions and the estate's own experience is that the free floor wins more often than anyone expects.
At a glanceHow the whole thing runs
Run once, for real, on 2026-08-26. 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? | Drop your own reconciliation packs into data/corpus/ in the layout data/SOURCES.md describes and everything except the answer key works immediately: the parser, the apportionment calculator, all three free floors and the UI. ⚠︎ WHAT DOES NOT TRANSFER. Corpus lens → |
| When is this the wrong choice? | Avoid: Paying a model for the 102 overstatements the register's printed columns already prove -- claim-gate takes every one of them for $0.00. That is the case against the best-fitting scenario (“Your register is a clean table and your rules are printed beside it”). 4 scenarios scored in all, each with its own. Eval lens → |
| Where does it stop working? | A pack layout that is not this one. src/pack.py is seven regular expressions written for these headings, this fixed-width attendance register and these key/value blocks; against a real SIS apportionment export -- a CSV, a state submission file, a report PDF -- it parses nothing and returns empty tables rather than guessing. 7 recorded failure modes, each from a run rather than a guess. Corpus lens → |
| What was never verified? | Whether a reconciliation this scorer calls wrong would be called wrong by a state auditor. Scoring stops at the key: a defensible-but-different reading -- a different provision that also covers the rule, a record that also proves it -- scores as a miss. 10 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? | 4 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-08-26 — r002-attendance-funding. 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 — git clone, then python3 -m src.app -- no install, no key, no network. The corpus, the answer key and every committed run record ship in the repo, and all three free floors are pure Python. python3 -m evals.check_labels proves the key in under a second and python3 -m evals.run --run-id <id> --floor claim-gate reproduces the strongest free floor's whole score for $0.00.



