Sophie
MultilingualHer first language is French. The same live conversation has to adapt to her, without a separate queue.
When a flight is cancelled, the hard problem isn’t one conversation. It’s resolving every passenger safely, concurrently and personally.
Holdline is a proof of concept for a fictional airline, Air Eleven. One voice agent built on ElevenLabs Agents calls every affected passenger at once, rebooks them in their own language, hands off to a specialist when needed, and never promises the same seat twice. I designed and built it end to end: the agents, the reservation service, the CRM integration and the 4:47 narrated demo of a real live run below.
concurrent calls from one disruption event
to resolve every passenger
double bookings, with two callers racing for one seat
At 10 a.m., Air Eleven cancels the 4:00 PM from Toronto to Vancouver. Five passengers now compete for two later departures: a 6:00 PM with very few seats left and a 7:40 PM with five.
Most voice-agent demos are one call with one person. Disruption recovery isn’t: every call happens at the same time, every passenger needs something different, and they all draw on the same seats. Each passenger here stands for a requirement a real airline would have.
Her first language is French. The same live conversation has to adapt to her, without a separate queue.
She needs wheelchair assistance. Rebooking alone isn’t enough, and a specialist handoff shouldn’t make her repeat her story.
He wants cash compensation and a business upgrade. Personalisation has to stay inside policy.
Both want the last seat on the 6:00 PM, on separate calls. Only one of them can get it.


Airy, the rebooking agent, calls all five passengers at once. Each conversation is independent; the seat inventory is not. Every call works against one authoritative reservation service.
That split is the core design rule: the model is never the source of truth for inventory. Airy can only promise what the reservation service grants through server tools. The agent decides how to talk; the service decides who gets the seat.
To test it without people on the line, each passenger is an ElevenLabs agent too, with its own persona, voice and phone number. Airy dials real numbers and talks to them over the public phone network, so the whole scenario can be rerun on demand.
The rebooking agent. Calls, verifies, offers flights, holds and confirms seats.
Outbound calls via Twilio, dynamic variables, webhook tools, guardrails, language detection
Picks up Priya’s call with her context already attached.
Agent-to-agent transfer
Fictional personas that answer the phone and push on each capability.
Persona prompts, voices, French and English
get_alternatives, hold_seat, confirm_rebooking, release_hold, verify_passenger and three more.
Webhook tools, plus an MCP server for get_customer_context from Salesforce
Releases any seat a dropped call left behind, then updates the Salesforce case.
Signed post-call webhooks
Simulated conversations that run before any change reaches the live agents.
Agent testing, evaluation criteria
Airy opens in English. When Sophie answers in French, the same live conversation adapts. ElevenLabs Scribe transcribes her French, and Airy carries on with the same voice, tools and session context, including the identity check where she spells her surname letter by letter. One workflow, now in Sophie’s language.


Priya mentions her wheelchair once. Airy verifies her and holds a seat on the 6:00 PM before transferring the live call, so the seat can’t be lost during the handoff. ElevenLabs carries the conversation context into a separate Accessibility Agent, which greets her by name and already knows her flight and her need. Priya said it once.


Marcus has a wedding tomorrow and wants cash compensation and a free business upgrade. Airy never promises the exception. It logs the request for customer care, pulls his profile from Salesforce and offers a window seat on the 6:00 PM, his saved preference. He still says yes.


The concurrency test. Maya and Daniel are on separate calls and both ask for the last seat on the 6:00 PM. The conversations are independent; the inventory isn’t. Both calls reach hold_seat, and one atomic hold in the reservation service (a single conditional SQL UPDATE) decides, so only one request can ever take the seat. Whichever hold lands first gets the seat; the other caller hears it has sold out and recovers to the 7:40 PM in the same call. In the run shown in these screenshots Maya won it. In the live take in the video, Daniel did.

sold_out mid-call and moved him to the 7:40 PM.

sold_out gracefully and pivoted in the same breath. Sold out is shown as protection working, not as an error.Each layer owns one job. Twilio handles telephony. ElevenLabs Agents runs the conversation layer. Salesforce provides customer context. The reservation service owns inventory and atomic holds.
Inside ElevenLabs, Airy uses verification, CRM, booking and transfer tools. Trusted context is bound to each call through dynamic variables. Only after the passenger is verified do server tools like hold_seat transact against the inventory service, and each conversation record shows those tool calls succeeding.
Every prompt, tool schema and agent setting lives in the repository and is pushed to ElevenLabs by a sync script, so a prompt change is a reviewed diff with tests, not a click in a dashboard.



passengers resolved
rebooked automatically
specialist handoff
double bookings
languages served

The agent is very good at the human part: tone, language, recovering from “sold out”. It should never be the thing that decides scarce resources. Tools that return a decision, idempotently, made the agent’s job simpler.
Persona agents on real phone numbers turned a hard-to-test system into one I could rerun on demand. Agent tests in simulation caught prompt regressions before any call minutes were spent.
Calls connect seconds apart and every conversation takes a different path. The presentation had to follow events from the calls, not a script, and skip a beat that didn’t happen instead of faking it.
Spelled names, a brand name read as “Air 11”, a goodbye cut off by a transfer. Most fixes came from reading word-level timestamps, not from changing the model.
The result is one-to-one service at disruption scale: personalised conversations, deterministic controls, and no tradeoff between customer experience and operational integrity.
Holdline is a proof of concept, not an airline product. The airline, passengers and flights are fictional, and the inventory service stands in for a real reservation system. Taking it to production would mean Postgres instead of SQLite, batch calling with a priority engine (connection risk, fare class, loyalty), staged agent versions and real operator authentication.
