The business caseThe problem this solves
A foundation moves money between its own funds all the time — an operating reserve topped up, a grant program funded ahead of a payment, a restricted balance brought back when the purpose has been met, a legacy due-to/due-from balance settled at last. Two things have to be true of every one of them and neither is on the face of the ledger. The pair has to net to zero at the period cut-off, and something in force has to have authorised it: a committee minute that covers these funds and this purpose, a delegated authority whose ceiling reaches the amount, or — where money left a donor-restricted or endowment fund — a gift agreement clause that permits the release. Today the answer to the second question is whatever the accountant typed into the transfer register, and on this corpus that is wrong on 22 of 64. Opening one transfer's file, ticking the general-ledger entries that carry its reference against the cut-off, reading every minute and clause in the authorisation pack to find the one that covers these two funds and this purpose, and deciding whether a restricted balance moved with anything behind it.
Audience
The finance desk of a foundation or a community trust working a period's interfund transfers, and the controller who owns the restricted-fund approval lane. The decision is narrow and it is not the controller's decision: which transfers need a person to look at them, and what evidence to put in front of that person. Every number on these pages came from one real run of this code, not from a vendor page.
The inputThe actual interfund transfers
The corpus is 64 interfund transfers, 0.26 MB (txt 64). It is generated because it has to be. A real interfund transfer file is a foundation's own trading record, its donors' gift agreements and its board's minute book, and none of the three can be published. Generating it also buys the one thing a scraped corpus cannot: the key is DERIVED from the same structure the file is rendered from, so there is no second place the answer lives and a corpus change cannot leave a stale label behind. What it costs is stated in full in data/SOURCES.md, including the families the generator makes easier than life and the one corpus defect an eight-call canary caught before the set was bought — the cases were emitted in blocks, so the file id carried the case and any prefix of the corpus was unrepresentative.
The corpus
- The 64 interfund transfersgenerated 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 foundation, fund, board minute, gift agreement clause, delegated authority band, standing exception, ledger entry, amount and note is invented, and THERE ARE NO PEOPLE IN THIS CORPUS AT ALL — an approval is an INSTRUMENT and a ROLE. evals/check_labels.py sweeps all 64 files for a person-shaped name and an honorific on every run and reports 0.
Swap this folder for your own material and the kit is pointed at your interfund transfers. That is the whole change — there is no database to migrate.
==============================================================================
INTERFUND TRANSFER RECONCILIATION -- ONE TRANSFER, ONE PERIOD
==============================================================================
FILE IFT-0001
FOUNDATION F-0401 Harrowgate Family Foundation
TRANSFER IFT-2026-0400
TRANSFER DATE 2026-04-06
PERIOD 2026-04-01 to 2026-06-30
CUT-OFF 2026-07-15
AMOUNT 12,000.00
TOLERANCE 0.00
CURRENCY USD
CONTROLLER approval lane for a restricted-fund touch: controller only, not configurable
-- FUND REGISTER -------------------------------------------------------------
FUND NAME CLASS RESTRICTION
FD-1001 General Operating unrestricted none
FD-1002 Administration unrestricted none
FD-2001 Rivermouth Literacy Program temporarily restricted purpose: adult literacy programming in the Rivermouth wards
FD-2002 Fernhill Trails Restoration temporarily restricted purpose: restoration of the Fernhill trail network
FD-3001 Aldworth Endowment endowment corpus: permanently restricted, income to unrestricted purposes
-- GENERAL LEDGER ENTRIES CARRYING A TRANSFER REFERENCE ----------------------
ENTRY POSTED FUND AMOUNT REF STATUS MEMO
GL-20001 2026-04-06 FD-1002 -12,000.00 IFT-2026-0400 POSTED due to FD-1001
GL-20002 2026-04-06 FD-1001 +12,000.00 IFT-2026-0400 POSTED due from FD-1002
GL-20011 2026-04-13 FD-1002 -29,500.00 IFT-2026-0401 POSTED due to FD-1001
GL-20012 2026-04-13 FD-1001 +29,500.00 IFT-2026-0401 POSTED due from FD-1002
Abridged — the file continues.
The outcomeWhat a good result looks like
One transfer in, one row out: which ledger entries make the pair, which instrument in the pack authorises it with the instrument's own row quoted, the pair's two totals and variance recomputed in code, and one of five verdicts. A transfer that nothing supports is named, with the two funds, the amount and the date beside it.
And when it cannot
And what it does when it cannot. On the scored run 64 of 64 replies parsed, nothing stopped at the 3,000-token ceiling and no call failed — but 36 of the 64 transfers came back with at least one of the five graded fields wrong, and 22 of those 36 are ONE behaviour: the key names the delegated authority schedule and the arm cited nothing at all. The kit publishes that as its headline rather than as a caveat, because on this corpus free code scores 32 of 64 and the paid call scores 28.
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 delegated authority is a table with a ceiling column and your minutes are structured — the free rules floor
three printed columns decide it and free code never has an opinion. Measured here: the floor cites the delegated schedule on 28 of the 28 transfers where it is the answer and the paid call on 7. - your authority lives in minute prose — resolutions, rescissions, recitals — the paid call
4 of 6 on the family where a later minute considered rescinding the covering one and resolved that it stand, against 0 of 6 for every free arm; 13 of 16 across the whole authority-text family against the floor's 7. - your ledger has entries keyed against the wrong transfer reference — the paid call
legs 64 of 64 against 59 for both free arms, p = 0.03125. Every column on a mis-keyed entry says it is yours and only a sentence says otherwise. - you need to know whether a restriction was crossed with nothing behind it — either, and then a person
8 of 14 for the paid call and 7 of 14 for the free floor on the restriction-crossing family: no useful difference, and both are far from good enough for the only finding on this kit that cannot be taken back.
At a glanceHow the whole thing runs
Run once, for real, on 2026-09-12. 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/ with your own transfer files in the same fixed-width shape and data/registers.json with your own declared amounts, transfer dates, cut-offs and tolerances. ⚠︎ WHAT STOPS BEING TRUE THE MOMENT YOU DO. Corpus lens → |
| When is this the wrong choice? | Avoid: Paying for a comparison you can write. That is the case against the best-fitting scenario (“your delegated authority is a table with a ceiling column and your minutes are structured”). 4 scenarios scored in all, each with its own. Eval lens → |
| Where does it stop working? | An authorisation pack whose instruments are ATTACHMENTS rather than printed text. The whole reading is those text rows; a pack that references a document not on the file makes auths unanswerable, and this kit HAS NO TEST for the absence. 6 recorded failure modes, each from a run rather than a guess. Corpus lens → |
| What was never verified? | Whether a larger model cites a delegated authority schedule. 22 of this arm's 36 misses are that one behaviour and nothing here has measured a second tier. 6 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-12 — r001-interfund-transfer. 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 on port 9408, replays all four committed arms, and runs the three free floors and the wiring stub end to end at $0.00. tools/build_corpus.py --check rebuilds every byte of the 64 files, the register, the key and the stats and reports 0 differences; evals/check_labels.py re-derives the arithmetic and the ladder from the printed files alone and reports 0 disagreements. None of that needs a credential and none of it reaches a network.






