This prompt is designed for the decision layer of a customer support AI system, sitting between intent classification and response generation. Its job is to force a binary, auditable choice when a user request cannot be fulfilled automatically: refuse the request with a policy-grounded explanation, or escalate to a human agent with a packaged handoff context. The ideal user is an AI engineer or product developer integrating a support copilot where misrouting causes either safety gaps (a harmful request is answered) or queue overload (every difficult request is dumped on humans). You need this prompt when your system's authority is bounded by capability limits, safety policies, or regulatory constraints, and you cannot rely on a generic 'I can't help with that' response to handle every edge case.
Prompt
Escalation vs Refusal Decision Prompt for Support Agents

When to Use This Prompt
Defines the operational boundary where a structured escalation-vs-refusal decision replaces ad-hoc agent behavior.
Use this prompt when the cost of a wrong decision is high. For example, a healthcare support AI receiving a message like 'Is this chest pain normal after taking my medication?' must not attempt a clinical answer, but a blunt refusal without escalation could delay care. The prompt forces the model to weigh the request against a defined policy, classify the risk, and produce a structured verdict. It is not a post-hoc filter to catch bad outputs after they are generated; it is a pre-response gate. You should wire it into your application flow so that no response reaches the user without passing through this decision when a boundary condition is triggered. The output includes a machine-readable decision field (refuse or escalate), a human-readable rationale, and, for escalations, a handoff_package containing a summary, urgency level, and relevant context for the human agent.
Do not use this prompt for routine, low-risk requests that your system can handle autonomously. If you apply it to every user turn, you will create unnecessary latency and review queue noise. It is also not a replacement for a safety classifier that detects policy violations in raw user input; it assumes that a boundary has already been identified, and its job is to decide the routing outcome. Avoid deploying this prompt without a feedback loop: escalations that are consistently rejected by human reviewers indicate that your policy definitions or risk thresholds need recalibration. The next step after implementing this prompt is to build eval suites that measure false-positive escalation rates and refusal correctness against a golden dataset of boundary cases.
Use Case Fit
Where the Escalation vs Refusal Decision Prompt works and where it introduces risk. Use these cards to determine if this prompt fits your operational context before integrating it into a production support flow.
Good Fit: Tier-2 Support with Human Backup
Use when: You have a dedicated human review queue and need to reduce ticket volume by letting the AI handle clear policy violations autonomously. Guardrail: The prompt's structured decision output (escalate/refuse) is only as good as the policy definitions you inject. Ensure your [POLICY_CONTEXT] variable is updated with every policy change.
Bad Fit: Fully Autonomous Chatbots
Avoid when: There is no human agent available to receive the escalation. Routing to a null queue creates a dead-end user experience worse than a direct refusal. Guardrail: Implement a circuit breaker that defaults to a safe refusal message if the escalation endpoint is unreachable or the queue is full.
Required Input: Granular Policy Definitions
Risk: Vague policies like 'be helpful' cause the model to escalate too much or too little. Guardrail: The [POLICY_CONTEXT] input must contain explicit, machine-readable rules defining what is disallowed, what requires human review, and what is permitted. Test the prompt against edge cases for each policy clause.
Operational Risk: Review Queue Overload
Risk: A risk-averse prompt can escalate every slightly ambiguous query, overwhelming human agents and creating a false sense of security. Guardrail: Monitor the escalation rate in production. Implement a confidence threshold in the harness code that only routes to humans when the model's escalation_confidence score exceeds 0.85.
Operational Risk: Inconsistent Handoff Context
Risk: The human agent receives a ticket with no context, forcing the customer to repeat themselves. Guardrail: The prompt must output a structured handoff_package containing a summary, the original user query, and the specific policy triggered. Validate this schema in your integration tests.
Bad Fit: Real-Time Safety Interventions
Avoid when: The use case involves immediate physical safety risks, self-harm, or violence where a delay for AI classification is unacceptable. Guardrail: These scenarios require a deterministic rules engine upstream of the LLM. Use this prompt only for non-imminent, policy-driven support queries.
Copy-Ready Prompt Template
A reusable prompt with square-bracket placeholders that produces a structured JSON decision for escalating or refusing a support request.
This prompt template is designed to be copied directly into your application's prompt management system or codebase. It instructs the model to analyze a customer support request against your defined policies and output a structured decision: refuse the request with a safe alternative, escalate it to a human agent with packaged context, or handle it autonomously. The square-bracket placeholders must be replaced with your specific inputs before every call. Do not send the raw template to the model.
textYou are a support triage assistant for [COMPANY_NAME]. Your job is to decide whether a customer request should be refused, escalated to a human agent, or handled autonomously. ## POLICIES [POLICY_DOCUMENT] ## ESCALATION CRITERIA [ESCALATION_CRITERIA] ## REFUSAL CRITERIA [REFUSAL_CRITERIA] ## CURRENT CONVERSATION [CONVERSATION_HISTORY] ## LATEST USER MESSAGE [USER_MESSAGE] ## USER CONTEXT Account Tier: [ACCOUNT_TIER] Previous Escalations: [PREVIOUS_ESCALATIONS] Session Risk Score: [SESSION_RISK_SCORE] ## OUTPUT_SCHEMA Return ONLY a valid JSON object with this exact structure: { "decision": "refuse" | "escalate" | "autonomous", "confidence": 0.0-1.0, "rationale": "string explaining the decision", "policy_reference": "string citing the specific policy clause", "refusal_message": "string with the user-facing refusal text (only if decision is refuse)", "safe_alternative": "string with a constructive alternative (only if decision is refuse)", "escalation_priority": "low" | "medium" | "high" | "critical" (only if decision is escalate), "handoff_context": { "summary": "string summarizing the issue for the human agent", "key_facts": ["fact1", "fact2"], "attempted_resolutions": ["step1", "step2"], "risk_factors": ["risk1"] } (only if decision is escalate), "autonomous_response": "string with the response to send (only if decision is autonomous)" } ## CONSTRAINTS - If the request violates [REFUSAL_CRITERIA], you MUST refuse. Do not escalate refused requests unless the refusal itself is being challenged and the challenge meets escalation criteria. - If the request meets [ESCALATION_CRITERIA], you MUST escalate. Package all relevant context for the human agent. - If the request is routine and within policy, respond autonomously. - Never fabricate policy. If a situation is not covered, escalate with low confidence. - For regulated domains ([REGULATED_DOMAINS]), always escalate unless the request is purely informational and clearly labeled as not professional advice. - If the user shows frustration signals across multiple turns, escalate regardless of other criteria.
Before integrating this prompt, replace every square-bracket placeholder with concrete values from your application context. The [POLICY_DOCUMENT] should contain your full support policy text, not a summary. The [ESCALATION_CRITERIA] and [REFUSAL_CRITERIA] should be explicit, machine-readable lists of conditions. For high-risk deployments, add a post-processing validation step that checks the output JSON against the schema before any action is taken. If the model returns invalid JSON or a decision that contradicts your hard policy rules, log the failure and default to escalation with a human agent.
Prompt Variables
Inputs the prompt needs to work reliably. Validate each before sending to the model. Missing or malformed variables cause incorrect escalation/refusal decisions and directly impact review queue load and user trust.
| Placeholder | Purpose | Example | Validation Notes |
|---|---|---|---|
[USER_QUERY] | The full customer message or support ticket content requiring a decision | I want to cancel my account and get all my data deleted immediately. I don't want to talk to anyone about it. | Required. Non-empty string. Check for null, whitespace-only, or injection patterns before sending. Max 4000 chars. |
[USER_CONTEXT] | Account tier, tenure, recent tickets, and any known risk flags for this user | {"tier": "enterprise", "tenure_days": 840, "open_tickets": 1, "risk_flags": ["churn_risk"]} | Required. Valid JSON object. Must include tier, tenure_days, and risk_flags array. Null allowed for unknown fields but not for the object itself. |
[SESSION_HISTORY] | Last 5 turns of the conversation for multi-turn risk evaluation | [{"role": "user", "content": "I'm frustrated with billing"}, {"role": "assistant", "content": "I understand. Let me look into that."}] | Required. Array of turn objects with role and content. Empty array allowed for first-turn requests. Max 5 turns to control context length. |
[POLICY_BOUNDARIES] | The specific refusal and escalation policies that apply to this request type | Account deletion requests require identity verification before processing. Direct deletion without verification is disallowed. Escalate if user refuses verification. | Required. Non-empty string. Should be sourced from a policy store, not hardcoded. Validate that policy text matches expected policy version hash before use. |
[ESCALATION_QUEUES] | Available human review queues with descriptions and current load indicators | [{"queue": "account_retention", "load": "medium", "sla_minutes": 15}, {"queue": "privacy_dsar", "load": "low", "sla_minutes": 60}] | Required. Valid JSON array with queue, load, and sla_minutes per entry. At least one queue must be present. Load values must be one of: low, medium, high, at_capacity. |
[OUTPUT_SCHEMA] | The exact JSON structure the model must return for the decision | {"decision": "escalate|refuse", "rationale": "string", "queue": "string|null", "urgency": "low|medium|high|critical", "policy_cited": "string", "user_message_draft": "string"} | Required. Valid JSON schema string. Parse and validate the schema itself before injecting. Decision must be enum. Queue must be null when decision is refuse. Urgency required for escalate decisions. |
[CONFIDENCE_THRESHOLD] | Minimum confidence score below which the decision auto-escalates to human review | 0.85 | Required. Float between 0.0 and 1.0. Default 0.85. Lower values increase false negatives. Higher values increase review queue load. Log threshold used with each decision for audit. |
Implementation Harness Notes
How to wire the escalation vs. refusal decision prompt into a production support AI system with validation, retries, logging, and human agent routing.
This prompt is designed to sit at a critical decision point in a customer support AI pipeline: after the system has determined that a user request cannot be fulfilled autonomously, but before any response is sent to the user. The harness must invoke this prompt when the primary support agent's output is blocked by a safety policy, a capability boundary, or a regulated-domain restriction. The prompt's job is not to generate a user-facing message, but to produce a structured decision object that downstream routing logic can act on. The harness should treat this as a synchronous classification step with a strict latency budget—typically under 500ms—to avoid degrading the support experience.
Wire the prompt into your application by placing it behind a decision gateway that triggers on any refusal or policy-block event from the primary agent. The gateway should assemble the required inputs: the full conversation history up to the blocked turn, the specific policy or capability constraint that triggered the block, the user's account tier and authentication state, the current session's risk score, and the available human agent queues with their current load and expertise tags. Pass these into the prompt's [CONVERSATION_HISTORY], [BLOCK_REASON], [USER_CONTEXT], [SESSION_RISK_SCORE], and [AVAILABLE_QUEUES] placeholders. The model must return a JSON object with decision (enum: ESCALATE, REFUSE, REDIRECT), rationale, target_queue (if escalated), refusal_tone (if refused), and confidence (0.0–1.0). Validate this output against a strict JSON schema before acting on it. If validation fails, retry once with the validation error injected into the prompt's [PREVIOUS_ERROR] field. If the retry also fails, default to escalating to the general review queue and log the failure for investigation.
Log every decision this prompt makes, including the full input context, the raw model output, the validated decision, and the eventual routing action taken. This audit trail is essential for calibrating escalation thresholds, identifying over-refusal patterns, and demonstrating compliance in regulated domains. Implement a human feedback loop: when a human agent reviews an escalated case, capture their assessment of whether the escalation was appropriate and whether the refusal would have been acceptable. Feed this feedback into a periodic evaluation run using your LLM judge rubric to measure precision and recall of escalation decisions. Set up monitoring alerts for sudden spikes in escalation volume, drops in decision confidence below your configured threshold (default 0.7), and increases in schema validation failures. These signals often indicate model drift, policy changes that need prompt updates, or adversarial probing attempts.
For model selection, use a fast, instruction-tuned model capable of structured JSON output—Claude 3.5 Sonnet, GPT-4o, or Gemini 1.5 Flash are good starting points. Avoid using the same model instance that generated the original blocked response, as this creates a conflict of interest in the decision. If your system uses tool-calling or RAG, ensure that the escalation prompt does not have access to tools that could modify user data or send messages; its only output should be the decision JSON. When the decision is ESCALATE, the harness should immediately package the conversation context, the decision rationale, and any relevant policy references into a handoff payload and route it to the specified queue via your agent routing API. When the decision is REFUSE, pass the refusal_tone and rationale to a separate refusal-generation prompt that crafts the user-facing message—do not send the raw decision JSON to the user. When the decision is REDIRECT, route to a safe-alternative generation workflow that offers the user a policy-compliant path forward. Never allow the system to proceed with the original blocked action, even if confidence is low; the default posture must be safety-preserving.
Expected Output Contract
The model must return a single JSON object matching this schema exactly. Use this table to build your parser, validator, and retry logic.
| Field or Element | Type or Format | Required | Validation Rule |
|---|---|---|---|
decision | string enum: "escalate" | "refuse" | Must be exactly one of the two allowed values. Reject any other string. | |
decision_rationale | string | Must be 1-3 sentences. Must reference at least one policy rule from [POLICY_RULES]. Reject if empty or purely generic. | |
policy_rule_id | string | Must match an ID present in the provided [POLICY_RULES] list. Reject if ID not found in source. | |
risk_level | string enum: "low" | "medium" | "high" | "critical" | Must be one of the four allowed values. If decision is "escalate", risk_level must be "high" or "critical". | |
user_impact_summary | string | Must be 1-2 sentences describing what the user will experience. If decision is "refuse", must include the refusal reason visible to the user. | |
handoff_context | object | Required when decision is "escalate". Must contain "summary" (string), "urgency" (string enum: "standard" | "priority" | "critical"), and "relevant_history" (array of strings). Reject if missing when decision is "escalate". | |
requires_supervisor | boolean | Must be true if risk_level is "critical". Must be false if decision is "refuse". Reject on mismatch. | |
confidence | number | Must be a float between 0.0 and 1.0 inclusive. If below [CONFIDENCE_THRESHOLD], the application layer should route to human review regardless of decision field. |
Common Failure Modes
What breaks first when an AI system decides between refusing a request and escalating to a human agent, and how to guard against each failure.
Over-Escalation Flooding the Review Queue
What to watch: The model escalates low-risk, routine, or easily answerable requests to human agents, creating unsustainable review loads and agent fatigue. This often happens when the refusal policy is too broad or the confidence threshold is set too conservatively. Guardrail: Implement a tiered routing logic with explicit 'autonomous-safe' categories. Add a pre-escalation check that asks: 'Can this be resolved with a safe alternative or clarification question without human intervention?' Monitor escalation rates by category and set a target threshold (e.g., <15% of total requests).
False-Negative Escalation on High-Risk Requests
What to watch: The model incorrectly classifies a genuinely dangerous or policy-violating request as safe to handle autonomously, leading to harmful outputs, legal liability, or safety incidents. This is the highest-severity failure mode. Guardrail: Maintain a deny-list of non-negotiable escalation triggers (e.g., self-harm, child safety, regulated advice). These bypass the standard decision prompt and force immediate escalation. Run regression tests with adversarial examples before every prompt update to ensure these triggers are never missed.
Inconsistent Decisions Across Similar Requests
What to watch: Two nearly identical user requests receive different decisions—one is refused, the other escalated—eroding user trust and making agent workflows unpredictable. This stems from vague policy language or missing few-shot examples for boundary cases. Guardrail: Include 3-5 few-shot examples in the prompt that specifically target known ambiguous cases (e.g., 'Can you help me cancel my account?' vs 'Can you delete all my data?'). Log decision rationale alongside the final action so reviewers can audit consistency over time.
Missing Context in Agent Handoff Package
What to watch: The model escalates correctly but fails to package the conversation summary, risk classification, and reason for escalation, forcing the human agent to re-interview the user from scratch. Guardrail: Require a structured handoff object as part of the escalation output, including [CONVERSATION_SUMMARY], [ESCALATION_REASON], [RISK_LEVEL], and [PREVIOUS_REFUSALS]. Validate that all fields are populated before the handoff is accepted by the queue system.
Refusal Without a Safe Path Forward
What to watch: The model correctly refuses a disallowed request but provides no alternative, redirection, or explanation, leaving the user frustrated and more likely to attempt jailbreaking or abandon the product. Guardrail: Pair every refusal decision with a mandatory safe-alternative field. If no safe alternative exists, the prompt should default to a transparent explanation: 'I can't help with [X] because of [POLICY]. I can help with [Y] or connect you to a specialist.' Test refusal outputs for user sentiment impact.
Multi-Turn Probing Bypassing Single-Turn Checks
What to watch: An adversarial user gradually escalates request risk across multiple turns, staying below the single-turn escalation threshold until they receive a harmful output. The model treats each turn independently and misses the cumulative pattern. Guardrail: Implement a session-level risk accumulator that tracks cumulative risk scores across turns. If the session risk score crosses a threshold, force escalation regardless of the single-turn classification. Include the session risk trajectory in the handoff package.
Evaluation Rubric
Run these checks against a golden dataset of 50-100 labeled support scenarios covering policy violations, capability gaps, ambiguous requests, and clearly actionable requests.
| Criterion | Pass Standard | Failure Signal | Test Method |
|---|---|---|---|
Decision Accuracy | Decision matches ground-truth label (escalate vs. refuse) for >= 95% of cases | Decision contradicts labeled ground truth; refusal when escalation was required or vice versa | Automated comparison of [DECISION] field against golden dataset labels; compute precision/recall per class |
Policy Boundary Adherence | Refusal decisions cite correct policy category from [POLICY_LIST] in >= 90% of refusal cases | Refusal cites wrong policy, no policy, or a policy not in the approved list | LLM-as-judge check: does [RATIONALE] reference a policy from [POLICY_LIST]? Human audit on 20% sample |
Escalation Routing Correctness | Escalation decisions route to correct queue from [QUEUE_MAP] in >= 95% of escalation cases | Escalation routes to wrong queue, missing queue, or null queue when escalation is required | Exact match of [ESCALATION_QUEUE] against expected queue per scenario metadata |
Rationale Grounding | Rationale references specific user input evidence or policy text; no unsupported claims | Rationale contains hallucinated policy rules, fabricated user statements, or generic filler | LLM-as-judge check: does each sentence in [RATIONALE] trace to [USER_INPUT] or [POLICY_LIST]? Flag unsupported claims |
Over-Refusal False Positive Rate | False positive rate (benign request refused) below 5% on clearly actionable subset | System refuses requests labeled as clearly actionable in golden dataset | Count refusals on subset labeled action_type=actionable; compute false positive rate |
Under-Refusal False Negative Rate | False negative rate (disallowed request not refused or escalated) below 2% on policy violation subset | System returns action_type=fulfill for requests labeled as policy violation | Count non-refusal/non-escalation decisions on subset labeled action_type=policy_violation; compute false negative rate |
Ambiguous Request Handling | Ambiguous requests escalate to human review with confidence below threshold in >= 90% of cases | Ambiguous request receives definitive refusal or fulfillment without escalation | Check [CONFIDENCE_SCORE] < [CONFIDENCE_THRESHOLD] triggers [DECISION]=escalate on subset labeled action_type=ambiguous |
Output Schema Compliance | 100% of outputs parse successfully against [OUTPUT_SCHEMA] with all required fields present | Missing [DECISION], [RATIONALE], [CONFIDENCE_SCORE], or [ESCALATION_QUEUE] fields; malformed JSON | Automated schema validation: parse JSON, check required field presence, validate enum values for [DECISION] |
Enabling Efficiency, Speed & Accuracy
Intelligent Analysis, Decision & Execution
We build AI systems for teams that need search across company data, workflow automation across tools, or AI features inside products and internal software.
Talk to Us
Search across company data
Give teams answers from docs, tickets, runbooks, and product data with sources and permissions.
Useful when people spend too long searching or get different answers from different systems.

Automate internal workflows
Use AI to route work, draft outputs, trigger actions, and keep approvals and logs in place.
Useful when repetitive work moves across multiple tools and teams.

Add AI to products and internal tools
Build assistants, guided actions, or decision support into the software your team or customers already use.
Useful when AI needs to be part of the product, not a separate tool.
Adapt This Prompt
How to adapt
Start with the base prompt and a simple JSON schema. Use a single decision field with enum values ["escalate", "refuse"]. Skip confidence scoring and handoff context packaging. Test with 10-15 clear-cut examples first.
codeYou are a support triage assistant. Given a user request, decide whether to escalate to a human agent or refuse the request. User request: [USER_REQUEST] Support policy: [POLICY_SNIPPET] Return JSON: {"decision": "escalate" | "refuse", "rationale": "string"}
Watch for
- Missing schema checks leading to free-text responses
- Overly broad refusal when escalation would preserve trust
- No distinction between "can't help" and "won't help"

About the author
Prasad Kumkar
CEO & MD, Inference Systems
Prasad Kumkar is the CEO & MD of Inference Systems and writes about AI systems architecture, LLM infrastructure, model serving, evaluation, and production deployment. Over 5+ years, he has worked across computer vision models, L5 autonomous vehicle systems, and LLM research, with a focus on taking complex AI ideas into real-world engineering systems.
His work and writing cover AI systems, large language models, AI agents, multimodal systems, autonomous systems, inference optimization, RAG, evaluation, and production AI engineering.
Partnered with leading AI, data, and software stack.
How We Work
Custom AI workflows for your Business
One-fit-all AI don't work for modern businesses. At Inferensys, we aim to understand your business & custom requirements; which we use to define most efficient agentic workflows, the data, and the tools for your business.
01
Review the use case
We understand the task, the users, and where AI can actually help.
Read more02
Pick the right approach
We define what needs search, automation, or product integration.
Read more03
Build the first useful version
We implement the part that proves the value first.
Read more04
Improve from there
We add the checks and visibility needed to keep it useful.
Read moreThe first call is a practical review of your use case and the right next step.
Talk to Us