Home › Use Cases › Reconcile outstanding TITO ticket liability for one gaming day
Use caseUC0394
🧪 Use-case kit · runnable

Reconcile outstanding TITO ticket liability for one gaming day

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 slot machine prints a barcoded voucher when a player cashes out. Until somebody redeems it at a machine, a kiosk or the cage, that voucher is cash the property owes, and it sits on the balance sheet as outstanding ticket liability. Somebody on the cage audit desk has to prove, for each gaming day, that the balance carried forward is the balance the ticket record actually supports — and the two places that number comes from are a transaction ledger and a subsidiary ledger that do not have to agree. Opening one zone's liability file, adding the ticket ledger up by hand, reading each note printed under a row to decide whether the event happened, counting the expiry term out on a calendar, and deciding whether a sentence in the cage notes is a hold in force.

Audience

A casino cage audit or revenue audit desk working a daily liability reconciliation, and the internal-audit reader who has to believe the carried figure before it reaches the general ledger. Every number on these pages came from one real run of this code, not from a vendor page.

The inputThe actual gaming-day liability file

The corpus is 62 gaming-day liability file, 0.26 MB (txt 62). It is generated because it has to be. A real TITO liability file is a property's own trading record and the exact shapes measured here — a voucher voided in the tray, a redemption of a validation number the system never issued, a shift manager asking for a cashier to be named — are the rows a casino would least want published. So every byte is invented from one seed, --check rebuilds all of it byte-identically under two PYTHONHASHSEEDs at 0 problems, and --check-fillers passes 1,695 checks across 62 files.

The corpus

  • The 62 gaming-day liability filegenerated 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 property is an invented trading name, every validation number, ledger entry, order reference and amount is arithmetic on the file index, and there is no personal data at all — evals/check_labels.py sweeps all 62 files 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 gaming-day liability file. That is the whole change — there is no database to migrate.

One gaming-day liability file, as the model receives itTLF-0001.txt · 1 of 62
==============================================================================================
TITO TICKET LIABILITY FILE                                                            TLF-0001
Property: PRP-4100 - Silver Coulee Casino (invented)
Gaming day: 2026-06-29   Zone: ZN-1   Procedure: TLR-2026
==============================================================================================

PROPERTY AND GAMING DAY AS THE MASTER HOLDS IT
  currency                              USD
  opening outstanding               6406.19
  expiry term                            90   days from issue
  tolerance pct                        0.25   pct of admitted issuance
  threshold amount                   900.00   or more
  threshold pct                        1.00   pct or more
  gaming day                       full-day

TICKET LEDGER AS POSTED BY THE CAGE
  ENTRY    TICKET      EVENT   ISSUED          AMOUNT  STATUS  DEVICE    MEMO
  LE-0001  TKT-100005  issue   2026-06-29      106.71  POSTED  SLT-2307  machine cash-out, validator BV-03
  LE-0002  TKT-100073  issue   2026-06-29      107.08  POSTED  SLT-2307  ticket printed at cash-out, bank B25
  LE-0003  TKT-100039  issue   2026-06-29       45.82  POSTED  SLT-2214  machine cash-out, validator BV-02
  LE-0004  TKT-100115  issue   2026-06-29      141.80  POSTED  SLT-2118  cash-out, bill validator BV-04
  LE-0005  TKT-100092  issue   2026-06-29       70.90  POSTED  SLT-2441  ticket printed at cash-out, bank B20
  LE-0006  TKT-100108  issue   2026-06-29      138.75  POSTED  SLT-2688  cash-out at bank B21
  LE-0007  TKT-100300  issue   2026-06-29       91.44  VOID    SLT-2712  reversed at the window and excluded from the cage panel

Abridged — the file continues.

The outcomeWhat a good result looks like

One gaming day in, one row out: the carried outstanding balance TLR-2026 derives, the difference against what the cage reports, one verdict from a closed five-value ladder, and — the point of the whole thing — every ledger entry that cannot be accounted for, quoted verbatim.

And when it cannot

And what it does when it cannot. On the scored run 62 of 62 replies parsed and 0 stopped at the ceiling, so there is no failure-to-answer story here; the failure story is what it answers WRONG, and it is published family by family. On the station-only column the paid call is 29 of 62 and LOSES to free code at 34.

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 ledger's exceptions are recorded in a CODED reason field rather than in prose — free code
    the reading this kit buys is a sentence; a code is a lookup and the free floor wins outright
  • Every difference on your days is a duplicate posting or a premature sweep — free code
    both are decidable without reading anything — set membership and date arithmetic — and src/hybrid.py ships them
  • Your cage notes carry dispute holds, and some of them were refused or released — the paid call
    this is the whole of the margin: 62 of 62 against a regex's 51, and 9 of 11 on the refused-hold decoys against the regex's 0
  • A row's note describes a void, a duplicate or a re-key OF SOMETHING ELSE — the paid call
    12 of 16 on the keep-note decoys against the keyword rule's 0

And where nothing here is good enough:

  • You need the carried balance itself, to the cent, from the model — neither — use the station
    the arm's own arithmetic is right on 2 of 62. The station derives it for nothing from the arm's reading and is right on 52.

At a glanceHow the whole thing runs

82%all five correct pct
1,975 msp50, end to end
$0.00per 1,000 gaming-day liability file · google/gemini-3-flash

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 liability files in the same shape and data/property.json with your own register rows, keyed by doc id. ⚠︎ WHAT STOPS BEING TRUE THE MOMENT YOU DO. Corpus lens →
When is this the wrong choice?Avoid: Paying for a call that adds nothing to a join. That is the case against the best-fitting scenario (“The ledger's exceptions are recorded in a CODED reason field rather than in prose”). 5 scenarios scored in all, each with its own. Eval lens →
Where does it stop working?A ledger whose rows do not carry the ticket's ORIGINAL issue date. L-3 is date arithmetic on that column and without it the expiry test is not decidable at all, free or paid. 6 recorded failure modes, each from a run rather than a guess. Corpus lens →
What was never verified?Whether the margin over the best free arm is real. 51 against 41 on 62 paired gaming days is p = 0.063915 by McNemar's exact test, which is NOT significant at 0.05. 8 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-tito-liability. 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, all 62 gaming days, all three free floors and every committed run. python3 -m evals.run --run-id t000-tito-liability-stub --stub scores all 62 at $0.00.

A living map of modern AI — kept current every morning