The business caseThe problem this solves
A floorplan line is a set of units a lender advanced against and a schedule of what the dealer owes on each one as it ages — and the whole thing turns on a single fact the lender does not hold: whether the vehicle is still on the lot. The STATUS column on the lender's own statement is the dealer's LAST REPORT, and it is wrong in both directions. A unit goes out the door on a Saturday and nobody files the report until the following week; a retail contract is unwound and the vehicle comes back and the column still says SOLD. Get it wrong one way and the line is reported current on a vehicle the dealer no longer has; get it wrong the other and a dealership is asked for a payoff on a car sitting in the front row. Underneath that, a wire is recalled and the ledger still counts it, an extension is applied for and refused and somebody ages every unit from it anyway, and a curtailment covering three units is keyed as "3". On this corpus the lender's own STATUS columns are wrong on 13 of 62 lines, its net is wrong on 15, and its printed verdict is wrong on 16. Opening one floorplan statement, ageing every unit by hand against the curtailment schedule, reading the note under each unit to decide whether the STATUS column is still true, adding the settled column up, reading the note under each ledger row to decide whether the money is actually there, hunting the dealer notes for an extension and deciding whether it was granted or merely asked for, and then working out which sold units are past their grace and unpaid. It does not replace the conversation with the lender, and it moves no money.
Audience
A dealer group's controller or office manager working the monthly floorplan statement before a lender audit, and the finance director behind them. Whoever has to answer "which units are we out of trust on, by how much, and since when" — and has to be able to point at the ledger row or the note under the unit for every figure. Every number on these pages came from one real run of this code, not from a vendor page.
The inputThe actual floorplan payoff reconciliation files
The corpus is 62 floorplan payoff reconciliation files, 0.20 MB (txt 62). It is generated because it has to be. A real floorplan statement is a dealership's own trading position and a lender's own credit file, and the exact shapes this kit measures — a unit that went out and nobody reported, a retail deal that came apart, a wire the originating bank recalled, an extension that was applied for and refused — are rare, scattered and identifying. Generating them means the case mix is known rather than hoped for: 13 of 62 files carry a STATUS column that is wrong, 15 carry a net the lender got wrong, 7 carry an extension the printed ages do not show, 11 carry one that was never granted, 14 carry a note about a sale or an unwind OF SOMETHING ELSE and 18 a note about a reversal of something else, and none of them may move a figure. It also means every number on this page is reproducible by anybody with the repo and no key.
The corpus
- The 62 floorplan payoff reconciliation filesgenerated from a fixed seed, so no real record, person or institution appears in it.
- Where each came fromdata/SOURCES.md states where every byte came from AND what the generator costs the measurement. Every lender and dealership is an invented trading name and each file prints
(invented)beside the lender; dealer numbers, line codes, unit ids, VIN TAILS and reference numbers are arithmetic on the file index, and a VIN tail is four characters that are no real VIN, whole or partial. evals/check_labels.py sweeps every file for five families of identifier on every run and reports 0.
Swap this folder for your own material and the kit is pointed at your floorplan payoff reconciliation files. That is the whole change — there is no database to migrate.
==============================================================================
FLOORPLAN PAYOFF RECONCILIATION FILE FPR-0001
Lender: LND-4102 - Brackenmoor Commercial Credit (invented)
Dealer: DLR-70011 Line: FL-8007 As of: 2026-05-24 Procedure: FPR-2026
==============================================================================
CREDIT LINE AS THE LENDER HOLDS IT
line limit 443000.00 as approved
units on the line 7
payoff grace 7 days from the sale date
curtailment first step 90 days from the floor date
curtailment step 25 pct of the original advance, and again every 30 days
tolerance 250.00 in money, both directions
shortfall threshold 50000.00 or more
days threshold 10 days or more
UNITS AS FLOORED
(STATUS and REPORTED SOLD are the dealer's last report to the lender, not the lender's own record)
UNIT VIN TAIL FLOORED ADVANCE STATUS REPORTED SOLD
UNT-0001 ...XEPZ 2026-04-23 37300.00 SOLD 2026-05-13
UNT-0002 ...BPT0 2026-02-24 31700.00 SOLD 2026-05-03
UNT-0003 ...9PTU 2025-12-31 52300.00 IN STOCK -
NOTE: the unit sold from this block on 2026-04-28 was the one beneath it on the lender's own listing; the status above is right for this one.
UNT-0004 ...F5P1 2026-02-06 51900.00 IN STOCK -
UNT-0005 ...HKXL 2025-11-08 24800.00 IN STOCK -
UNT-0006 ...9LZ0 2025-08-13 29500.00 IN STOCK -
UNT-0007 ...H962 2026-02-21 68200.00 IN STOCK -
REMITTANCE LEDGER AS POSTED BY THE LENDERAbridged — the file continues.
The outcomeWhat a good result looks like
One line in, one row out: which units have left the lot and on what date, whether a curtailment extension is in force, and which ledger rows this procedure treats differently from the ledger that printed them (each with its row quoted verbatim) — and then, derived in code and never taken off the reply, what the line owed by the as-of date, what actually reached the lender, the shortfall, the age of the oldest unsatisfied obligation, the units sold out of trust and one verdict.
And when it cannot
And what it does when it cannot. On the scored run 62 of 62 replies parsed and nothing stopped at the ceiling, so there is no unparsed column to report. A reply that does not parse is counted WRONG and stays in the denominator; it is never re-fired. A cited ledger id that is not on the file is dropped by the station and counted (0 on this run). A sold unit that is not on the line, or one dated after the as-of date, is dropped and counted (0 and 0). An extension whose date, line code or day count will not parse is dropped WHOLE and the printed ages stand (0 on this run).
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.
- The monthly floorplan statement before a lender audit — the paid call
it names each unit that has actually left the lot, each one sold out of trust, the shortfall and its age, and quotes the ledger row for every row it treats differently from the lender. 36 of 62 lines whole against the best free code's 23, paired p 0.035082. - A statement whose STATUS column is known to be accurate — free code
the reading lives in the sentence under the unit. With an accurate column the column parser and the paid arm answer the same thing, and one of them is free — on the 21 lines here with nothing to read the column parser is 21 of 21 and the paid arm is 11. - Checking that the interest and the fees recompute — free code
the memo states the product. Multiplying it out is arithmetic and the keyword floor gets it; the paid arm scored 0 of 3 on that family with reasoning off. - Deciding what to do about a line that is out of trust — a person, with this kit's row in front of them
it reports the state of a reconciliation and refuses every disposition. FP-2 puts a line on an exception list; a person decides what is said to whom. Nothing here is a finding about anybody's conduct. - Telling a dealer or a lender what they are entitled to — somebody who has done the research
it states nobody's rights or obligations and declares no default, by design and in code. 'Out of trust' is a phrase with a legal life of its own outside this page and the research behind any such claim is owed and unwritten. - Remitting the payoff — your own treasury process
no money moves. Nothing is paid off, drawn, remitted, credited or waived anywhere in the pipeline, and the answer schema offers no field that could express it.
At a glanceHow the whole thing runs
Run once, for real, on 2026-09-11. 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 statements in the same shape and data/units.json with your own register, then rebuild the key with tools/build_corpus.py or label it yourself in the same gold.jsonl shape. ⚠︎ WHAT STOPS BEING TRUE THE MOMENT YOU DO. Corpus lens → |
| When is this the wrong choice? | Avoid: Reading the headline as a per-field result. The arm's own arithmetic is right on 14 of 62; the pure-code station is what carries it to 36, and the station is free. That is the case against the best-fitting scenario (“The monthly floorplan statement before a lender audit”). 6 scenarios scored in all, each with its own. Eval lens → |
| Where does it stop working? | A statement that is not fixed-width columns. src/ledger.py's row regexes are the shape these files print; a CSV export, a PDF or a lender portal needs a different parser and nothing else. 7 recorded failure modes, each from a run rather than a guess. Corpus lens → |
| What was never verified? | NO SECOND SCORED RUN. One was fired, so the run-to-run spread on this corpus is unknown and unclaimed — which matters more here than usual, because the margin over the best free floor is p 0.035 and 23 discordant pairs against 10. 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? | 6 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-11 — r001-floorplan-payoff. 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 renders the whole board, all four free floors, all seven committed runs and every screenshot. tools/build_corpus.py --check, python3 -m evals.check_labels and every free arm run with no network at all.









