Home › Use Cases › Reconcile a recurring payment against the ledger and its agreement's recorded events
Use caseUC0315
🧪 Use-case kit · runnable

Reconcile a recurring payment against the ledger and its agreement's recorded events

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

An agreement makes one payment due on one anniversary, every year, for as long as it runs — and whether it was discharged is not a lookup. The accounting system offers whatever remittances its reference field happens to match, the register holds a note about a rename or an assignment that changes which of them count, and the file carries recorded events that engage a clause on one agreement and engage nothing on its neighbour. A missed preservation payment is what ends an agreement, and the verdict that says so is the one with no evidence line behind it. Opening one agreement's file once a year, reading every remittance the accounting system offered against the register note, deciding which of them are this agreement's and this anniversary's, multiplying a rate by a quantity, adding a grace period to a date, and writing down which of six things happened.

Audience

A land or contract administrator working an anniversary calendar — the person who reads the row and decides whether anything needs doing. It is not the person who serves a notice, and nothing here does. Every number on these pages came from one real run of this code, not from a vendor page.

The inputThe actual obligation files (one agreement, one anniversary)

The corpus is 60 obligation files (one agreement, one anniversary), 0.12 MB (txt 60). It is generated because it has to be. A real agreement register and a real payment ledger are commercially confidential and carry counterparty names, and the failure this kit is about — a remittance that belongs to the neighbouring agreement, a payment made to the party who used to be entitled — only exists in a set where somebody knows the truth. The generator holds that truth before it renders a single line, and the key is computed from it by src/policy.py rather than typed.

The corpus

  • The 60 obligation files (one agreement, one anniversary)generated from a fixed seed, so no real record, person or institution appears in it.
  • Where each came fromNowhere — every one of the 60 obligation files and the whole answer key is generated. Nothing here is fetched, scraped, licensed or derived from anything that was.

Swap this folder for your own material and the kit is pointed at your obligation files (one agreement, one anniversary). That is the whole change — there is no database to migrate.

One obligation files (one agreement, one anniversary), as the model receives itRDR-0001.txt · 1 of 60
RECURRING PAYMENT OBLIGATION REVIEW                               RDR-0001
Ashwater unit - annual preservation payment - anniversary 2
prepared from the agreement register on 2026-09-05

AGREEMENT TERMS as the register holds them
  agreement id        AGR-40011
  counterparty        Wrenfield Minerals Ltd
  effective date      2024-01-03
  term ends           2032-01-02
  payment basis       per unit
  payment rate        $ 10.16 per net acre
  quantity            366.24 net acres
  payment due         one payment on each anniversary, for the whole of the term
  grace period        45 calendar days counted from the anniversary and no more
  condition clause    none. The payment runs for the term whatever is recorded elsewhere in the register
  register note       registered on 2024-02-26: a change of name only, from Ardwick Logistics Group to Wrenfield Minerals Ltd

OBLIGATION UNDER REVIEW
  anniversary         2026-01-03
  anniversary no      2
  review window       2026-01-01 to 2026-12-31
  non-business days   none published for this window

EVENTS RECORDED AGAINST THE AGREEMENT in the order they were filed

  none on file

PAYMENT LEDGER LINES the accounting system offered for this agreement

  PMT-0120  date          2026-01-01
  PMT-0120  amount        $ 3,721.00
  PMT-0120  reference     delay rental 2026 Tract 6, Ashwater unit
  PMT-0120  payee         Wrenfield Minerals Ltd
  PMT-0120  instrument    BACS 2753744
  PMT-0120  status        cleared, value 2026-01-02

  PMT-0190  date          2026-01-22
  PMT-0190  amount        $ 3,699.40
  PMT-0190  reference     rental 2026 - Tract 6, Ashwater unit
  PMT-0190  payee         Wrenfield Minerals Ltd
  PMT-0190  instrument    SEPA 4223439
  PMT-0190  status        cleared and reconciled 2026-01-23

Abridged — the file continues.

The outcomeWhat a good result looks like

One obligation in, one row out: the ledger lines that discharge it, the condition (if any) in force, what was due in whole cents, one of six verdicts, and one line copied verbatim from the file that the verdict turns on. 41 of 60 obligations came back with all five right on the scored run after OBL-2026 was re-applied in code.

And when it cannot

And what it does when it cannot. On the scored run 60 of 60 calls returned a usable reply and the misses stay in every denominator. The named harms are published rather than averaged away: 12 obligations had another agreement's money taken as this one's, 3 had money on the file that the arm did not find, and 4 were reported DUE-AND-MISSED where the ledger discharges them.

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 remittance references reliably carry the agreement id — the free rules floor, alone
    39 of 60 obligations here are settled by that rule plus a cleared test and a year test, at $0.00 and with no network. Spend nothing until you have measured how many of your references do not.
  • Your register carries renames, assignments and tract-level references — the paid call, with src/recheck.py in front of it
    this is the column the money buys: 10 of 10 against the free floor's 0 on the obligations whose money can only be found by resolving the note.
  • Neighbouring agreements share a payer and a reference convention — both arms, and treat a disagreement as the finding
    on the 4 obligations carrying the neighbour's line the free floor is right 4 times and the paid arm 1. Neither is reliable alone and their disagreement is exactly the row a person should open.

And where nothing here is good enough:

  • Your grace clause carries a business-day extension — neither arm, until src/policy.py implements it
    4 obligations here land on it and the rechecked column of EVERY arm is wrong on all of them, both free floors included. It is a stated limit, published as station_misreads_grace.

At a glanceHow the whole thing runs

60–68%rechecked obligation all correct pct
1,572 msp50, end to end
$2.93per 1,000 obligation files · google/gemini-3-flash

Run once, for real, on 2026-09-06. 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 obligation files in the same columnar shape (` label value`, and PMT-nnnn label value for the record blocks), rebuild data/agreements.json, and run the two free floors first. ⚠︎ WHAT STOPS BEING TRUE THE MOMENT YOU DO. Corpus lens →
When is this the wrong choice?Avoid: Paying for a call whose answer a string match already produces. That is the case against the best-fitting scenario (“Your remittance references reliably carry the agreement id”). 4 scenarios scored in all, each with its own. Eval lens →
Where does it stop working?A register note naming more than one assignment, or an assignment and a rename together. Every file here carries at most one join fact. 5 recorded failure modes, each from a run rather than a guess. Corpus lens →
What was never verified?That the key is right about which remittance belongs to which agreement. It is the generator's structural truth, held before any file was rendered; a reader of the rendered file cannot independently confirm it, and evals/check_labels.py takes the two READINGS as given and re-derives only what the standard computes from them. 7 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-06 — r002-rental-due-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 on 127.0.0.1:9315 — all 60 obligations, both free floors computed live, OBL-2026 in full, the corpus board and every committed run replayed — and the model button is disabled with the reason printed beside it.

A living map of modern AI — kept current every morning