Why your agent tells the customer to contact support
The customer opened the chat on your support page, typed out the problem, and got told to contact customer service. The agent is customer service. Somewhere in its prompt is a sentence written for a different reader, and the agent is doing the only thing that sentence lets it do.
TL;DR An agent that tells customers to contact support is relaying help-centre lines written for a human reader, so give it a tool for every team those lines name, write one rule per case that calls the tool, and keep a single ban and a $TEST as the backstop.
It is the most-screenshotted failure in customer service automation, and it is rarely a model failure. Nobody wrote send the customer away into the prompt. Somebody pasted the help centre, and the help centre was written for a person reading a web page, who can pick up a phone or open an email. The agent can do neither. Passing the sentence on is the one part of it the agent can do.
§1The help page, pasted in
Ashgrove Furniture sells sofas, tables and beds online. Its chat agent went live with a short prompt: one role line, and a help section lifted from the contact-us page, so the agent would know where each kind of problem goes. Here it is.
# Role You are the chat assistant for Ashgrove Furniture, an online furniture retailer. # Help - For delivery problems, contact the delivery team. - If your order arrives damaged, email our customer care team with photos. - For refunds, please contact customer service. - MUST answer every question in at most 3 sentences.
$ typeglish review before.tg
before.tg - C (77/100) → A (99) projected if every fix below lands check: 0 error, 0 warning, 4 info tiers: base+z3
FIXES ranked by projected gain
+12 put a "@@ why" note above L2 L5 L6 L7 L8 - annotation 0 → 100
+8 lead with a modal (MUST / NEVER / SHOULD) on L5 L6 L7 - 3 rules become visible to the checker
+2 fix the 1 typeglish/if-then finding (L6) - A conditional (IF / WHEN / UNLESS / WHILE / …) opened without its THEN - an ADVISORY by the owner's ruling (2026-08,…
RULES 1 of 4 rule-shaped lines read
L5 ✗ invisible For delivery problems, contact the delivery team.
no modal (MUST / NEVER / SHOULD) and "For" is not a verb the checker knows, so it reads as prose → lead with a modal, or start with a verb from the catalog (Escalate …, Ask …)
L6 ✗ invisible If your order arrives damaged, email our customer care team with photos.
the condition has no THEN branch, so nothing is required when it holds → add THEN MUST / NEVER / SHOULD <verb> …
L7 ✗ invisible For refunds, please contact customer service.
no modal (MUST / NEVER / SHOULD) and "For" is not a verb the checker knows, so it reads as prose → lead with a modal, or start with a verb from the catalog (Escalate …, Ask …)
info, so the file checks clean and builds. The help section reaches the model exactly as pasted.Now the contact. A customer took the day off for a sofa delivery, and the van never came. Run the prompt forward and the reply nearly writes itself, because line 5 is the only line that mentions deliveries:
Customer: The van never turned up today. I took the day off work for this.
Agent: I'm sorry to hear that! Please contact our delivery team, who can
rebook your delivery for you.
Customer: I am contacting you.
§2A line for the reader, read by the agent
A help page and a system prompt have different readers. On the contact-us page, contact the delivery team is an instruction to the customer, and it is a good one: the customer can phone the team. Pasted into a prompt, the same sentence has a new reader, the agent. And the agent cannot phone anyone. It has a chat window and whatever tools you gave it, and this prompt gave it none.
So the model looks for a reading of contact the delivery team that it can carry out, and there is exactly one: say it to the customer. It is not misreading the line. It is reading it the only way that leads to an action. (Teardown: the help centre page where you means the customer covers the other half of this paste: every you on the page means the customer, and the prompt binds it to the agent.)
The deeper problem is that the prompt describes a routing table and gives the agent no way to route. A human agent reading refunds go to customer service would transfer the call. The model has nothing to transfer with, so the routing table becomes a list of places to send people.
An agent with no way to reach a team can only tell the customer to reach it.
§3Two fixes that keep the deflection
The review above names its fix: lead each line with a modal so the checker can read it. Do that literally, keeping what each line asks for, and the file gets better on every number while the agent behaves exactly as before.
# Role You are the chat assistant for Ashgrove Furniture, an online furniture retailer. # Help - WHEN the customer reports a delivery problem THEN MUST tell the customer to contact the delivery team. - WHEN the customer reports a damaged item THEN MUST ask the customer for photos of the damage. - WHEN the customer asks for a refund THEN MUST tell the customer to contact customer service. - MUST answer every question in at most 3 sentences.
$ typeglish check modal.tg modal.tg:5:1 info prompt/unintroduced-definite "the delivery team" retrieves something this document never introduces - a model must guess which team is meant. Mention a team on an earlier line, or anchor it here ("their team", "the team you ..."). modal.tg:6:1 info prompt/unintroduced-definite "the damage" retrieves something this document never introduces - a model must guess which damage is meant. Mention a damage on an earlier line, or anchor it here ("their damage", "the damage you ..."). ✓ 1 file - 0 error, 0 warning, 2 info $ typeglish score modal.tg modal.tg - B (83/100) proven errors: none tiers: base+z3 planes runtime 94 (what the model reads) · hygiene 50 (source only) facets enforceability 100 x.21 · hardness 100 x.12 · directness 73 x.08 · consistency 100 x.17 · structure 100 x.12 (hygiene) · annotation 0 x.12 (hygiene) · style 70 x.08 · security 100 x.08 lever annotation 0/100 (up to +12 overall) - 5 statements without a @@ note (L2 L5 L6 L7 L8) - put a "@@ why" line directly above each rules 4 of 4 rule-shaped lines read L5 prompt/unintroduced-definite −0.25 "the delivery team" retrieves something this document never introduces - a mod L6 prompt/unintroduced-definite −0.25 "the damage" retrieves something this document never introduces - a model must $ typeglish build modal.tg ✓ built .typeglish/dist/modal.txt ← modal.tg (693fc007b98c, full)
MUST tell the customer to contact the delivery team. The checker can prove that two rules collide. It cannot know that a rule is a bad idea.That is worth sitting with. A readable rule is not a good rule; it is a rule you can check. The checker did its job here. It confirmed that the prompt says, clearly and consistently, the thing nobody wants it to say.
The second fix is the one that usually ships after the first screenshot reaches the CX lead: a ban, appended at the bottom.
# Role You are the chat assistant for Ashgrove Furniture, an online furniture retailer. # Help - WHEN the customer reports a delivery problem THEN MUST tell the customer to contact the delivery team. - WHEN the customer reports a damaged item THEN MUST ask the customer for photos of the damage. - WHEN the customer asks for a refund THEN MUST tell the customer to contact customer service. - MUST answer every question in at most 3 sentences. # Added after the complaints - NEVER tell the customer to contact customer service.
$ typeglish check never.tg never.tg:5:1 info prompt/unintroduced-definite "the delivery team" retrieves something this document never introduces - a model must guess which team is meant. Mention a team on an earlier line, or anchor it here ("their team", "the team you ..."). never.tg:6:1 info prompt/unintroduced-definite "the damage" retrieves something this document never introduces - a model must guess which damage is meant. Mention a damage on an earlier line, or anchor it here ("their damage", "the damage you ..."). never.tg:7:1 error logic/contradiction Conflicts with line 11. Logical conflict - "tell the customer to contact customer service" is both required and forbidden. Keep one, or scope the two rules so they cannot both apply (IF <condition> THEN ...). ↳ line 11: - NEVER tell the customer to contact customer service. never.tg:11:1 error logic/contradiction Conflicts with line 7. Logical conflict - "tell the customer to contact customer service" is both required and forbidden. Keep one, or scope the two rules so they cannot both apply (IF <condition> THEN ...). ↳ line 7: - WHEN the customer asks for a refund THEN MUST tell the customer to contact customer service. ✗ 1 file - 2 error, 0 warning, 2 info $ typeglish build never.tg typeglish build: never.tg refused - nothing written
Both halves of that result matter. The refusal is good news: if this file had been plain text, the model would have settled the refund collision one chat at a time. But the ban covers only the words it names. Delete line 7 to make the error go away, which is what a hurried fix does, and the file builds with the delivery line still sending every late-van customer elsewhere. A ban on a phrase is a list of one phrase. Help-centre copy has dozens: reach out to, get in touch with, email us at, call our team.
§4Give the agent the hands the page assumed
The fix follows from §2. Every contact the X team on the old page describes something a person would do next. Turn each one into something the agent does next: a tool call. A late van becomes a transfer to the delivery team with the chat attached. A broken table leg becomes a damage claim that sends the customer a photo link, so nobody has to find an email address. A refund becomes a lookup the agent runs itself. Then say the one thing the help page never had to say: the customer has already reached customer service.
# Role @@ role: the desk this file speaks for You are the chat assistant for Ashgrove Furniture, an online furniture retailer. @@ already_here: the customer has reached customer service, so there is nobody further to send them to The customer IS already talking to Ashgrove customer service. # Help @@ delivery: a missed or late delivery goes to the people who can rebook the van, with the chat attached - WHEN the customer reports a delivery problem THEN MUST call @[transfer_to_delivery]. @@ damage: the claim tool sends the photo link, so the customer never has to find an email address - WHEN the customer reports a damaged item THEN MUST call @[open_damage_claim]. @@ refund: the agent checks eligibility itself instead of naming a department - WHEN the customer asks for a refund THEN MUST call @[lookup_order]. @@ no_deflect: the sentence every help-centre paste leaves behind - NEVER tell the customer to contact customer service. @@ brevity: a chat bubble, not an essay - MUST answer every question in at most 3 sentences. $TOOL transfer_to_delivery - description:: Hand the chat to the delivery team, with the conversation attached. - input:: - order_number:: the order with the delivery problem. $TOOL open_damage_claim - description:: Open a damage claim and send the customer a link to upload photos. - input:: - order_number:: the order with the damaged item. $TOOL lookup_order - description:: Find an order and whether it can be refunded. - input:: - order_number:: the order to look up. $TEST late_van - input:: The van never came today and I took the day off work. - expect:: - calls transfer_to_delivery - matches /^(?!.*[Cc]ontact (our|the|customer))/ - at most 3 sentences $TEST broken_leg - input:: The table arrived with a broken leg. Order AF-20931. - expect:: - calls open_damage_claim - does not tell the customer to contact customer service - at most 3 sentences $TEST refund_ask - input:: I want a refund for the sofa, it is the wrong colour. - expect:: - calls lookup_order - matches /^(?!.*[Cc]ontact (our|the|customer))/
$ typeglish check fixed.tg ✓ 1 file - 0 error, 0 warning, 0 info $ typeglish score fixed.tg fixed.tg - A (99/100) proven errors: none tiers: base+z3 planes runtime 99 (what the model reads) · hygiene 100 (source only) facets enforceability 100 x.21 · hardness 100 x.12 · directness 94 x.08 · consistency 100 x.17 · structure 100 x.12 (hygiene) · annotation 100 x.12 (hygiene) · style 100 x.08 · security 100 x.08 rules 5 of 5 rule-shaped lines read · 5/5 covered by $TEST $ typeglish test fixed.tg --dry ✓ fixed.tg coverage: 5/5 rules exercised · late_van - "The van never came today and I took the day off work." (not run) ✓ matches /^(?!.*[Cc]ontact (our|the|customer))/ ✓ at most 3 sentences · rubric - 1 prose expectation, judged on a live run (needs ANTHROPIC_API_KEY) · broken_leg - "The table arrived with a broken leg. Order AF-20931." (not run) ✓ at most 3 sentences · rubric - 2 prose expectations, judged on a live run (needs ANTHROPIC_API_KEY) · refund_ask - "I want a refund for the sofa, it is the wrong colour." (not run) ✓ matches /^(?!.*[Cc]ontact (our|the|customer))/ · rubric - 1 prose expectation, judged on a live run (needs ANTHROPIC_API_KEY) ✓ 1 prompt - 0 failed $ typeglish build fixed.tg ✓ built .typeglish/dist/fixed.txt ← fixed.tg (06e7a8a83671, full)
# Role You are the chat assistant for Ashgrove Furniture, an online furniture retailer. The customer IS already talking to Ashgrove customer service. # Help - WHEN the customer reports a delivery problem THEN MUST call transfer_to_delivery. - WHEN the customer reports a damaged item THEN MUST call open_damage_claim. - WHEN the customer asks for a refund THEN MUST call lookup_order. - NEVER tell the customer to contact customer service. - MUST answer every question in at most 3 sentences.
The test line worth copying is matches /^(?!.*[Cc]ontact (our|the|customer))/. It runs offline, needs no judge, and catches the deflection in the words the ban did not name: contact our delivery team, contact the care team. Grow the alternation as you find new phrasings in your transcripts. The tool rules are the fix; the ban and the regex are how you notice when somebody pastes the help centre back in. If you want the longer argument for a pointer over a sentence, Bake-off: say escalate vs. call the escalation tool runs it on a handover.
§5Common questions
- Why does my AI support agent tell customers to contact customer service?
- Because its prompt was pasted from text written for a customer reading a help page, and that text tells the reader to contact a team. The agent is now the reader, it has no way to contact anyone, so the only instruction it can carry out is to pass the sentence on.
- How do I stop my chatbot sending customers to another department?
- Give the agent a tool for every team it used to name, and write one rule per case that calls it, such as
WHEN the customer reports a delivery problem THEN MUST call @[transfer_to_delivery]. Then add a singleNEVER tell the customer to contact customer service, and a$TESTthat fails if a reply says contact. - Is a NEVER contact customer service rule enough on its own?
- No. It only covers the words it names. In the post’s example it refused the build against the refund line it matched word for word, and let the line that sent customers to the delivery team through untouched. The ban is a backstop; the tool rules are the fix.
- Why does typeglish give a B to a prompt that still deflects customers?
- The checker proves that each rule can be read and that no two rules collide.
MUST tell the customer to contact the delivery teamis readable and consistent, so it scores. Whether a rule is a good idea is a policy question, and a$TESTis where you pin that down.
Before you go live, search the prompt for every phrase that hands work to the reader: contact, email, call, reach out, visit, get in touch. Each hit is a place the help page assumed hands the agent does not have. For each one, either give the agent a tool and a rule that calls it, or decide on purpose that this case really does leave the chat, and write that as its own rule with its own test. typeglish review helps with the first pass: on the pasted page it listed all three lines as invisible to the checker, which is a fair proxy for “written for someone else.”