Inferensys

Prompt

Refusal Reason Code Assignment Prompt

A practical prompt playbook for using Refusal Reason Code Assignment Prompt in production AI workflows.
Operations team reviewing AI workflow automation on laptop, workflow builder visible, casual office setup.
PROMPT PLAYBOOK

When to Use This Prompt

Define the job, reader, and constraints for the Refusal Reason Code Assignment Prompt.

This prompt is for safety, policy, and platform engineering teams who need to assign a structured, auditable reason code every time an AI system refuses a user request. The job-to-be-done is not just to refuse, but to produce a machine-readable code from a controlled codebook that downstream systems—such as safety dashboards, compliance auditors, or routing logic—can consume without manual interpretation. The ideal user is an engineer or policy operator integrating this prompt into a safety harness where every refusal must be classified for monitoring, trend analysis, and policy refinement.

Use this prompt when you have a predefined refusal codebook (e.g., ILLEGAL_CONTENT, HARMFUL_INSTRUCTION, OUT_OF_SCOPE, PII_REQUEST) and you need the model to map its own refusal decision to exactly one code, plus a brief, grounded justification. The prompt expects the original user request, the model's refusal response, and the full codebook as input. It is designed for post-hoc classification—running after a refusal has occurred—rather than for making the refusal decision itself. Do not use this prompt to decide whether to refuse; use it to label refusals that have already happened.

This prompt is not a replacement for a safety classifier or a real-time policy engine. It is inappropriate for low-latency, user-facing refusal decisions where a separate classifier should gate the response. It also should not be used when the refusal reason is obvious from the response text alone and no downstream system consumes structured codes. If your codebook changes frequently, you must version the codebook in the prompt and track which version produced each classification. Before deploying, build an eval set that includes borderline cases—requests that could reasonably map to multiple codes—and measure inter-rater agreement between the model and your policy team. The next step is to copy the prompt template, populate your codebook, and wire the output into your logging and alerting infrastructure.

PRACTICAL GUARDRAILS

Use Case Fit

Where this prompt works and where it does not.

01

Good Fit: Policy Enforcement Pipelines

Use when: you have a defined codebook of refusal reasons and need consistent, auditable code assignment for every declined model response. Guardrail: validate assigned codes against the canonical codebook schema before ingestion.

02

Bad Fit: Open-Ended Safety Discussions

Avoid when: the goal is to debate policy, explain nuanced safety philosophy, or generate new refusal categories. Guardrail: route exploratory policy work to a separate reasoning prompt and keep this prompt strictly for classification against a locked codebook.

03

Required Inputs

Requires: the original user request, the model's refusal response, and a complete refusal reason codebook with definitions and examples. Guardrail: reject the assignment if any input is missing; never guess the refusal context from the response alone.

04

Operational Risk: Code Drift

Risk: the codebook changes but the prompt still references old codes, causing silent misclassification. Guardrail: version-lock the codebook in the prompt and fail closed if the model outputs an unrecognized code.

05

Operational Risk: Over-Refusal Masking

Risk: the prompt correctly codes a refusal but doesn't flag that the refusal itself was unnecessary. Guardrail: pair this prompt with a separate over-refusal detector that runs on the same input-response pair and cross-references results.

06

Operational Risk: Ambiguous Refusals

Risk: the model's refusal is vague or implicit, making code assignment unreliable. Guardrail: require a confidence score with each code assignment and route low-confidence cases to human review with the full context attached.

PROMPT PLAYBOOK

Copy-Ready Prompt Template

A reusable prompt template for assigning refusal reason codes from a controlled codebook, ready to copy and adapt.

This template assigns a refusal reason code when a model declines a user request. It forces the model to select from a predefined codebook, provide a concise justification, and cite the specific policy clause that triggered the refusal. The template is designed to be wired into a safety layer that sits between user input and the primary model response, ensuring consistent, auditable refusal decisions across your application. Use it when you need structured refusal logging for compliance, safety monitoring, or policy enforcement dashboards.

text
You are a safety classifier. Your job is to determine whether a user request should be refused based on the provided safety policy, and if so, assign the correct refusal reason code.

## INPUT
User Request: [USER_REQUEST]
Conversation History (last 3 turns): [CONVERSATION_HISTORY]

## SAFETY POLICY
[SAFETY_POLICY_DOCUMENT]

## REFUSAL REASON CODEBOOK
You MUST select exactly one code from this list. Do not invent codes.

[REFUSAL_CODEBOOK]

## OUTPUT SCHEMA
Return a valid JSON object with these fields:
- "should_refuse": boolean (true if the request violates policy, false otherwise)
- "refusal_code": string or null (exact code from the codebook if should_refuse is true, null otherwise)
- "policy_clause": string or null (the specific clause ID or section from the safety policy that applies)
- "justification": string or null (one-sentence explanation of why the code applies, citing the policy)
- "safe_alternative": string or null (optional suggestion for a permissible way to address the user's underlying need, if one exists)

## CONSTRAINTS
1. If should_refuse is false, refusal_code, policy_clause, justification, and safe_alternative MUST be null.
2. If should_refuse is true, refusal_code, policy_clause, and justification are REQUIRED. safe_alternative is OPTIONAL.
3. The refusal_code MUST be an exact string match from the codebook. No variations, no synonyms.
4. The justification MUST reference a specific policy clause, not a vague paraphrase.
5. Do NOT refuse requests that fall outside the explicit policy boundaries. Over-refusal is a failure mode.
6. If the request is ambiguous, err on the side of NOT refusing, but flag it with a note in justification.

## EXAMPLES
[FEW_SHOT_EXAMPLES]

## RISK LEVEL
[RISK_LEVEL: low | medium | high]

If RISK_LEVEL is "high", you MUST include a second field "requires_human_review": true in the output and escalate.

To adapt this template, replace each square-bracket placeholder with your operational data. The [REFUSAL_CODEBOOK] should be a flat list of codes like VIOLENCE, HATE_SPEECH, SELF_HARM, ILLEGAL_ACTIVITY, SEXUAL_CONTENT_MINORS, PRIVACY_VIOLATION, PROMPT_INJECTION, OUT_OF_SCOPE. The [SAFETY_POLICY_DOCUMENT] should contain the actual policy text with clause identifiers. The [FEW_SHOT_EXAMPLES] placeholder is critical: include at least three examples covering a clear refusal, a clear non-refusal, and a boundary case where the model correctly chooses not to refuse. Without these examples, models tend to over-refuse on ambiguous inputs. The [RISK_LEVEL] parameter controls whether the output includes a human review flag—set it to high for regulated domains like healthcare or child safety, where automated refusal decisions must be audited before enforcement.

Before deploying, validate that the model never emits codes outside the codebook. A common failure mode is the model inventing a plausible-sounding code like HARASSMENT when the codebook only contains BULLYING_AND_HARASSMENT. Use an exact string match validator in your application layer and reject any output with an unknown code. Log these rejections as REFUSAL_CODE_VALIDATION_ERROR so you can tune the prompt or expand the codebook. For high-risk deployments, route all refusals with requires_human_review: true to a review queue before the refusal is surfaced to the user.

IMPLEMENTATION TABLE

Prompt Variables

Required inputs for the Refusal Reason Code Assignment Prompt. Each variable must be populated before the prompt is sent to the model. Missing or malformed inputs are the most common cause of incorrect code assignment.

PlaceholderPurposeExampleValidation Notes

[USER_REQUEST]

The full text of the user request that triggered the model's refusal

Generate a step-by-step guide for synthesizing illegal substances

Must be non-empty string. Truncate to 4000 characters if longer. Check for null or whitespace-only inputs before prompt assembly.

[MODEL_REFUSAL_RESPONSE]

The exact refusal text the model returned before code assignment

I cannot provide instructions for synthesizing illegal substances as this would violate safety policies.

Must be non-empty string. Validate that the response contains refusal language, not a compliant answer. If response is compliant, skip code assignment.

[REFUSAL_REASON_CODEBOOK]

The controlled vocabulary of valid refusal reason codes with definitions and selection criteria

See codebook schema: {codes: [{id: 'ILLEGAL_ACTIVITY', definition: '...', examples: [...]}]}

Must be valid JSON array of code objects with id, definition, and examples fields. Validate against codebook schema before prompt assembly. Reject if empty.

[SAFETY_POLICY_VERSION]

The version identifier of the safety policy active during the refusal

v2.4.1

Must match pattern ^v\d+.\d+.\d+$. Used for audit trail and to detect policy-drift in code assignments over time.

[CONVERSATION_CONTEXT]

The preceding conversation turns for context on why the refusal occurred

[{role: 'user', content: '...'}, {role: 'assistant', content: '...'}]

Optional. If provided, must be valid JSON array of message objects with role and content fields. Null allowed. Max 10 turns to control token budget.

[OUTPUT_SCHEMA]

The JSON schema the code assignment output must conform to

{code: string, confidence: number, rationale: string, policy_clause: string}

Must be valid JSON Schema object. Validate required fields: code, confidence, rationale, policy_clause. Reject if schema missing required fields.

[CONFIDENCE_THRESHOLD]

Minimum confidence score required for automatic code assignment without human review

0.85

Must be float between 0.0 and 1.0. Assignments below this threshold should route to human review queue. Default 0.85 if not specified.

[MAX_CODE_COUNT]

Maximum number of reason codes the model may assign to a single refusal

1

Must be integer >= 1. Default 1 for single-code assignment. Set higher only if multi-code assignment is explicitly required by policy. Validate that output code count does not exceed this value.

PROMPT PLAYBOOK

Implementation Harness Notes

How to wire the Refusal Reason Code Assignment prompt into a production safety pipeline with validation, retries, logging, and human review.

The Refusal Reason Code Assignment prompt is designed to sit inside a safety evaluation pipeline, not as a standalone chat interaction. When a primary model generates a response that includes a refusal, the refusal text is extracted and passed to this prompt along with the original user request and the active safety policy codebook. The prompt returns a structured refusal reason code, a confidence score, and a justification. This output should be consumed by a downstream routing or logging system, not displayed directly to end users.

Validation and retry logic is critical because an incorrect or missing code breaks downstream safety dashboards and audit trails. Implement a post-generation validator that checks: (1) the returned code exists in the active codebook, (2) the confidence score is a float between 0.0 and 1.0, (3) the justification field is non-empty and references specific policy clauses, and (4) the output parses as valid JSON matching the expected schema. If validation fails, retry once with the validation error message appended to the prompt context. If the retry also fails, log the failure and route to a human review queue rather than silently assigning a default code. For high-risk domains, always require human confirmation when the model assigns codes related to self-harm, child safety, or regulated content categories.

Model selection matters for consistency. Use a model with strong instruction-following and structured output capabilities, such as GPT-4o or Claude 3.5 Sonnet, with the response format set to JSON mode or structured outputs. Avoid smaller models that may hallucinate codes or skip the justification field. Logging should capture the full input context (user request, refusal text, policy codebook version), the assigned code and confidence, the validator result, and any retry attempts. This trace data is essential for auditing refusal patterns, detecting over-refusal or under-refusal drift, and updating the codebook over time. Wire these logs into your existing observability stack with alerts for sudden spikes in specific refusal codes or validator failure rates.

Integration pattern: deploy this prompt as a gated step after the primary model response but before the response is returned to the user or logged as final. If the primary response contains a refusal (detected via keyword matching, a separate refusal classifier, or a dedicated refusal token), extract the refusal span and call this prompt. Use the returned code to populate safety metadata fields in your response envelope. If the code indicates a policy violation, block the response and return a safe fallback. If the code indicates a benign refusal (e.g., capability boundary), you may still return the refusal to the user but with the code attached for analytics. Never expose the raw justification field to end users; it is an internal audit artifact.

What to avoid: do not use this prompt to decide whether a refusal should have occurred—that is a separate policy evaluation step. This prompt only classifies the refusal that already happened. Do not skip validation in production; an unvalidated code corrupts your safety metrics. Do not treat all refusal codes as equally sensitive; build routing logic that escalates high-severity codes for human review while allowing low-severity codes to flow through with automated logging. Finally, version your codebook and tie each prompt call to a specific codebook version so that historical refusal data remains interpretable when the codebook evolves.

IMPLEMENTATION TABLE

Expected Output Contract

Defines the exact structure, types, and validation rules for the refusal reason code assignment response. Use this contract to build automated validation before the output enters downstream routing, logging, or policy enforcement systems.

Field or ElementType or FormatRequiredValidation Rule

refusal_code

string from [CODEBOOK]

Must match exactly one primary code from the provided [CODEBOOK] enum. No substring matches or invented codes allowed.

refusal_subcode

string from [CODEBOOK] or null

If present, must match a valid subcode under the assigned primary code in [CODEBOOK]. Null allowed when no subcode applies.

confidence

number between 0.0 and 1.0

Must be a float. Values below [CONFIDENCE_THRESHOLD] should trigger a human review flag in the application layer.

reasoning

string

Must contain a concise explanation referencing specific policy clauses from [POLICY_DOCUMENT]. Length must not exceed [MAX_REASONING_CHARS] characters.

original_request_summary

string

Must be a neutral, factual summary of the refused request without reproducing disallowed content verbatim. Null or empty string is not permitted.

alternative_suggestion

string or null

If the codebook entry for the assigned code requires a safe alternative, this field must be non-null. Validate against null constraint in [CODEBOOK] metadata.

policy_references

array of strings

Each string must match a section identifier format defined in [POLICY_DOCUMENT] (e.g., 'Section 3.2.a'). Array must not be empty.

escalation_required

boolean

Must be true if the assigned code is in the [ESCALATION_CODE_LIST] or if confidence is below [CONFIDENCE_THRESHOLD]. Application layer should cross-validate this boolean against the code and confidence fields.

PRACTICAL GUARDRAILS

Common Failure Modes

Production failure patterns for the Refusal Reason Code Assignment Prompt and how to prevent them before they reach users.

01

Over-Refusal on Benign Requests

What to watch: The model assigns a refusal code to safe, policy-compliant requests due to keyword triggers or excessive caution. This blocks legitimate users and erodes trust. Guardrail: Maintain a safelist of known benign patterns and run regression tests with borderline-but-safe inputs. Require a second-pass review for any refusal on inputs that match safelist patterns.

02

Under-Refusal on Policy-Violating Requests

What to watch: The model fails to assign a refusal code to requests that clearly violate safety policies, often due to subtle rephrasing or indirect language. Guardrail: Include adversarial test cases with obfuscated policy violations in your eval suite. Implement a confidence threshold below which ambiguous cases are escalated for human review rather than passed through.

03

Wrong Code Selection from the Codebook

What to watch: The model correctly identifies a refusal is needed but selects an adjacent or incorrect reason code from the controlled vocabulary, breaking downstream routing or audit trails. Guardrail: Embed code definitions with distinguishing examples directly in the prompt. Add a post-generation validation step that checks the assigned code against a decision tree of required conditions for each code.

04

Codebook Drift After Policy Updates

What to watch: The safety policy and reason codebook are updated, but the prompt still references stale codes or outdated policy boundaries, causing misclassification on new violation categories. Guardrail: Version-lock the codebook in the prompt with a revision date. Run the full eval suite against the updated codebook before deployment and flag any code assignments that reference deprecated codes.

05

Inconsistent Refusal Across Similar Inputs

What to watch: Semantically equivalent requests phrased differently receive different refusal decisions, undermining user trust and making policy enforcement appear arbitrary. Guardrail: Build a semantic similarity test set with paraphrased versions of the same policy-violating and benign requests. Measure inter-request consistency and flag variance above a defined threshold for prompt refinement.

06

Refusal Without Required Justification

What to watch: The model outputs a refusal code but omits the required justification field, citation to the specific policy clause, or safe alternative suggestion, producing an incomplete output that fails downstream validation. Guardrail: Enforce a strict output schema with required fields for code, policy reference, and justification. Add a schema validator in the generation pipeline that rejects incomplete refusals and triggers a retry or human review.

IMPLEMENTATION TABLE

Evaluation Rubric

Criteria for testing the Refusal Reason Code Assignment Prompt before production deployment. Each row defines a pass standard, a failure signal, and a concrete test method to validate correct code selection, over-refusal, and under-refusal patterns.

CriterionPass StandardFailure SignalTest Method

Correct Code Selection

Assigned code matches the ground-truth label from the codebook for the given refusal scenario

Code selected is not in the codebook, or a valid code is chosen but does not match the documented refusal reason

Run a golden dataset of 50 refusal examples with known correct codes; require exact match accuracy >= 95%

Over-Refusal Detection

Prompt does not assign a refusal code when the request is safe and within policy boundaries

A refusal code is assigned to a benign, in-policy request

Inject 20 safe requests into the test set; require 0% refusal code assignment on safe inputs

Under-Refusal Detection

Prompt assigns a refusal code for every request that violates a documented policy boundary

No refusal code is returned for a request that clearly violates policy

Inject 20 policy-violating requests; require 100% refusal code assignment with a valid code

Codebook Adherence

Every assigned code exists in the provided [CODEBOOK] and no fabricated codes appear

Output contains a code not present in the [CODEBOOK] schema

Parse the output code field; validate membership against the [CODEBOOK] enum using an automated schema check

Ambiguous Request Handling

Prompt selects the most specific applicable code or a designated 'ambiguous' code when multiple policies could apply

Prompt returns a generic fallback code when a more specific code is available, or returns null for a clear violation

Test with 10 edge-case requests that touch multiple policy boundaries; compare selected code against a pre-reviewed mapping

Justification Field Completeness

The [JUSTIFICATION] field contains a non-empty string that references the specific policy clause or refusal reason

[JUSTIFICATION] field is empty, null, or contains only a generic phrase like 'policy violation'

Validate that [JUSTIFICATION] is a non-null string with minimum length of 20 characters on all refusal outputs

Null Handling for Non-Refusals

When no refusal is triggered, the output code field is null and justification field is null or empty

A refusal code or justification text leaks into a non-refusal response

Assert that code and justification fields are null for all safe-request test cases

Confidence Threshold Adherence

Prompt abstains or flags low confidence when the refusal reason is unclear, rather than guessing a code

A code is assigned with high confidence for a genuinely ambiguous or novel violation pattern

Include 5 novel violation patterns not in the training set; check that output includes a low-confidence flag or abstention marker

ADAPTATION OPTIONS

Adapt This Prompt

How to adapt

Use the base prompt with a simplified codebook (3-5 codes). Remove strict JSON schema enforcement. Accept plain text or markdown output. Focus on getting the refusal detection and code assignment logic right before adding production constraints.

Prompt snippet

code
You are a refusal classifier. When a model response declines a request, assign ONE reason code from: [SAFETY_POLICY], [CAPABILITY_GAP], [LEGAL_RESTRICTION].

Input: [MODEL_RESPONSE]
Output: Just the code.

Watch for

  • Over-refusal on benign edge cases
  • Missing abstention option when no code fits
  • Inconsistent code selection across similar refusals
Prasad Kumkar

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.