Home › Use Cases › Check a rostered person's gameday credential against the records and the role matrix
Use caseUC0305
🧪 Use-case kit · runnable

Check a rostered person's gameday credential against the records and the role matrix

A small, forkable project that does one job end to end. Run twice for real over the same set, and every figure on these pages captured from those runs.

The business caseThe problem this solves

Twenty minutes before doors, a credentialing desk has a roster row a staffing coordinator typed and a handful of badge records a system offered for it. Two of the questions in front of them are not lookups: which of these records IS this person, and what is this shift in the venue's own vocabulary. A roster carries the name a coordinator types and a badge carries the name recorded when it was cut — a familiar form, an initial, a compound surname filed short, a surname changed since the badge was issued with only a note joining them, a dropped diacritic, a father and a son working the same fixture. And role as written is free text: a shift mentioning a pyrotechnic store may be a security door, a shift mentioning first aid may be moving boxes with no patient contact. Joining a roster row to three badge records by eye, checking four requirement codes against two dates and a training list, and writing down which line said so — one person at a time, for a whole gameday roster, before doors.

Audience

A credentialing supervisor working a gameday roster before doors, and the staffing coordinator who has to fix whatever comes back. The decision they are making is what to walk over to the desk about — not who gets in. Every number on these pages came from one real run of this code, not from a vendor page.

The inputThe actual gameday credential check sheets

The corpus is 62 gameday credential check sheets, 0.12 MB (txt 62). It is generated because it has to be. A real gameday credential file is a named human being's identity document, their background check and somebody's judgement about both, and there was never a real one to reduce. What it exercises is the two joins nobody can do with a lookup — a roster name against a badge name, and a coordinator's sentence against a matrix of nine role codes — with the whole rulebook around them deliberately made easy, so that what separates the arms is the reading and nothing else.

The corpus

  • The 62 gameday credential check sheetsgenerated from a fixed seed, so no real record, person or institution appears in it.
  • Where each came fromNowhere — every one of the 62 check sheets, the roster and the whole answer key are generated in-process by the file that sits beside them. Harborline Field is not a venue, the Kestrels and Northmoor Wanderers are not clubs, HLF-CRD-2026 is not a standard and HLF-RM-7 is not a requirement matrix.

Swap this folder for your own material and the kit is pointed at your gameday credential check sheets. That is the whole change — there is no database to migrate.

One gameday credential check sheet, as the model receives itCRW-0001.txt · 1 of 62
CREW CREDENTIAL CHECK SHEET                                      CRW-0001
Harborline Field - Match Day 14 - Kestrels v Northmoor Wanderers
event date 2026-10-03 - doors 17:30 - kick-off 19:45

ROSTER ROW as the staffing coordinator filed it
  name on roster    Ingrid Astrelle
  employer          Tidewater Event Services (contracted vendor)
  role as written   usher, front of house, lower bowl, reporting to the SLO desk
  zones required    Z1, Z2
  shift             2026-10-03 15:00-23:30
  coordinator note  none

CREDENTIAL RECORDS ON FILE narrowed in code to the records the credentialing system offered for this roster row

  HB-4007  holder            Ingrid Astrelle
  HB-4007  credential type   Guest services
  HB-4007  zones granted     Z1, Z2, BOH
  HB-4007  valid             2026-08-01 to 2027-06-30
  HB-4007  issued for        the 2026-27 season, all home fixtures
  HB-4007  background check  BG-STD cleared 2026-06-02
  HB-4007  training on file  TRN-SAFE valid to 2027-09-26, TRN-CROWD valid to 2027-06-18
  HB-4007  photo ID          verified 2026-07-22
  HB-4007  record status     active

  HB-9005  holder            Farida Astrelle
  HB-9005  credential type   Guest services
  HB-9005  zones granted     GATE
  HB-9005  valid             2026-08-01 to 2027-06-30
  HB-9005  issued for        the 2026-27 season, all home fixtures
  HB-9005  background check  BG-STD cleared 2026-06-02
  HB-9005  training on file  TRN-SAFE valid to 2027-05-30, TRN-CROWD valid to 2027-10-04
  HB-9005  photo ID          verified 2026-07-22
  HB-9005  record status     active

  HB-9006  holder            Oscar Astrelle
  HB-9006  credential type   Concessions
  HB-9006  zones granted     Z1, CONC
  HB-9006  valid             2026-08-01 to 2027-06-30

Abridged — the file continues.

The outcomeWhat a good result looks like

One rostered person in, five graded answers out: the badge id that is this person or an explicit null, the role code from a matrix of nine, every requirement that role needs which the badge does not satisfy, one verdict from a closed set of seven, and one line of the sheet the verdict turns on.

And when it cannot

And what it does when it cannot. On this corpus it did not fail on either reading — 62 of 62 on both — and that is a CORPUS result, not a kit result. Where it does fail is the citation as answered: it quoted a line outside the set the standard admits on 4 of 62 sheets. And its own pure-code station is wrong on 3 more, on every arm, because a scope that EXCEPTS two dates reads as an enumeration to a token rule; the model read all three correctly and the station overruled it.

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 roster system and your badge system already agree on names, and your role field is a code — the free rules floor alone — evals/baseline.py
    Both readings become lookups and the rulebook was always free. The floor is 9 of 9 on an expired credential, 9 of 9 on missing training, 4 of 4 on nobody-found and 3 of 3 on a duplicate badge, for $0.00.
  • Your roster is typed by coordinators and your badges were cut from HR records — the paid call, and read badge_correct before anything else
    That is the whole margin: 62 of 62 against 57, and 17 of 17 on the sheets where the two names differ against the floor's 12.
  • Your role field is free text written by more than one person — the paid call
    3 of 3 where a shift carries another role's vocabulary, against the floor's 0 of 3. A keyword table over your matrix's own words is a good free rule and it is not a reading.
  • You want the verdict enforced rather than answered — src/recheck.py, on either arm
    It keeps only the two readings and re-derives everything else from the standard, so a reply that read the sheet correctly and then applied the rules in the wrong order comes back right anyway — 35 overrides on 62 checks.

At a glanceHow the whole thing runs

95%rechecked check all correct pct · 2 runs, no ordering
40,677 msp50, end to end
$8.49per 1,000 gameday credential check sheets · openai/gpt-5-6-luna

Run twice over the same set, for real, the last on 2026-09-03. Every figure on these pages was captured from those runs — 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 check sheets in the same columnar shape, data/matrix.json with your own role codes and requirements, and data/policy.md plus data/policy.json with your own rules and THEIR ORDER. ⚠︎ WHAT STOPS BEING TRUE THE MOMENT YOU DO. Corpus lens →
When is this the wrong choice?Avoid: Paying for a join you do not have. That is the case against the best-fitting scenario (“Your roster system and your badge system already agree on names, and your role field is a code”). 4 scenarios scored in all, each with its own. Eval lens →
Where does it stop working?A sheet whose credential lines are not HB-nnnn label value with two spaces between columns. src/packet.py splits on runs of two or more spaces and a single-space file parses to nothing. 8 recorded failure modes, each from a run rather than a guess. Corpus lens →
What was never verified?THE CEILING WAS NOT REACHED AND THE CORPUS CANNOT SAY WHERE THE READING BREAKS. badge_correct and role_correct are both 62 of 62 on both paid runs. 10 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 3 models on the fast tier and pure Python, no key and the majority class, reads nothing, 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-03 — r001-crew-credential. 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:9305, scores both free floors over all 62 checks offline, rebuilds the corpus byte-for-byte from its seed, re-derives the answer key from scratch through evals/check_labels.py, and replays the committed scored run for $0.00. Nothing was installed to do any of it; requirements.txt names no package because nothing under src/ or evals/ imports one.

A living map of modern AI — kept current every morning