This is a product-class write-up, not a named-client story and not a results press release. Counts below describe the pack we actually write (approach points, tools, layers) — not invented bug totals or conversion lifts.
Overview
Search said available. Chat said “I reserved it.” Checkout then failed — or worse, both checkouts succeeded against a stale cache.
Hotel-local midnight vs user timezone shifted a one-night stay into a sold-out date the concierge still described as open.
Oversell is the hospitality P0. An assistant that states availability without a hold is oversell with friendlier grammar.
Highlights
- Same inventory path for UI and chat
- Timezone as a test dimension
- Load + correctness
Typical launch bar: Wait until journeys and evals agree — do not ship on demo scores alone.
Challenges
Inventory lock TTL expired during a long chat, and the model did not refresh.
Multi-room bookings mixed occupancies in the tool arguments.
Weekend search spikes hid 5xx behind a cached “available.”
How we tested
Two-user last-room test: one success, one clean fail.
Chat availability from the same hold service as checkout.
Price at search matches checkout; occupancy and dates include timezone.
Supplier failure rolls back payment.
Starting point vs what we required
| Starting point | What we required |
|---|---|
| Inventory lock TTL expired during a long chat, and the model did not refresh. | Two-user last-room test: one success, one clean fail. |
| Multi-room bookings mixed occupancies in the tool arguments. | Chat availability from the same hold service as checkout. |
| Weekend search spikes hid 5xx behind a cached “available.” | Price at search matches checkout; occupancy and dates include timezone. |
What we delivered
Journeys / UI
- Playwright — Last-room race including chat hold
API / contract
- Postman — Hold TTL and supplier rollback
Load / soak
- k6 — Weekend search spike
LLM traces / evals
- LangSmith — Hold tool vs spoken availability
Outcomes
Concierge holds used the same lock as checkout, with visible expiry. Tool arguments for occupancy were schema-validated.
k6 on weekend search plus a functional oversell assertion, not only p95.
Stack
| Layer | Tool | What we validated |
|---|---|---|
| Journeys / UI | Playwright | Last-room race including chat hold |
| API / contract | Postman | Hold TTL and supplier rollback |
| Load / soak | k6 | Weekend search spike |
| LLM traces / evals | LangSmith | Hold tool vs spoken availability |
Same method as the rest of our work: severity-ranked findings, pass rules in writing, and a ship / wait / block call. See the evaluation method and tool comparison.