Home › Use Cases › Audit each issued comp against the approval-authority matrix
Use caseUC0329
🧪 Use-case kit · runnable

Audit each issued comp against the approval-authority matrix

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 casino gives things away. A room night, a dining credit, a show ticket, promotional play loaded to a card — and every one of them is issued by a named person who holds a TIER of delegated authority. The property publishes an approval-authority matrix saying what each tier may issue, for how much, when a second signature is required, and how far a comp may run against what the patron's play is actually worth. Weeks later somebody in internal audit has to look at every comp that went out and say which ones were issued inside that authority. Today that is done off the ISSUANCE REGISTER — the class column, the tier column, the amount, the date — because that is what a spreadsheet can join. The matrix has TWO REVISIONS printed on the same sheet and a date the newer one took effect, so the applicable limit depends on when each comp was AUTHORISED rather than when it was written up; and the class column is the desk's own coding, so a room night written up as a dining credit is checked against the wrong limit, the wrong second-signature threshold and the wrong reinvestment percentage. Both of those live in the comp's own narrative and nowhere else. On this corpus a pure-column pass reaches the wrong disposition on 16 of 62 registers for exactly those two reasons. The spreadsheet join an auditor does by eye — comp to tier to matrix revision to class limit to second-signature threshold to the patron's theoretical — sixty registers deep at period end. It replaces the JOIN, not the judgement: nothing here voids, approves or reports anything.

Audience

Internal audit and casino compliance at a property or a group: the people who sample comps after the fact and have to say, per comp, whether the person who issued it held the authority. Every number on these pages came from one real run of this code, not from a vendor page.

The inputThe actual comp issuance registers

The corpus is 62 comp issuance registers, 0.21 MB (json 3 · jsonl 1 · md 2 · txt 62). A comp register is the smallest document on which the whole authority question is decidable: the matrix, the patron's play and the comps are all on one sheet, so nothing has to be fetched and every arm reads exactly the same thing. It is generated because a real register is a property's own control record and there is no public one to license — and generating it is what makes the ANSWER KEY derivable rather than typed, which is the whole basis of every number on this page. 261 of the 277 comps are settled by the columns alone; 16 are not, and those 16 are the corpus.

The corpus

  • The 62 comp issuance registersgenerated from a fixed seed, so no real record, person or institution appears in it.
  • Where each came fromNowhere — all 62 registers, data/register.json and the whole answer key are generated in-process by the file that sits beside them. Every property, desk, host, patron, comp reference, date, amount and narrative is invented. CAM-2026 is invented too and is not a gaming regulation, a commission rule or any real property's delegation of authority. See data/SOURCES.md.

Swap this folder for your own material and the kit is pointed at your comp issuance registers. That is the whole change — there is no database to migrate.

One comp issuance register, as the model receives itCR-0001.txt · 1 of 62
COMP ISSUANCE REGISTER - APPROVAL AUTHORITY AUDIT

REGISTER HEADER
  Register           CR-0001
  Property           Aurelia Grand
  Desk               Player Development, West
  Period covered     2026-01-01 to 2026-01-07
  Prepared by        M. Hallberg

APPROVAL AUTHORITY MATRIX (CAM-2026, this property's own delegation of comp authority)
  Revision in force       B, effective 2026-01-04. A comp authorised BEFORE that date is
                          tested against revision A, which this panel also prints.
   Rev  Tier  Role or rule                             Room         Dining           Show      Free play
   A    T1    Host                                        -        $750.00        $300.00              -
   A    T2    Senior host                         $1,550.00      $1,750.00      $1,000.00              -
   A    T3    Shift manager                       $3,600.00      $2,900.00      $2,650.00      $1,600.00
   A    T4    Casino manager                     $11,300.00      $8,950.00      $7,400.00      $4,450.00
   A    --    Second signature at or above        $1,400.00      $1,150.00      $1,050.00        $600.00
   B    T1    Host                                        -        $900.00        $400.00              -
   B    T2    Senior host                         $2,150.00      $1,550.00        $950.00      $1,000.00
   B    T3    Shift manager                       $4,700.00      $3,250.00      $2,250.00      $1,800.00
   B    T4    Casino manager                     $13,850.00      $9,800.00      $6,700.00      $4,000.00
   B    --    Second signature at or above        $1,850.00      $1,300.00        $900.00        $700.00
   --   --    Reinvestment ceiling                      35%            31%            22%            19%

Abridged — the file continues.

The outcomeWhat a good result looks like

One register in; a verdict on every comp, the matrix term it rests on, the amount at issue to the cent, one row copied verbatim as evidence, and CLEAR or EXCEPTIONS for the register — with the exception list and the total re-derived in code from the two things the model read.

And when it cannot

The register-level answer is the one to read with care. After the pure-code station the disposition and the exception list are right on 61 of 62 registers — but a register is only counted ALL CORRECT when every comp is right on all six graded fields, and the call returned a quoted row on 73 of the 231 comps that are within authority, where the answer contract says null. That caps registers all-correct at 11 of 62, below the free column floor's 46. The station does not repair a citation, deliberately: rewriting it would erase the evidence of the failure.

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 desks code the comp class correctly and your matrix has one revision in force for the whole period you are auditing. — the free column floor alone — python3 -m evals.run --floor rules
    Every question left is a table lookup, two comparisons and one multiplication. The floor is 261 of 277 comp verdicts and 46 of 62 registers for $0.00, no key and no network.
  • Your matrix was revised mid-period, or your hosts write up comps days after authorising them on the floor, or the class column is the desk's own shorthand. — the paid call, rechecked
    That is the only place it separates: 15 of the 16 reading-required comps against the column floor's 0, exact two-sided p = 0.00006. Everything else it does, code already does.
  • You need the exception REPORT — which comps, which rule, how much — rather than a score. — the paid call, rechecked, and read the disposition line
    The disposition and the exact exception list are right on 61 of 62 registers after the station, against the column floor's 46. That is the artefact an audit committee reads.

And where nothing here is good enough:

  • You want the reply itself to be the artefact — verdicts, amounts and quotes, as written, with no post-pass. — neither, yet
    The arm as answered reaches 180 of 277 comp verdicts and 9 of 62 registers. The product is the reply PLUS src/recheck.py, and the gap between the two columns is the whole measurement.

At a glanceHow the whole thing runs

98%register disposition correct rechecked pct
3,725 msp50, end to end

Run once, for real, on 2026-09-09. 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?Drop your own registers in data/corpus/ in the same fixed-column layout, add a matching row per register to data/register.json, and every free arm runs with no key. ⚠︎ A REAL REGISTER CARRIES PATRON IDENTITY, and this kit's corpus deliberately does not: every patron is a code, there is no name, no address, no document and no date of birth anywhere. Corpus lens →
When is this the wrong choice?Avoid: Paying for a reading you do not need — and paying it once per register, every period. That is the case against the best-fitting scenario (“Your desks code the comp class correctly and your matrix has one revision in force for the whole period you are auditing.”). 4 scenarios scored in all, each with its own. Eval lens →
Where does it stop working?A register whose comp rows do not match src/rules.py::LINE_RE's fixed layout. It does not parse leniently — the row is skipped and the comp never enters the denominator — which is the brittleness a forker has to replace first. 6 recorded failure modes, each from a run rather than a guess. Corpus lens →
What was never verified?A second scored run at the same tier. One run, one model; no repeat was bought, so nothing here separates a model's variance from a real difference. 6 items this kit says it could not check. Eval lens →
Can I run this on a model I control?The shipped adapter is one provider, one key, reached only through src/adapters/; the Prompt lens states what swapping it costs. The published figures come from 1 model on the fast tier, reasoning disabled (THE PUBLISHED RUN). Prompt lens →
And if it fits — what do I stand up?5 artifacts with a stated home and a stated egress, and 4 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-09 — r001-comp-authority. 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 clone with no key runs: tools/build_corpus.py --check (byte-identical), --check-fillers, python3 -m evals.check_labels (0 problems), all four floors through evals/baseline.py, --stub end to end, and the board on 127.0.0.1:9329 with the committed run replayed. The only thing that needs a key is one live call.

A living map of modern AI — kept current every morning