Inspiration
An 82-year-old shouldn't have to sit on hold for twenty minutes to reach her own GP.
Think about what happens after an older patient's appointment. Nobody has time to ring and ask how she's getting on. And if something's wrong and she needs to be seen again, she has to phone the surgery herself and wait — the part of healthcare that's hardest for exactly the people who need it most.
We couldn't make the waiting disappear. Someone has to sit in that queue. But it doesn't have to be her.
We also decided early that the second call had to be a real phone call, not a shortcut into the practice's computer system. No surgery is going to hand an outside program the keys to its appointment book, and honestly, none should. So the agent queues like a person, because that's the only door that's actually open.
What it does
HoldFor makes two phone calls, with a human being in the middle.
First, it rings the patient. A few days after her appointment, on her ordinary phone. No app to download, no menu to navigate, no hold music. It asks four short questions and lets her take her time. It also tells her, up front, that it will never ask for her date of birth, her address or her bank details — because that's exactly what a scam call does, and she deserves to know the difference.
Then it stops. Everything she said goes onto a screen at the practice: her answers, the full conversation, and her own sentence quoted word for word. The agent that made the call has no say in what happens next.
Someone at the practice reads it and decides. If she should be seen again, they set the terms — which dates are acceptable, mornings or afternoons, in person or by phone, which doctor. They also choose which of her own words the agent is allowed to repeat to a receptionist. They can cut that sentence shorter. They cannot add to it. Not by policy — the system simply won't accept it, because putting words in a patient's mouth to a third party is the one mistake we couldn't come back from.
Only then does it ring reception. The agent joins the practice's own phone queue and waits, so she doesn't have to. When a slot is offered, the system checks it against what was actually authorised. Inside the terms, it's done. Outside them, it goes back to a person — with a name on it.
And if she says something that sounds urgent, the call stops there and the agent doesn't offer to arrange anything at all. That case goes to a human, who gets a button that says "ring them myself." We never want to be the reason someone unwell got handled by a machine.
How we built it
The calls run on CALL-E. The practice's screen is a small Python web app — deliberately plain, server-rendered, no framework on the front end, because a receptionist's browser shouldn't need to be modern for a patient to get seen.
The rule we held to throughout: anything that matters is enforced by the code, not requested of the AI. We tell the agent to only accept appointments within the authorised dates — then the system checks what it accepted and doesn't care what the agent believed. We tell it to quote the patient exactly — then the system verifies the quote against what she actually said. There are 375 tests, and thirteen written records of the decisions behind all of it, including the ones we got wrong and had to revisit.
Challenges we ran into
Getting the conversation to feel human took most of the time, and you can only learn it by listening.
A receptionist offered our agent an appointment, in plain words, and it replied "I'm only able to pass on what she said" — five times in one call, while a perfectly good slot sat there going nowhere. It hadn't occurred to us to tell it that someone naming a day and a time is an offer, not a question. It seems obvious written down. It wasn't obvious until we heard it happen.
It talked over a patient who was still finishing her sentence. When it couldn't quite make out a word, it had nothing to say, so it reached for the nearest phrase it knew and repeated that instead. Every fix was one plain sentence added to its instructions, and not one of them was something we'd have predicted from a desk.
The phone system gives you a conversation, not a form. We'd built the whole board expecting neat answers to come back from each call. Real calls return words and nothing else. So we added a second step that reads the four answers back out of the recording afterwards — and marks them as worked out from the transcript rather than heard by the agent, because someone reading "she's feeling worse" has a right to know which of those it was.
Accomplishments that we're proud of
It held up on a real phone call. The agent introduced itself honestly, declined to discuss the patient's condition when the receptionist asked, declined to say whether she was in the room, and turned down a Saturday appointment that fell outside what it had been authorised to accept — without arguing and without trying to negotiate.
What we learned
An unfamiliar number ringing an older person reads as a scam. Our very first live call went to a teammate who had started it herself thirty seconds earlier. She heard a word or two and hung up. The system logged it as declined — no conversation at all. An 82-year-old gets less warning than that, not more.
The fix isn't technology. It's one sentence a receptionist says at the appointment: we'll ring you on Thursday afternoon, you don't need to do anything, and we will never ask you for your details. That turns an unknown caller into an expected one. Any practice using something like this has to do that part, and we'd rather say so than pretend the software solves it.
What's next for HoldFor
Make it repeat the booking back. Nothing currently forces the agent to confirm what's been agreed before hanging up. Without it, a receptionist can put the phone down believing there's an appointment that nobody can name.
Log in or sign up for Devpost to join the conversation.