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.

See the tests

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

Email

dana.whitfield@gmial.com

dana.whitfield@gmail.com

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.

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”

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.

BOOKEDRB-40217

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

  1. 0.0
    Caller

    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.

  2. 0.0
    Agent

    I'm sorry to hear about the leak, Dana. Let me take down your details.

  3. 0.1
    Agent

    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?

  4. 0.1
    Caller

    Yes, that's right. Please go ahead and book it.

  5. 0.3
    Agent

    I'm sorry, the booking system didn't accept the email address dana.whitfield@gmial.com. Could you spell it for me?

  6. 0.3
    Caller

    Oh, sorry, that's gmail. G-M-A-I-L. dana.whitfield@gmail.com.

  7. 0.3
    Agent

    Thank you.

  8. 0.5
    Agent

    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

  9. 0.5
    Agent

    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?

  10. 0.5
    Caller

    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

Email

dana.whitfield@gmial.com

dana.whitfield@gmail.com

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.

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”

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.

BOOKEDRB-40217
  1. 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 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.

  2. 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 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.

  3. 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 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.

  4. 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 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.

  5. 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 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 backend

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.