Home › Use Cases › Non-operated JIB statement audit
Use caseUC0493
🧪 Use-case kit · runnable

Non-operated JIB statement audit

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 non-operated working-interest owner has to audit every joint interest billing statement the operator sends: the statement prints a cover-page summary, the agreement on file, an AFE register, the charge lines and the prior-period history, and most of the answer is decided by those printed columns — the working-interest schedule, the category list, the overhead rate, the AFE numbers. What decides the rest is a desk note: a working-interest assignment effective from a date, a well status change, an overhead rate adjustment, an AFE supplement approved after the fact, a charge already credited in a prior period — often written as "last Tuesday" or "three days ago" and counted from a PACK COMPILED date in a different month, and often dated AFTER the charge it claims to govern, in which case it changes nothing. The operator's own cover page disagrees with the procedure on 17 of the 64 statements in this corpus. Opening one operator's statement, reading the agreement on file for the working-interest schedule, the overhead rate and the chargeable categories, checking every charge line against the AFE register for capital authority, scanning the prior-period history for a charge already credited, and reading every desk note for an assignment, a status change, a rate adjustment or an AFE supplement — and dating each note against the charge it claims to govern.

Audience

The joint-interest or revenue accounting desk at a non-operated working-interest owner, auditing each operator's monthly billing before it is paid — and the land and engineering desks a rejected charge or a disputed AFE is handed to. Every number on these pages came from one real run of this code, not from a vendor page.

The inputThe actual joint interest billing statements

The corpus is 64 joint interest billing statements, 0.32 MB (txt 64). It is generated because it has to be. A real joint interest billing statement is a commercial record: the operator's name, the unit and well names, the working-interest owners, the rates negotiated in a joint operating agreement, and desk notes written by named people about named counterparties. None of that can be published, and a published corpus would have had the one thing this kit measures — the sentence that decides a reading — stripped out of it first. So the whole thing is invented, declared, and generated from one seed with the key DERIVED by the same rulebook the kit applies. JIA-2026 is invented too: there is no statute, regulation or regulator anywhere in this kit, because the agreement on file is CONTRACTUAL and nothing else governs the answer.

The corpus

  • The 64 joint interest billing statementsgenerated 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 joint interest billing statements. That is the whole change — there is no database to migrate.

One joint interest billing statement, as the model receives itJIB-0001.txt · 1 of 64
====================================================================================================
NON-OPERATED JOINT INTEREST BILLING STATEMENT -- ONE UNIT, ONE ACCOUNTING MONTH
====================================================================================================
FILE              JIB-0001
UNIT              UNIT-1738
OPERATOR          OPR-A
AGREEMENT         JOA-2016-823
STATEMENT MONTH   2026-05
STATEMENT RUN     2026-06-05 06:00
PACK COMPILED     2026-06-10 10:30 (Wednesday)
CURRENCY          USD

-- AGREEMENT ON FILE (joint operating agreement and accounting exhibit, as configured) -------------
CLAUSE       SUBJECT                           VALUE
JOA-03.1     participating interest            working interest schedule on file
JOA-06.2     capital expenditure authority     AFE required at or above 100,000.00 gross
JOA-11.3     overhead fixed rate DRILLING      9,800.00 per month
JOA-11.4     overhead fixed rate PRODUCING     980.00 per month
ACCT-II.3    chargeable categories             LABOR EQUIPMENT MATERIAL TRANSPORT SERVICES OVERHEAD LEGAL
ACCT-II.9    not chargeable to joint account   AUDIT-FEE DAMAGES ENTERTAINMENT INSURANCE OPERATOR-GA PARENT-ALLOC PENALTY
ACCT-IV.1    adjustment of prior billings      24 months

-- WORKING INTEREST SCHEDULE (as on file) ----------------------------------------------------------
EFFECTIVE    DECIMAL      BASIS
2021-04-30   0.06250000   original
2025-03-31   0.15625000   assignment on file

-- WELL STATUS ON FILE -----------------------------------------------------------------------------
STATUS       EFFECTIVE
DRILLING     2024-03-05
PRODUCING    2025-07-09

-- AFE REGISTER (capital authority on file) --------------------------------------------------------

Abridged — the file continues.

The outcomeWhat a good result looks like

One statement in, one row out: the working interest owed, the status in force, the overhead rate owed, the capital authority for every charge line, the corrected re-bills, every line's flags with a clause and a field cited on each one, the exception set in ladder order, and one of six JIA-2026 verdicts.

And when it cannot

⛔ AND ON THIS CORPUS IT DOES NOT BEAT FREE CODE. Through the pure-code station the paid call gets 44 of 64 statements whole; the free floor of record — a domain vocabulary over the desk notes plus JIA-2026's own absolute-day tests and a negation skip — gets 52. Paired on the same statements, 5 are whole only for the paid call and 13 only for the floor: exact McNemar p = 0.0962524, NOT SIGNIFICANT, and the point estimate runs against the paid call. A CONSTANT reply of CLEAN with nothing flagged, put through the same station, gets 43 — 44 against 43, 8 / 7 discordant, p = 1.0000, no separable difference at all. As replied, before the station, the paid call gets 29. ⛔ AND NO SLICE RESCUES IT: scored against every free arm the kit ships rather than against the floor alone, there is NO slice of 15 on which the paid call leads the best shipped free arm, and three run significantly against it — the 19 statements a desk note moves (7 v 17, p = 0.0063477), the 17 where the operator's cover page disagrees with the procedure (6 v 16, p = 0.0063477) and the 45 the printed columns decide (37 v 45, p = 0.0078125). Nothing was re-fired.

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 operator prints the agreement, the AFE register and the prior-period history in columns, and desk notes carry absolute effective dates — the free floor of record, and do not buy a call at all
    52 of 64 statements whole for $0.00 against the paid call's 44 (p = 0.0962524, point estimate against). On the 45 statements no desk note decides, free code gets 45 of 45 and the paid call 37 (p = 0.0078125 against it).
  • You need every exception found before the statement is paid and cannot afford to pass a bad charge — the free floor of record, with its misses reviewed by a person
    The station returned CLEAN on 7 statements that carry an exception for the paid call against 6 for the floor, and the floor finds 12 more whole statements. Neither arm is safe alone: the floor still misses 12 of 64.

And where nothing here is good enough:

  • Changes arrive ONLY as free text — relative days, notes naming a well by its old designation, notes pasted from email — neither yet — measure a harder corpus first
    This is where a reading should earn its place, and on the 19 note-decided statements here the paid call gets 7 where a free word list with negated notes skipped gets 17 (p = 0.0063477 AGAINST). Relative days were wrong on 9 of the 16 statements carrying one. The case is not unproven — on this corpus it is measured and lost.
  • You want something that will also withhold, net or dispute the charges it flags — not this kit
    There is no write path by construction: 0 breaches on every committed arm and 0 of 12 pressure trials, including four framings that order the pack in terms to pay, withhold or release and to add a payment_instruction field. 25 of the 64 statements already carry a desk note asking for one of those.

At a glanceHow the whole thing runs

69%rechecked whole statement pct
1,906 msp50, end to end
$1.34per 1,000 joint interest billing statements · the fast tier

Run once, for real, on 2026-09-17. 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 operator statements in the same block shape and data/units.json with your own unit register, then run python3 -m evals.run --run-id b000-<yours>-vocab_nd --floor vocab_nd — it needs no key and costs nothing. ⚠︎ WHAT STOPS BEING TRUE THE MOMENT YOU DO. Corpus lens →
When is this the wrong choice?Avoid: Paying per statement for arithmetic and lookups free code already does better. That is the case against the best-fitting scenario (“Your operator prints the agreement, the AFE register and the prior-period history in columns, and desk notes carry absolute effective dates”). 4 scenarios scored in all, each with its own. Eval lens →
Where does it stop working?An operator who prints no EFFECTIVE date on the working-interest schedule. R-1 picks the latest assignment on or before the charge month; without a date every assignment either always applies or never does, and the three exact boundaries in this corpus — an assignment effective ON the month's first day, a supplement approved ON the charged date, a rate adjustment effective ON the first day, all three of which APPLY — become guesses. 8 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 is unknown. 11 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-17 — r001-jib-statement. 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 — Recorded on this kit's own folder with API_KEY blanked, not on a fresh clone: the board renders every committed run and all nine free arms, the free arms score offline, and the no-key server on port 9593 answered the live-call route with a refusal — the frame the empty screenshot was taken from. requirements.txt names no package, and the reply cache ships (there is no gitignore line dropping it), so a clone renders every recorded reply rather than a board of zeros; with the cache moved aside the board NAMES the missing file instead. What a key buys is the ASK THE MODEL button and a new scored run. A clean checkout on a second machine was NOT timed.

A living map of modern AI — kept current every morning