Booking failure test bench
A plumbing call where the booking system refuses one detail. Nothing is confirmed, only that detail is asked again, and the visit is booked.
Public-service example for Rescue Residential Group. Simulated booking backend. No live bookings. Not affiliated.
Service call
Plumbing, Wed, Sep 23
- Customer
Dana Whitfield
- Cell
(510) 555-0187
sent as 5105550187
dana.whitfield@gmial.com
dana.whitfield@gmail.com
- Service address
3120 Walnut Avenue, Fremont 94538
Alameda County, accepted by the address check
- Problem
Water heater leaking in the garage
- Requested
Thursday, Sep 24, 8 to 11 a.m. PDT
America/Los_Angeles
“Thursday”, “between 8 and 11 in the morning”
Refused by the booking system. No mail server answers for gmial.com. Nothing was confirmed to the caller; only the email was asked again, and the 10 other details were kept.
What the caller heard
“You're booked for Thursday, September 24, between 8 and 11 a.m., at 3120 Walnut Avenue, Fremont. Your confirmation number is RB-40217.”
Built by code from the booking system’s response.
Three failures, run live.
Claude Sonnet 5 plays the agent, a scripted caller plays the customer, and the layer that decides what the caller hears is the one the tests below run.
Real model, real latency
The booking system refuses one detail. No success is announced, only that detail is asked again, and the rest is kept.
The call
Prepared run: scripted model turns on a simulated clock
- 0.0CallerCaller
Hi, my water heater is leaking in the garage. Could someone come out Thursday, between 8 and 11 in the morning? I'm Dana Whitfield, at 3120 Walnut Avenue in Fremont, 94538. My cell is (510) 555-0187, home phone 510-555-0142, and my email is dana.whitfield@gmial.com.
- 0.0AgentAgent
I'm sorry to hear about the leak, Dana. Let me take down your details.
- 0.1AgentAgent
Thank you. So that's a leaking water heater at 3120 Walnut Avenue in Fremont, on Thursday between 8 and 11 in the morning. I have your cell as (510) 555-0187 and your email as dana.whitfield@gmial.com. Shall I go ahead and book it?
- 0.1CallerCaller
Yes, that's right. Please go ahead and book it.
- 0.3AgentAgent
I'm sorry, the booking system didn't accept the email address dana.whitfield@gmial.com. Could you spell it for me?
- 0.3CallerCaller
Oh, sorry, that's gmail. G-M-A-I-L. dana.whitfield@gmail.com.
- 0.3AgentAgent
Thank you.
- 0.5AgentAgent
You're booked for Thursday, September 24, between 8 and 11 a.m., at 3120 Walnut Avenue, Fremont. Your confirmation number is RB-40217.
Built by the booking layer from the booking system’s answer
- 0.5AgentAgent
Perfect, you're all set!
Not spoken. Only the confirmation built from the booking system's response is spoken.
Is there anything else I can help you with?
- 0.5CallerCaller
No, that's all. Thank you.
Work order and trace
Service call
Plumbing, Wed, Sep 23
- Customer
Dana Whitfield
- Cell
(510) 555-0187
sent as 5105550187
- Home
(510) 555-0142
sent as 5105550142
dana.whitfield@gmial.com
dana.whitfield@gmail.com
- Service address
3120 Walnut Avenue, Fremont 94538
Alameda County, accepted by the address check
- Problem
Water heater leaking in the garage
- Requested
Thursday, Sep 24, 8 to 11 a.m. PDT
America/Los_Angeles
“Thursday”, “between 8 and 11 in the morning”
Refused by the booking system. No mail server answers for gmial.com. Nothing was confirmed to the caller; only the email was asked again, and the 10 other details were kept.
What the caller heard
“You're booked for Thursday, September 24, between 8 and 11 a.m., at 3120 Walnut Avenue, Fremont. Your confirmation number is RB-40217.”
Built by code from the booking system’s response.
- 0.0
11 values recorded from the caller’s words
- 11 values, each found in the caller’s own words before it was kept. Phone numbers, the day and the window are shown as read.
Arguments and answer as JSONHide the JSON
What the model asked for
{ "details": [ { "field": "first_name", "value": "Dana", "caller_words": "I'm Dana Whitfield" }, { "field": "last_name", "value": "Whitfield", "caller_words": "I'm Dana Whitfield" }, { "field": "cell_phone", "value": "(510) 555-0187", "caller_words": "My cell is (510) 555-0187" }, { "field": "home_phone", "value": "510-555-0142", "caller_words": "home phone 510-555-0142" }, { "field": "email", "value": "dana.whitfield@gmial.com", "caller_words": "my email is dana.whitfield@gmial.com" }, { "field": "street", "value": "3120 Walnut Avenue", "caller_words": "at 3120 Walnut Avenue" }, { "field": "city", "value": "Fremont", "caller_words": "in Fremont" }, { "field": "zip", "value": "94538", "caller_words": "94538" }, { "field": "problem", "value": "Water heater leaking in the garage", "caller_words": "my water heater is leaking in the garage" }, { "field": "date", "value": "2026-09-24", "caller_words": "Thursday" }, { "field": "window", "value": "08:00-11:00", "caller_words": "between 8 and 11 in the morning" } ] }After this step: not booked; the booking system holds 0 bookings.
- 0.1
Address accepted: Alameda County
- No appointment times came back, and none were expected: the requested window is what gets booked.
- Fremont is in Alameda County, one of the four counties the company publishes.
Arguments and answer as JSONHide the JSON
Sent to the booking system
{ "street": "3120 Walnut Avenue", "city": "Fremont", "zip": "94538" }The booking system’s answer
{ "status": "in_area", "city": "Fremont", "county": "Alameda", "times": [] }After this step: not booked; the booking system holds 0 bookings.
- 0.3
Booking system rejected the email
- Attempt 1, assembled from the recorded values, not from the model's words.
- No mail server answers for gmial.com. Nothing is booked, and the caller is not told otherwise.
- Kept as confirmed: first name, last name, cell phone, home phone, street address, city, ZIP code, problem, day, time window.
- Demo setting
- Hold phrase after 1.2 s in flight; idle prompt after 4.0 s of silence; wait limit 8.0 s.
- Observed
- answer at 0.18 s (simulated clock).
Arguments and answer as JSONHide the JSON
What the model asked for
{ "caller_agreement": "Please go ahead and book it" }Sent to the booking system
{ "idempotency_key": "bk-prepared-reject-64769d45", "request": { "customer": { "first_name": "Dana", "last_name": "Whitfield", "email": "dana.whitfield@gmial.com", "cell_phone": "5105550187", "cell_country_code": "1", "home_phone": "5105550142" }, "service_address": { "street": "3120 Walnut Avenue", "city": "Fremont", "state": "CA", "zip": "94538" }, "service": { "trade": "plumbing", "description": "Water heater leaking in the garage", "caller_words": "my water heater is leaking in the garage" }, "requested_window": { "date": "2026-09-24", "start": "08:00", "end": "11:00", "time_zone": "America/Los_Angeles" } } }The booking system’s answer
{ "ok": false, "errors": [ { "field": "email", "code": "no_mail_server", "message": "No mail server answers for gmial.com." } ] }After this step: rejected; the booking system holds 0 bookings.
- 0.3
Value changed: email only
- email changed: dana.whitfield@gmial.com → dana.whitfield@gmail.com, from “dana.whitfield@gmail.com” (caller turn 3)
- Kept as confirmed: first name, last name, cell phone, home phone, street address, city, ZIP code, problem, day, time window.
Arguments and answer as JSONHide the JSON
What the model asked for
{ "details": [ { "field": "email", "value": "dana.whitfield@gmail.com", "caller_words": "dana.whitfield@gmail.com" } ] }After this step: not booked; the booking system holds 0 bookings.
- 0.5
Booked: RB-40217
- Attempt 2 differs from attempt 1 only in customer.email.
- Success for this call and these exact details.
- The confirmation the caller heard was built by code from this response.
- Demo setting
- Hold phrase after 1.2 s in flight; idle prompt after 4.0 s of silence; wait limit 8.0 s.
- Observed
- answer at 0.18 s (simulated clock).
Arguments and answer as JSONHide the JSON
What the model asked for
{ "caller_agreement": "Please go ahead and book it" }Sent to the booking system
{ "idempotency_key": "bk-prepared-reject-bf559c95", "request": { "customer": { "first_name": "Dana", "last_name": "Whitfield", "email": "dana.whitfield@gmail.com", "cell_phone": "5105550187", "cell_country_code": "1", "home_phone": "5105550142" }, "service_address": { "street": "3120 Walnut Avenue", "city": "Fremont", "state": "CA", "zip": "94538" }, "service": { "trade": "plumbing", "description": "Water heater leaking in the garage", "caller_words": "my water heater is leaking in the garage" }, "requested_window": { "date": "2026-09-24", "start": "08:00", "end": "11:00", "time_zone": "America/Los_Angeles" } } }The booking system’s answer
{ "ok": true, "booking": { "reference": "RB-40217", "window": { "date": "2026-09-24", "start": "08:00", "end": "11:00", "time_zone": "America/Los_Angeles" }, "service_address": { "street": "3120 Walnut Avenue", "city": "Fremont", "state": "CA", "zip": "94538" }, "sms_to": "5105550187", "created": true } }After this step: booked; the booking system holds 1 booking.
Demo settings and the example backendHide the demo settings
Demo settings: a hold phrase after 1.2 s in flight; “are you still there?” after 4.0 s of caller silence, never while a booking is in flight; a wait limit of 8.0 s; a simulated delay of 6.0 s in “Delay the response”; no automatic booking outside Alameda, San Mateo, Santa Clara and Contra Costa counties (demo policy).
Example backend, simulated. Its contract is this example’s own: the address check accepts or declines and returns no times; the cell phone travels as 10 digits, country code apart; every create carries an idempotency key and can be read back by it.
The tests behind it.
Deterministic injections, no model. Each one feeds the booking layer a hostile or broken input and checks what the caller would hear and what the booking system holds.
All 11 checks passed when this page loaded.
Both negative controls failed, as they must. Each switches one guard off in an isolated copy. If its check still passed, the check would prove nothing.
Ran on Sep 23 at 8:08:27 AM PDT, on this page’s server, in 49 ms.
Negative controls, which must fail
Not covered here: telephony, speech on a live line, and any real booking system. What is covered is the layer between a model and a booking API, which stays the same whichever model and whichever phone line sit around it.