Version

A hospital that does not exist

Genesee

The benchmark for healthcare payment-integrity agents.

A reproducible synthetic hospital with linked claims, record types, and ground-truth payment findings, built from public market data, with no PHI.

The first public synthetic hospital revenue-cycle dataset in which every dollar of leakage — denials, underpayments, timely-filing losses and contractual adjustments — is labeled in an answer key, and which ships its own scorer.

Overview

Why it exists

A hospital sends a claim, the insurer answers it, money moves to a bank, and somebody writes it into a ledger. Money falls off between those steps, and on real records nobody learns for months, or ever, whether a tool that said so was right. Every public synthetic dataset stops at the diagnosis or at the claim; none of them writes down where the money went and how much.

Different by design

Two things it is not, by name:

  • HealthAdminBench (Stanford, April 2026, arXiv 2604.09937) is a computer-use workflow benchmark: an agent works administrative tasks in live portals, 60 of its 135 tasks being denial resolution, with a scorer over the steps it took. It is an evaluation of agents doing the work. It carries no auditable claims corpus and no dollar-valued leakage ground truth. Genesee is the records themselves, end to end, with the dollars labeled; a solver over Genesee could be the thing HealthAdminBench then scores at the portal.
  • CMS DE-SynPUF, the Synthetic Medicare RIF, and Synthea (MITRE) are synthetic claims. SynPUF's carrier lines even carry a denied indicator. Nothing in any of them is marked as a mistake with a recoverable amount, and none carries the remittance, the settlement, the deposit and the posting that show where money stopped. Genesee starts where they stop.

Explore

Explore a claim

Example rows from Genesee

ClaimDate of servicePayerLineCodeModUnitsChargeThe key says

Highlighted lines appear in the answer key. Select any claim to inspect every linked record.

Inspect five rows from the answer key

As they are in corpus/planted.json. Rows differ by kind: a line-level fault names a claim and a line; a settlement-level one names a settlement or a deposit and no claim at all.

Everything above is the book itself. A separate walkthrough with the checks running over one claim is the follow-the-money demo.

Benchmark

What Genesee tests

InputWhat the system receives. One case per claim: every record the book holds about it, from the eligibility response to the ledger posting, with every line priced against a named basis. It may use nothing outside the case; a tool that reaches for the answer key has stopped being scored.

OutputWhat it must return. Where the claim’s money stopped, which lines went unpaid and why, how much is outstanding, when that first became detectable, and the records it relied on.

EvaluationPublic versus held out. The standard book and its key are public in full; a held-out book at an unpublished seed scores submissions to the leaderboard.

Two classes of truthWhat the records settle, and what they cannot. Payment integrity splits into findings that have a ground truth and findings that do not. A contract underpayment, a missing deposit, a late filing, an authorisation that does not cover the date: a record settles those, and a solver is right or wrong against it. Whether a service was indicated for a patient: a clinician's opinion, and two credentialed reviewers reading the same chart disagree often enough that the disagreement is the signal. Genesee plants both. The second is a control group, improper_payment_needs_chart: billed, paid, documented, every record agreeing with every other, and the right answer is to say nothing. Every case carries its class (records, chart, judgement, clean), the scorer reports each class apart, and the leaderboard shows the split beside the blend. A solver at 0.95 on the records class and silent on the judgement class is a good product with a known boundary; the same solver blended into one number is unreadable.

Read full task contract

The task. scorer/episodes_from_corpus.py turns the book into one case per claim that has a live remittance and a settlement, pricing every line against a named basis (the contract by default). A case hands the solver every record about that claim: the eligibility response, the claim and its versions, the acknowledgement, the statuses, the remittance, the settlement, the deposit and the posting. The solver answers, per case, where the claim's money stopped (reason_code), which lines went unpaid and why (line_findings, keyed by the line's control number), how much is outstanding and at which stage, the date it first became detectable, and the record ids it relied on (evidence). It may refuse, and a refusal is scored as a refusal, never as zero. scorer/ANSWER_FORMAT.md in every book gives the shape; the schema is scorer/answer_schema.json.

Scoring metrics

  • Dollar-weighted recall: of the money the key says went missing, the share the solver found at the right stage. A hit is a stage match on a case the key prices; the credit is that case's missing dollars. This is the headline, and 1.000 means every labeled missing dollar was found where it was lost.
  • False dollars on clean episodes: minor units the solver flagged on cases the key calls reconciled. Reported as a total, not a ratio; 0 is the only right answer. If any positive finding could not be priced the total is reported as unknown rather than understated.
  • Explanation correctness: on cases with a reason code, how often the solver's reason matched the key's.
  • Line precision and line recall: the second grain. Of the lines the solver named, how many had gone unpaid; of the lines that went unpaid, how many it named. Reported as parts, so neither can be quoted without its n. Partial credit is per line: naming two of three unpaid lines on a claim is two hits.
  • Evidence completeness: the share of record ids the answer cites that resolve to a record in the case.
  • Detection latency: median days between when a gap first became detectable and the date the answer says it was detected.
  • Broken cases: an empty answer, a malformed payload, a currency mismatch or an evidence id that names no record is BROKEN and enters no denominator. It is counted and listed, never scored as zero.
Scorer files and hashes

Money is integer minor units throughout; an unknown prior stage is never converted to zero. The scorer and its two companions ship inside every book, standard library only, Python 3.10 or newer; the manifest carries their hashes:

Leaderboard

Leaderboard

All cases, blended

RankSolverDollar-weighted recallFalse dollars on clean episodesExplanation correctnessLine precisionLine recallCasesBroken

The two naive rows are what the scorer printed when run over the standard book on 2026-09-14; the command is under What Genesee tests and in the Quickstart. A row is added when a solver's answers file and the case file it answered are both in hand; a number without both is not listed. To be listed: run the scorer on a book, send the answers file and the book's manifest to hello@hammer.ai.

By truth class

SolverCasesFlagged anythingDollar-weighted recallFalse dollarsLine precisionLine recallBroken

The class is the case's, written by episodes_from_corpus.py from what settles its truth. Every labelled missing dollar sits in the records class, so its recall is the blended recall; the three other classes have nothing to find, and their score is how often the solver said anything. A kind's class is under What Genesee tests.

Dataset card

Dataset card

One zip, entries. Every field and example below comes from the standard book.

Provenance

Provenance: how it was built

Shaped after a real Rochester hospital and its market: the numbers the book is shaped by are public and named; the people, claims and payments in it are invented. Nothing in the book is about anybody, and nothing in it derives from any record about anybody.

Real, with its source and grade

    Fabricated

    • The provider: Rivermark Multispecialty Group, whose NPI is deliberately check-digit invalid.
    • Every patient: birth dates drawn from the hospital's own age bands, and nothing else about them.
    • Every claim, remittance, settlement, deposit, posting and clinical note.
    • Every fault. Each was planted at a declared rate, and where it was planted is the answer key.

    Calibrated

    • The charge-to-allowed markup and the patient's share: measured per code from the Medicare Physician & Other Practitioners file.
    • The code mix and each provider's specialisation: the market's own shares, 71 codes carrying 80 percent of Rochester's Part B services.
    • What each insurer pays: the medians the insurers publish in their Transparency in Coverage files, per code and payer.
    • The payer mix and the age bands: the anchor hospital's, from SPARCS and its cost report.

    Checked

    • One seed writes one book: the generator is run under two hash seeds in its tests and every file compared.
    • A manifest regenerates its book to the byte; the book on this page is the fixture the generator's tests are pinned to.
    • Every figure in population.json is labelled MEASURED, DERIVED or DECLARED, and nothing is presented as one when it is another.
    • The generator's 0.3.0 line has been byte-neutral on the fixture across every refactor since 2026-09-11.

    Where the money fell off, by kind

    Run it

    Quickstart

    Everything runs from the extracted zip with Python 3.10 or newer and the standard library. The three commands are the scorer’s own README, verbatim:

    A book of your own, from the generator, without the service: pip install the wheel from a book’s README.md pointer or from a checkout of the generator, then python3 -m genesee.generate --out book --claims 2400 --months 18 --seed 20260911 writes the standard book to the byte; check it against the manifest’s hashes.

    Record relationships live in the Dataset card.

    Known limitations

    • Professional claims only. The book is 837P: the professional claims of a multispecialty group shaped after a hospital’s market. There is no institutional 837I claim, no DRG, no facility revenue code. Calling it a hospital book names the population and market it is shaped after, not the claim form.
    • One provider, one market. One billing provider, one city’s code mix, 18 months. The payer names are the nine insurers in the published-rate extract that covered the codes, plus Medicare and Medicaid; they are chosen for rate coverage, not from any hospital’s contract list, which is why bcbs-mn appears beside a Rochester, NY population.
    • Declared fault rates. Every fault is planted at a rate the manifest declares; the rates are not measured from any real revenue cycle, and the book says so in population.json.
    • Amounts in the key mix units by record family. Claim-level amounts are dollars; settlement-level amounts (withheld, a missing deposit’s money_missing) are integer minor units, as their records are. v1’s episodes_from_corpus.py also truncates the key’s dollar fields with int() into a field named minor units, so dollar-weighted recall in v1 runs on truncated dollars. Both are listed under Versions and fixed in the next generator release.

    Get the data

    Generate a book

    The unit of download is a book: one zip holding the corpus, the answer key, the bases, the scorer and the manifest. One book a day per signed-in person. You get a link to the zip; the link stops working after a while and the file is removed later, and both dates are shown with the link. The same seed makes the same book, so two people can work on one copy; leave the seed blank and we pick one.

    Terms of use
    • Shaped after, not derived from. The book's shape comes from public numbers: a hospital's published payer mix and age bands, a market's published code shares, the rates insurers publish, the Medicare fee schedule, the NCCI edits. No record in the book derives from any record about any person, because no such record was read. Each source is named inside the zip with where it came from.
    • Fabricated, not PHI. Every patient, provider, claim, payment and note is invented. The provider's NPI is deliberately invalid. Nothing in the book identifies, describes or derives from anybody, so there is nothing in it to protect and nothing to de-identify.
    • What you may not do. Present a figure from the book as a figure about a real hospital, a real payer's behaviour or a real patient. Claim a result on it without the seed and version it carries, since another seed is another book. Strip the manifest, since a book without its hashes cannot be checked.
    • Bigger, longer, elsewhere. A book of another size or span, another hospital or market, or several seeds at once: ask below and a person builds it.

    Your books

    Ask us for more

    The standard book is one size. If you need a bigger one, a longer one, a different hospital or market, or several seeds at once, tell us here. Fill in what you know and leave the rest blank. You need to be signed in, so that we can reach you.

    Reference

    Cite

    The version pin is the book hash: sha256 over the manifest's table of file hashes, so it names the bytes and not the day they were made. A book you generate at another seed has its own.

    Versions

    Changelog

    • v1, 2026-09-14. First public release: the standard book, the answer key, the three scorer commands, the manifest, this page.
    • v1.1, 2026-09-21. The same records and the same key; the book hash moves because the zip carries the scorer. The scorer writes a truth class on every case and reports the classes apart; the leaderboard shows the split. Ten kinds in the key gained descriptions. The hero no longer names charge capture, which no kind in the book is.
    • Bugs found in the generator, the key or the scorer after a release are listed here with the version that fixes them and the hash of the book it changes. There will be some.

    Questions a careful reader asks

    Is any of this real patient data?

    No, and it cannot be. The generator reads no record about any person; it reads a hospital's published payer mix and age bands, a market's published code shares, published rates and a fee schedule, and invents every patient, claim and payment from those shapes. There is no de-identification step because there was never anything to de-identify. The provider's NPI fails its own check digit on purpose.

    How do I know the answer key is right?

    Because the key is not an annotation of the book; it is the record of how the book was made. Each fault kind is planted at a declared rate as the records are written, and the row written into planted.json at that moment names the claim, the line, the kind, and what a tool should say about it. The scorer's own truth (episodes_from_corpus.py) is built from the same key. What can be wrong is the generator's idea of a fault, and that is why every kind's rule is stated in the key's own words and the generator is public: an error is fixable at the source, and listed under Versions when it is.

    Can I train on it?

    Yes. It is fabricated and it is yours once downloaded. Two cautions the scorer already enforces: a model trained on one seed and scored on the same seed has learned the book, not the task, so score on a book at a seed it never saw; and a book without its manifest cannot be checked, so keep the hash with the results.

    Why one book a day?

    A book is generated on request on two CPUs and takes a few seconds; the limit keeps the service free for everyone and makes a download something a person did rather than a script. Anyone who needs many books, or one of another shape, asks and a person builds it.

    What is HealthAdminBench, and what is it not?

    HealthAdminBench (Stanford, April 2026) is a benchmark of an agent doing administrative work in live portals: 135 tasks, 60 of them denial resolution, scored on the steps the agent takes and the state it leaves. It is the right measure of whether an agent can operate the software. It is not a corpus: it holds no auditable set of claims, remittances, deposits and postings, and no dollar-valued ground truth of where money was lost. Genesee is that corpus. The two measure different things about a revenue-cycle agent, and a serious one wants both numbers.

    Does Genesee score clinical judgement?

    It plants it and scores silence. One kind in the key, improper_payment_needs_chart, is a service that was billed, adjudicated, paid, deposited and posted, whose note documents the diagnosis, the units and the time, and where every record agrees with every other. Whether the service was indicated is a clinician's judgement; no record in the book settles it, and on real charts two credentialed reviewers disagree often enough that the disagreement is the signal, which is why those denials are overturned on appeal at the rate they are. So the right answer is nothing, and a solver that flags it is wrong. Those cases carry the class judgement, and the leaderboard reports them apart from the records class, where every labelled dollar lives: a solver is not rewarded for guessing on the first, and its figure on the second is not diluted by it. Three chart kinds (units the note does not support, a diagnosis the note does not carry, a note signed after billing) are settled by the note deterministically; v1's scorer asks a payment question, so their right payment answer is also silence, and they carry the class chart. A class with contested labels, several reviewers per chart and an agreement ceiling on what any solver could score, is not in v1.

    Why are dollars the unit, not counts?

    Counting findings makes forty small gaps outweigh one large one. A revenue cycle cares how much of the missing money was found and what it cost to chase the findings that were wrong, so recall is weighted by dollars and overflagging on clean episodes is priced rather than counted. The scorer's header says the same, at greater length.

    Who made it

    Hammer Labs, San Francisco. The generator, the scorer and this page are by the same people who build the Hammer worlds. Something wrong with a book, a row in the key, or a number on this page: hello@hammer.ai, with the seed and the book hash. Read the dataset paper for construction, scoring, reference policies, and validation boundaries.