Lab build: a browser-native voice booking agent that went 73.3% → 100% task completion
A portfolio lab build on Tessera (a fictional SaaS): a browser-native, push-to-talk voice agent that books appointments. It can only offer slots the calendar actually returned, books atomically so exactly one caller wins a contested slot, and issues real confirmation codes; a committed eval caught the model silently reformatting slot IDs and drove task completion from 73.3% to 15/15.

- Role
- Solo build (Claude Code)
- Stack
- Next.js · TypeScript · Web Speech API · Gemini (free-tier) · Vercel
- 15/15 (100%)Task completion (15-dialogue eval)
- 15/15 (100%)Tool-sequence correctness
- 73.3% → 100%Same eval before the slot-ID fix
The problem
Voice booking agents demo beautifully and fail quietly: the model offers slots that don't exist, mangles the IDs it's handed, or double-books a slot two callers grab at once, and none of it shows up until a real customer is standing at a closed door.
The approach
- Push-to-talk voice UI built on the Web Speech API, with a text fallback for Firefox and accessibility so the agent still works where speech recognition doesn't.
- A tool-calling agent constrained to reality: it can only offer slots the calendar returned, and booking is atomic. Concurrent attempts on the same slot resolve to exactly one winner, each with a real confirmation code.
- The honest story: the first eval run scored 73.3% because the committed eval caught the model reformatting slot IDs into silent booking failures. Fixed server-side with a canonicalization step that never resolves to a nonexistent slot, then re-measured at 15/15.
- Portable by design: the same turn loop moves to Vapi, Retell, or Twilio by swapping only the I/O layer.
The results
A voice booking agent that can't offer a slot it doesn't have or double-book one it does, proven by an eval that already caught one real silent-failure class and now holds at 100%, and portable to a phone-network stack without rewriting the agent.
Have a process like this eating your team's time?
Book a 15-minute fit call →