Home › Use Cases › Check that a room type means the same product in the CRS, the PMS and every channel
Use caseUC0287
🧪 Use-case kit · runnable

Check that a room type means the same product in the CRS, the PMS and every channel

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 hotel group sells one room through a CRS, holds it in a property's PMS and merchandises it on three or four channels, and each of those systems keeps its own table saying what a code means. Nobody writes those tables once. A room type is repointed when a floor is refurbished, a rate plan is cloned for a promotion, a channel is onboarded by somebody else's team on a Tuesday — and each of those touches one system. The tables drift and nothing fails: inventory still sells, the confirmation still prints. What breaks is at the desk, when a guest who booked one king arrives to two queens, or at month end, when a rate sold tax-inclusive on one channel and tax-exclusive on another and the property ate the difference. The eye-diff of three systems' mapping tables that a distribution team does before a season and not otherwise. ⚠︎ AND ON THIS CORPUS IT DOES NOT REPLACE THE CHEAP VERSION OF ITSELF: a column-and-phrase reader that ships in this repo gets 54 of 62 packets fully right for $0.00 against the paid call's 50.

Audience

A distribution analyst working a property's mapping set before a season, and the revenue manager who will act on whatever comes out. The decision is narrow: which rows go on this week's reconciliation list, and which ones do not. Every number on these pages came from one real run of this code, not from a vendor page.

The inputThe actual room-type and rate-plan mapping packets

The corpus is 62 room-type and rate-plan mapping packets, 0.30 MB (txt 62). It is generated because it has to be. A real mapping set is a join across a CRS export, a PMS export and one channel-manager extract per channel, and the three do not agree on column names, on code casing or on what a rate plan's inclusions field even contains. Publishing one would publish a group's whole product and price architecture. So the packets are invented end to end, and what is preserved is the SHAPE that makes the job hard: fixed-layout columns that a regular expression reads perfectly, and prose beside them that a regular expression cannot — a repoint the mapping table followed and a channel's listing did not, a correction note that withdraws a column, a bulletin quoting the standard's own rule where it does not apply, and a channel partner's letter asserting its audit found nothing.

The corpus

  • The 62 room-type and rate-plan mapping packetsgenerated from a fixed seed, so no real record, person or institution appears in it.
  • Where each came fromNowhere — every one of the 62 packets, the certification register and the whole answer key are generated in-process from seed 20260903, and --check rebuilds all 65 files byte-identically under five different PYTHONHASHSEEDs. data/SOURCES.md carries the full account, including what the generator costs the measurement.

Swap this folder for your own material and the kit is pointed at your room-type and rate-plan mapping packets. That is the whole change — there is no database to migrate.

One room-type and rate-plan mapping packet, as the model receives itRTM-0001.txt · 1 of 62
ROOM TYPE AND RATE PLAN MAPPING PACKET  RTM-0001

PACKET FACTS
  Property                 Harbourgate Court
  Property code            HC-4100
  Region                   Coastal North
  CRS                      Cirroline
  PMS                      Cobalt Front
  Live channels            OTA-A, OTA-B, GDS-C
  Extract date             2026-08-03
  Mapping set certified    2026-02-02

CRS MASTER - ROOM TYPES
  CODE  NAME                     ATTRIBUTES                             SELLABLE
  STDK  Standard King            occ 2 | 1 king | courtyard             sell yes
  STDT  Standard Twin            occ 2 | 2 twins | courtyard            sell yes
  SUPQ  Superior Queen           occ 2 | 1 queen | city                 sell yes
  DLXK  Deluxe King              occ 2 | 1 king | city                  sell yes
  DLXQ  Deluxe Twin Queen        occ 4 | 2 queens | city                sell yes

CRS MASTER - RATE PLANS
  CODE  NAME                     ATTRIBUTES                                                   SELLABLE
  BARR  Best Available           room only | tax exclusive | cancel 24h                       sell yes
  BBAR  Bed and Breakfast        breakfast for 2 | tax exclusive | cancel 24h                 sell yes
  AD14  Advance 14 Day           room only | tax inclusive | cancel non-ref                   sell yes
  CORP  Corporate Negotiated     breakfast for 2 + parking | tax exclusive | cancel 48h       sell yes

PMS MASTER - ROOM TYPES
  CODE  NAME                     ATTRIBUTES
  STDK  Standard King            occ 2 | 1 king | courtyard
  STDT  Standard Twin            occ 2 | 2 twins | courtyard
  SUPQ  Superior Queen           occ 2 | 1 queen | city
  DLXK  Deluxe King              occ 2 | 1 king | city
  DLXQ  Deluxe Twin Queen        occ 4 | 2 queens | city

Abridged — the file continues.

The outcomeWhat a good result looks like

One packet in, five graded answers out: how many mapping rows disagree, why they disagree, the position that puts the set in, whether the breaks go on the list, and the row that establishes the class copied verbatim.

And when it cannot

And what it does when it cannot. On three of the 62 packets the paid call read the columns and ignored the extract-correction note beside them, LISTED a break against a property that is in step, and nothing rescued it — the certification register is certified on all three, so src/recheck.py re-derived the same wrong answer. That is an analyst sent to repoint a mapping that is already correct.

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 mapping extracts are fixed-layout columns and your notes panel is empty or boilerplate — the free rules floor, and do not buy a call at all
    On 49 of these 62 packets the floor and the paid call agree and both are right. The whole of what the money buys is five packets where prose contradicts a column, and the paid call gives four of them back elsewhere.
  • Your extracts routinely carry correction notes, repoint records or standing bulletins beside the rows — the paid call, and read its own failure rate on that family first
    The floor gets the retracted-column family 0 of 6 and the paid call 3 of 6; the floor invents a break on 2 of the 7 bulletin packets and the paid call on none. That is the case for paying and it is five packets wide.
  • You are choosing between this and a rate-parity or commission-audit kit — this one only if the question is what a CODE MEANS
    Parity and commission both assume the two systems agree on the product. This kit is the check underneath them, and it produces no money figure at all.

And where nothing here is good enough:

  • You need the QUOTED ROW to be the one your reviewer would have picked — neither arm as shipped — decide what counts as the establishing row first
    Seven of the paid call's twelve misses are the citation alone, and all seven quoted a real row from the packet carrying the same fact as the labelled one. Nothing was hallucinated: citation_unlocatable is 0 of 39 quotes returned.

At a glanceHow the whole thing runs

50%packet all correct
50,374 msp50, end to end
$27.97per 1,000 room-type and rate-plan mapping packets · Gemini 3 Flash

Run once, for real, on 2026-09-03. 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 extracts, data/properties.json with your own certification register, and data/policy.json + data/policy.md with your own standard. ⚠︎ WHAT STOPS BEING TRUE THE MOMENT YOU DO. Corpus lens →
When is this the wrong choice?Avoid: Paying per property for an equality test between two parsed strings. That is the case against the best-fitting scenario (“Your mapping extracts are fixed-layout columns and your notes panel is empty or boilerplate”). 4 scenarios scored in all, each with its own. Eval lens →
Where does it stop working?A free-text or scanned extract. Everything the floor does and most of what the model does rests on the panels being fixed-layout rows with a code first. 7 recorded failure modes, each from a run rather than a guess. Corpus lens →
What was never verified?A second model. One tier, one scored run, one day — nothing here separates this model from its tier. 7 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-03 — r001-roomtype-map. 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:9287 — all 62 packets, both masters, every mapping row, both free floors computed live, RMS-2026's fourteen rules, the citation scoring and the committed scored run replayed off its result file. The only disabled control is the one that spends.

A living map of modern AI — kept current every morning