This prompt is for platform operators and security engineers who need to generate clear, auditable explanations when an agent's tool action is blocked by a safety or permission boundary. The primary job-to-be-done is transparency: turning a silent failure or a generic 'access denied' error into a structured message that tells the user or calling system exactly what was blocked, which policy was violated, and what alternatives exist. The ideal user is an AI platform engineer integrating this prompt into a tool execution gateway, a compliance officer requiring audit trails for denied actions, or a developer building user-facing copilots where unexplained denials erode trust.
Prompt
Tool Denial Explanation Prompt Template

When to Use This Prompt
Define the job, reader, and constraints for the Tool Denial Explanation Prompt Template.
Use this prompt when your system has already made a blocking decision—via an allowlist, a confirmation gate, a scope check, or a least-privilege enforcement layer—and you need to communicate that decision downstream. The prompt requires specific inputs: the blocked tool name and arguments, the policy that triggered the denial, the user's original intent, and any available alternatives. Do not use this prompt as the enforcement mechanism itself. It explains a denial; it does not decide whether to deny. The decision must be made by deterministic guardrails before this prompt is invoked. Also avoid using this prompt for transient errors like network timeouts or rate limits; those require a different retry-and-fallback communication pattern.
Before deploying, ensure you have wired the prompt into a post-denial handler that captures the policy reference, the violating argument, and the user's original request. Test with edge cases where multiple policies could apply, where the user's intent is ambiguous, and where no safe alternative exists. The output should be parseable by both humans and downstream systems—consider including a machine-readable status code alongside the natural-language explanation. If the denial involves regulated data or high-risk operations, route the explanation through a human review queue before it reaches the end user.
Use Case Fit
Where the Tool Denial Explanation Prompt Template delivers value and where it introduces risk. Use these cards to decide if this prompt fits your operational context.
Good Fit: User-Facing Tool Gateways
Use when: A platform blocks a tool action and must explain the denial to an end user or downstream system. The prompt produces structured, policy-aware explanations that reduce support tickets and confusion. Guardrail: Always include the violated policy reference and an appeal path so the denial is auditable and actionable.
Bad Fit: Silent Security Enforcement
Avoid when: The denial reason itself could leak system architecture, security boundaries, or tool inventory to an adversary. Verbose explanations in security-sensitive contexts become reconnaissance vectors. Guardrail: Use a separate security-tier prompt that returns a generic refusal without internal policy details when the caller is untrusted.
Required Input: Structured Denial Context
Risk: The prompt cannot produce a useful explanation without knowing the blocked action, the violated policy, the actor's role, and available alternatives. Missing context produces vague or misleading denials. Guardrail: Enforce a strict input schema that requires blocked_action, policy_reference, actor_role, and alternatives fields before invoking the prompt.
Operational Risk: Denial Fatigue and Over-Blocking
Risk: If the underlying policy engine blocks too aggressively, users receive a flood of denial explanations and learn to route around the system. The prompt amplifies a policy problem rather than solving it. Guardrail: Monitor denial volume by policy type and trigger a policy review when any single policy exceeds a threshold denial rate within a time window.
Operational Risk: Appeal Path Dead Ends
Risk: The prompt generates an appeal path that points to a non-existent queue, unmonitored inbox, or broken workflow. This erodes trust and creates compliance gaps. Guardrail: Validate appeal paths programmatically before including them in the denial output. Run a periodic liveness check on all referenced appeal endpoints.
Good Fit: Compliance-Auditable Systems
Use when: Regulated environments require every denial to be traceable to a specific policy, timestamped, and attributable. The prompt's structured output feeds directly into audit trails. Guardrail: Store the generated denial explanation alongside the original denial event in an immutable log. Never regenerate explanations retroactively.
Copy-Ready Prompt Template
A reusable prompt template for generating clear, policy-grounded explanations when a tool action is blocked.
This template produces a structured denial explanation for the user or calling system. It forces the model to reference the specific policy that was violated, describe what was blocked, and offer concrete alternatives or an appeal path. The prompt is designed to be wired into a post-decision handler in your agent orchestration layer—after a policy engine or guardrail has already determined the action is blocked, not as the decision-maker itself.
textYou are generating a tool denial explanation for a user or calling system. Your goal is to be transparent, precise, and helpful without revealing internal security details or suggesting workarounds that would violate policy. ## INPUT - Blocked Action: [BLOCKED_ACTION] - Tool Name: [TOOL_NAME] - Violated Policy: [POLICY_NAME] - Policy Description: [POLICY_DESCRIPTION] - User Request Summary: [USER_REQUEST_SUMMARY] - Available Alternatives: [ALTERNATIVES] - Appeal Path: [APPEAL_PATH] - Risk Level: [RISK_LEVEL] ## OUTPUT SCHEMA Return a JSON object with these fields: - `explanation_summary` (string, 1-2 sentences): Plain-language summary of what was blocked and why. - `policy_reference` (string): Name and brief description of the violated policy. - `alternatives` (array of strings): Concrete, safe alternatives the user can try. Empty array if none exist. - `appeal_instructions` (string or null): How to request a review or exception. Null if no appeal path exists. - `risk_classification` (string): One of "low", "medium", "high", "critical". ## CONSTRAINTS - Do not reveal internal system architecture, security rules, or the names of other blocked actions. - Do not suggest ways to bypass the policy. - If the risk level is "high" or "critical", include a note that the action was automatically blocked and logged for security review. - Use a neutral, professional tone. Do not apologize excessively or blame the user. - If no alternatives exist, state that clearly rather than inventing weak options. - Keep the explanation under 150 words total. ## EXAMPLES ### Example 1: Read-only scope violation Input: User requested DELETE on production database via SQL tool. Policy: "Production databases are read-only for automated agents." Output: { "explanation_summary": "The requested DELETE operation on the production database was blocked because automated agents have read-only access to production systems.", "policy_reference": "Production Database Read-Only Policy (DB-RO-001): Automated agents may only execute SELECT queries against production databases.", "alternatives": ["Request a read-only report of the data you wanted to delete", "Submit a manual change request through the DBA team"], "appeal_instructions": "To request an exception, file a change request at https://internal.example.com/dba-requests with justification.", "risk_classification": "high" } ### Example 2: Rate limit exceeded Input: User attempted 500 API calls in 1 minute. Policy: "Maximum 100 calls per minute per user." Output: { "explanation_summary": "Your request was blocked because you exceeded the rate limit of 100 calls per minute. You sent 500 requests in the last 60 seconds.", "policy_reference": "API Rate Limit Policy (RATE-002): Users are limited to 100 API calls per minute.", "alternatives": ["Wait 60 seconds and retry", "Batch your requests into fewer calls", "Request a rate limit increase for your account"], "appeal_instructions": "To request a higher rate limit, contact your account administrator.", "risk_classification": "low" } Now generate the denial explanation for the provided input.
Adapt this template by replacing the example scenarios with ones that match your actual tool policies and risk classifications. The [ALTERNATIVES] and [APPEAL_PATH] placeholders should be populated by your policy engine before the prompt is assembled—don't ask the model to invent safe alternatives at runtime. For high-risk domains like healthcare or finance, add a [REVIEWER_ID] field and require that the explanation be logged alongside the blocking decision for audit purposes. Test this prompt against edge cases where the blocked action is ambiguous or the user request summary is incomplete; the model should ask for clarification rather than guessing at the violation.
Prompt Variables
Required inputs for the Tool Denial Explanation Prompt Template. Each placeholder must be populated before the prompt is assembled and sent to the model. Missing or malformed variables will produce generic, unhelpful denials that fail audit requirements.
| Placeholder | Purpose | Example | Validation Notes |
|---|---|---|---|
[REQUESTED_ACTION] | The specific tool call or operation the agent attempted | DELETE /api/v1/users/bulk with payload containing 340 user IDs | Must be a non-empty string describing the tool name, endpoint, or operation. Validate against the tool registry to confirm the action exists. |
[BLOCKING_POLICY] | The policy rule or permission boundary that prevented execution | POLICY: write_operations_require_human_approval for bulk mutations exceeding 10 records | Must reference a real policy identifier from the policy store. Validate that the policy ID exists and is active. Null not allowed. |
[POLICY_REFERENCE] | A stable identifier or link to the full policy document | ref:io.acme.policies.tool-access/v2.4/section-12.3 | Must be a resolvable URI or internal reference string. Validate format against the policy registry schema. If no reference exists, use 'POLICY_REFERENCE_UNAVAILABLE' and flag for ops review. |
[VIOLATION_DETAIL] | Specific constraint that was violated, with threshold values if applicable | Bulk write limit exceeded: attempted 340 records, limit is 10 without approval | Must include the attempted value and the allowed limit. Parse check: confirm both numbers are present and the comparison is correct. Null not allowed. |
[ALTERNATIVE_PATH] | A concrete, available alternative the user or system can take | Submit a bulk operation approval request via /api/v1/approvals/bulk-write with the same payload | Must be an actionable path, not a vague suggestion. Validate that the alternative endpoint or workflow exists and is reachable. If no alternative exists, use 'NO_ALTERNATIVE_AVAILABLE' and require escalation. |
[APPEAL_INSTRUCTIONS] | How to challenge the denial or request an exception | File an exception request at https://acme.io/security/exceptions referencing policy ref:io.acme.policies.tool-access/v2.4/section-12.3 | Must include a URL, email, or ticket system reference. Validate that the appeal channel is monitored. If no appeal path exists, state 'APPEAL_PATH_NOT_CONFIGURED' and log an ops alert. |
[DENIAL_TIMESTAMP] | ISO 8601 timestamp of when the denial was generated | 2025-03-15T14:32:17.828Z | Must be valid ISO 8601 with timezone. Auto-generated at denial time. Validate format before insertion. Null not allowed. |
[REQUEST_TRACE_ID] | Correlation ID linking the denial to the original request and audit trail | trace:req_9f8a2b1c-4d3e-5f6a-7b8c-9d0e1f2a3b4c | Must be a valid UUID or trace ID from the request context. Validate format and confirm the trace ID exists in the observability system. Null not allowed. |
Implementation Harness Notes
How to wire the Tool Denial Explanation prompt into a production application with validation, logging, and escalation paths.
The Tool Denial Explanation prompt is not a standalone chat interaction—it is a structured response generator that sits inside a policy enforcement point in your agent platform. When a tool invocation is blocked by a permission boundary, allowlist, or scope check, your application code should call this prompt with the blocked action details, the violated policy, and the user's original intent. The prompt's output becomes the machine-readable denial payload returned to the calling system or end user. This means you must treat the prompt as a deterministic component with a strict input contract and a validated output schema, not as an open-ended conversational fallback.
Wire the prompt into your tool execution middleware. When your permission engine denies a tool call, construct the input object with [BLOCKED_ACTION] (the tool name and arguments that were rejected), [VIOLATED_POLICY] (the specific policy rule or boundary that triggered the denial), [USER_INTENT] (the original request that led to the blocked action), and [AVAILABLE_ALTERNATIVES] (any permitted tools or actions that could partially satisfy the request). Pass this structured input to the model with a low temperature setting (0.0–0.2) to maximize output consistency. Validate the response against your expected schema before returning it: check that denial_reason is populated, policy_reference includes a traceable rule ID, and alternatives is either a valid list or explicitly null. If validation fails, retry once with the validation errors appended to the prompt as [CONSTRAINTS]. After a second failure, fall back to a hardcoded denial template and log the full prompt-response pair for debugging.
Log every denial event with the full input, output, policy reference, and user session ID. These logs serve three purposes: audit evidence for compliance reviews, debugging data for permission-tuning cycles, and trend analysis for identifying policies that generate excessive friction. If your platform supports human appeal workflows, include the appeal_path field from the prompt output as an actionable link or reference in your UI. Do not allow the agent to continue execution after a denial—the denial response should terminate the current tool chain and return control to the user or orchestrator. For high-risk domains, require a human reviewer to confirm that the denial was correct before the appeal process begins, and never let the model itself decide to override a policy denial.
Expected Output Contract
Fields, format, and validation rules for the structured denial explanation produced by the Tool Denial Explanation Prompt Template. Use this contract to parse, validate, and route denial outputs in production.
| Field or Element | Type or Format | Required | Validation Rule |
|---|---|---|---|
denial_id | string (UUID v4) | Must match UUID v4 pattern. Auto-generated if missing. Log for audit correlation. | |
timestamp | string (ISO 8601 UTC) | Must parse as valid ISO 8601 datetime in UTC. Reject if future-dated beyond 5-minute clock skew tolerance. | |
blocked_action | object | Must contain tool_name (string), operation (string), and target_resource (string). All three sub-fields required. Reject if any sub-field is empty or missing. | |
policy_violated | object | Must contain policy_id (string), policy_name (string), and policy_version (string). Policy_id must match [POLICY_REFERENCE] pattern. Reject if policy_id is not in known policy registry. | |
violation_reason | string | Must be 20-500 characters. Must not contain PII or raw tool arguments. Reject if reason is generic placeholder like 'policy violation' without specifics. | |
denial_decision | string (enum) | Must be one of: BLOCKED, BLOCKED_WITH_APPEAL, BLOCKED_WITH_ALTERNATIVE. Reject unknown values. BLOCKED_WITH_ALTERNATIVE requires alternatives field to be non-empty. | |
alternatives | array of objects | Required when denial_decision is BLOCKED_WITH_ALTERNATIVE. Each object must have action (string) and description (string). Reject if array is empty when required. Null allowed otherwise. | |
appeal_path | object | Required when denial_decision is BLOCKED_WITH_APPEAL. Must contain method (enum: TICKET, EMAIL, WEB_FORM, API) and contact (string). Reject if contact is not a valid URI or email pattern. Null allowed otherwise. |
Common Failure Modes
Tool denial explanations fail in predictable ways that erode user trust, obscure audit trails, and create security gaps. These cards cover the most common failure modes and how to guard against them before they reach production.
Vague Denial Without Policy Reference
What to watch: The model produces a generic refusal like 'I can't do that' without citing the specific policy, rule, or scope boundary that blocked the action. Users can't distinguish between a bug, a permission gap, and an intentional block. Guardrail: Require the prompt to output a structured denial with a policy_id or rule_reference field. Validate that every denial includes a non-empty reference before returning it to the user.
Hallucinated Appeal Paths
What to watch: The model invents an escalation contact, email address, or appeal URL that doesn't exist. This creates liability when users follow fake instructions and receive no response. Guardrail: Supply appeal path information as grounded context in the prompt template. Use a post-generation validator that checks any contact information against an allowlist of approved escalation channels.
Over-Explanation Leaking System Internals
What to watch: The denial explanation reveals tool names, internal permission models, allowlist/denylist rules, or architecture details that an attacker can use to probe boundaries. Guardrail: Define an output schema that separates the user-facing explanation from internal audit_detail. Strip internal fields before returning the response to the user. Test with red-team prompts that ask 'why exactly was this blocked?'
Inconsistent Denial Tone Across Tools
What to watch: One tool denial sounds apologetic, another sounds punitive, and a third is purely technical. Inconsistent tone confuses users and undermines trust in the platform's safety decisions. Guardrail: Include a tone specification in the prompt template (e.g., 'neutral, helpful, and unambiguous'). Add an eval that scores denial outputs for tone consistency across different blocked actions.
Denial Bypass Through Re-Prompting
What to watch: A user rephrases the blocked request in a follow-up turn, and the agent loses the denial context, attempting the action again without the original block state. Guardrail: Include the denial reason and policy reference in the agent's session state. Add a pre-invocation check that compares the current request against previously denied actions before calling any tool.
Missing Alternative or Remediation Path
What to watch: The denial explains what was blocked but offers no alternative action, leaving the user stuck. This is especially damaging when the block is due to a scope limit that has a legitimate workaround. Guardrail: Require the prompt to generate at least one suggested_alternative when alternatives exist. Validate that the alternative doesn't violate the same policy that blocked the original action.
Evaluation Rubric
Criteria for testing the quality of a tool denial explanation before shipping. Each row defines a pass standard, a failure signal, and a concrete test method.
| Criterion | Pass Standard | Failure Signal | Test Method |
|---|---|---|---|
Policy Reference | Output cites the specific policy ID or rule name that blocked the action | Vague language like 'policy violation' without a named reference | Assertion check: output contains a field matching [POLICY_REFERENCE] pattern |
Action Description | Output restates the blocked action accurately as the user requested it | Mischaracterizes or omits the specific tool and arguments that were denied | Semantic similarity check between [REQUESTED_ACTION] and the explanation's action summary |
Alternative Path | Output suggests at least one concrete, permitted alternative when one exists | States 'no alternatives' when a read-only or scoped-down operation is available | Keyword presence check for alternative action suggestion or explicit 'no alternative' with reason |
Appeal Instructions | Output includes a clear next step for review or appeal when the policy allows it | Omits appeal path entirely or provides a dead-end instruction | Regex match for [APPEAL_PROCESS] template or explicit 'not appealable' statement |
Tone and Blame | Output is neutral and procedural, avoiding blame on the user or the system | Uses accusatory language like 'you are not allowed' or defensive language like 'the system refused' | LLM-as-judge evaluation against a tone rubric with a pass threshold of 4/5 |
Data Minimization | Output does not echo back sensitive arguments or internal rule logic | Leaks [SENSITIVE_ARGUMENT] values or exposes deny-list logic in the explanation | Regex scan for known sensitive patterns and substring match against internal rule definitions |
Structured Output | Output conforms to the [OUTPUT_SCHEMA] with all required fields present and valid | Missing required fields, malformed JSON, or extra unvalidated fields | Schema validation pass against the defined JSON Schema for the denial response |
Idempotency Key | Output includes the [IDEMPOTENCY_KEY] from the request for trace correlation | Missing or mismatched idempotency key, breaking audit trail linkage | Exact string match between request [IDEMPOTENCY_KEY] and response field |
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 template and a hardcoded policy list. Use a single model call with no retry logic. Replace [POLICY_REFERENCE] with a static string like "Data-Access-Policy-v2.1". Skip the appeal path generation and focus on getting the denial reason and blocked action right.
Simplify the output to plain text instead of structured JSON while you iterate on tone and completeness.
Watch for
- Denial explanations that sound accusatory rather than informative
- Missing the specific policy clause that triggered the block
- Overly verbose responses that bury the reason
- No distinction between permanent blocks and actions that could be approved

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