Case study — conversational discovery

Three ways to spend the evening —
none of them made up.

An AI concierge for planning the evening — movies, comedy, concerts and theatre across eight Indian cities, on web chat and WhatsApp. Code picks three real events from a live catalogue; the model only writes the words.

Designed and built for an early-stage entertainment venture · live beta January 2026 · handed off to the client’s own team

Product design in collaboration with 3SidedCoin

Idea Design POC MVP · Eight weeks

UnderstandProposeSteerRe-rank
01 — What we built

A conversation that assumes the predictable.

The venture had a decision problem, not a transaction one — listings were plentiful and already bookable. They brought the idea; we took it to a working product: a concierge that assumes what can reasonably be assumed and answers with three options, each carrying its reason.

Discovery assistant — three moments
01 · Ask
02 · Propose
03 · Steer
Three moments, drawn — The frames are redrawn from the product’s designed interface — dark chat, poster carousel, steering pills. (01) The assistant greets and proposes; “I want to laugh” is the whole query — no city, no date, no genre, no language, no price band. (02) Three options arrive as a carousel, each wearing its shape on the poster — best match, popular, wildcard — with the reason carried by the narrated line above them. (03) A tapped pill is simply a new message — the steer cycle in the figure below — and the narrated compromise is the outline being voiced: same shapes, ranked again, with the change explained. Booking hands off to the ticket seller; the product never sells.
02 — How it decides

The tool picks; the model phrases.

Every consequential decision in the exchange above is made by deterministic code. Which three options appear, how they rank, what “tonight” means, how far away a venue is — none of it is left to the language model.

Understand

pin the message down
Understand: only one of the four resolvers reads the sentenceEVALUATE THE MESSAGETHE WHOLE QUERY — NO CITY, NO DATE, NO GENRE, NO LANGUAGE, NO PRICE BANDI want tolaughResolve whenhand-written date rules;the model is never askedNO MODEL CALLResolve wherefive labelled fallbacks,city down to networkFIVE FALLBACKSResolve the moodread from the sentence,passed as tool argumentsREAD BY THE MODELResolve the partyfriends, family or soloDESIGNED · NOT IN V1The ask-or-recommend gateDATABASE-BACKED STATEWARM REFUSAL · EIGHT CITIES, NAMEDASKS ONE QUESTION · NEVER TWICE Understand: only one of the four resolvers reads the sentenceEVALUATE THE MESSAGETHE WHOLE QUERY — NO CITY, NO DATE,NO GENRE, NO LANGUAGE, NO PRICE BANDI want tolaughResolve whenhand-written date rules;the model is never askedNO MODEL CALLResolve wherefive labelled fallbacks,city down to networkFIVE FALLBACKSResolve the moodread from the sentence,passed as tool argumentsREAD BY THE MODELResolve the partyfriends, family or soloDESIGNED · NOT IN V1The ask-or-recommend gateDATABASE-BACKED STATEWARM REFUSAL ·EIGHT CITIES, NAMEDASKS ONE QUESTION ·NEVER TWICE

Propose

three real options from the catalogue
Propose: score is a position, and the three picks are three places in the fieldRetrievefrom the catalogueScore & rankEQUAL-SCORE LINESNOTHING FITS — RELAX THELEAST-IMPORTANT & SAY SOAnchorthe best matchhighest weighted scoreBreadththe popular onemost popular in the windowContrast — the wildcarddeliberately different — sothe next turn has signalPOPULARITY 30 →DOT SIZE · PROXIMITY 20GENRE MATCH 40 →DISTANCE COMPUTED IN THE DATABASEOVER TWO THOUSAND LINES OF TYPESCRIPT Propose: score is a position, and the three picks are three places in the fieldRetrievefrom the cataloguePOPULARITY 30 →PROXIMITY 20GENRE MATCH 40 →DISTANCE COMPUTED IN THE DATABASEOVER TWO THOUSAND LINES OF TYPESCRIPT↻ NOTHING FITS — RELAX & SAY SOAnchor — best matchhighest weighted scoreBreadth — popularmost popular in the windowContrast — wildcarddeliberately different — so thenext turn has signal

Speak

the rows it was handed, in a warm voice
Speak: two different renderings, the same three rows, and only the sentence is newpresentationInstructionsTHE THREE PICKS · AS PROPOSE HANDS THEM OVERTHE REPLY THE USER SEESA laugh it is — here’s the room:TITLEThe Long BitSTARTS8:00 PMVENUEThe Half Door, Old Mill LaneSHAPEANCHORTITLENine SharpSTARTS9:00 PMVENUEBrass Bell HallSHAPEBREADTHTITLEWrong Answers OnlySTARTS7:00 PMVENUEThe Paper Cup, Arcade RowSHAPECONTRASTBEST MATCHIMPROVThe Long Bitsillylive8:00 PMThe Half Door, Old Mill LaneBOOKPOPULARSTAND-UPNine Sharpbig roomfast9:00 PMBrass Bell HallBOOKWILDCARDQUIZWrong Answers Onlyplayful7:00 PMThe Paper Cup, Arcade RowBOOKVOICE, NOT CHOICES“You can be creative to paraphrasethe above instructions naturally.” Speak: two different renderings, the same three rows, and only the sentence is newTHE THREE PICKS · AS PROPOSE HANDS THEM OVERTITLEThe Long BitSTARTS8:00 PMVENUEThe Half Door, Old Mill LaneSHAPEANCHORTITLENine SharpSTARTS9:00 PMVENUEBrass Bell HallSHAPEBREADTHTITLEWrong Answers OnlySTARTS7:00 PMVENUEThe Paper Cup, Arcade RowSHAPECONTRASTpresentationInstructions“You can be creative to paraphrasethe above instructions naturally.”THE REPLY THE USER SEESA laugh it is — here’s the room:BEST MATCHIMPROVThe Long Bitsillylive8:00 PMThe Half Door, Old Mill LaneBOOKPOPULARSTAND-UPNine Sharpbig roomfast9:00 PMBrass Bell HallBOOKWILDCARDQUIZWrong Answers Onlyplayful7:00 PMThe Paper Cup, Arcade RowBOOKVOICE, NOT CHOICES

The person reads three real options · taps a pill or says more

One turn, whole — understand, propose, speak; then the person steers. Understand — four resolvers pin the message down; the gate asks or recommends. Propose — retrieve, score 40 · 30 · 20, relax if nothing fits, pick the three shapes. Speak — the three picks pass through the outline untouched; the model adds only the words. Then the person answers — a tapped pill or a typed sentence — and it runs again.

↻ a tapped pill or a typed sentence is just the next message — then it runs again

Grounded by construction

Nothing invented can reach the user.

Hallucination isn’t reduced here, or prompted away — it’s eliminated by architecture. No pick, no date, no distance comes from the model.

An option is a row, not a sentence.

Recommendations never pass through generated text: retrieval, scoring and selection happen in code against the catalogue, and the model receives finished picks to phrase. A hallucinated event has no path to the screen.

Resolves before it reasons.

The intake is designed as a deterministic Mastra workflow — an explicit graph with typed schemas and defined branching — that pins down when, where and the mood before anything is retrieved. Structure where structure belongs; the model only where language needs it.

Every turn has a destination.

Ask the one missing question, show three real options, or decline warmly and steer back. The conversation cannot wander, and a dead end is never shown.

Reliability lives where you can test it — and this is what the tests assert: which tools were called, in what order, with what arguments — including eighteen scripted attempts to pull it off-topic.

03 — What this proves

Put the policy in tools, not the prompt.

Over the project’s life the system prompt shrank as the tools absorbed policy, and the finished agent is the argument in miniature: seven opinionated tools and a prompt a couple of screens long. Every rule that matters — what to show, when to ask, what “tonight” means — lives in code that can be tested, stepped through and fixed.

We built the pilot; the client’s own team took it forward. Handed off with the knowledge transfer to run it.

Stack — Mastra · OpenAI gpt-4o-mini · Postgres · Next.js · WhatsApp Business API

Let's find the work AI should be doing in your organization.

Whether you are exploring an idea or improving a system already in use, we’ll help you decide what is worth doing next.

Prefer to start async?

hello@thoughtfulrobots.ai

Hyderabad · Remote

Questions before you book?

Read the FAQ

Follow along

START A CONVERSATION

Tell us about the work.

A few lines about your product and where AI might belong. We usually reply within one business day.