This prompt is designed for trust-and-safety operations where every refused user request must be reviewed by a human analyst. Instead of forcing analysts to start from a blank ticket, the model pre-annotates the refused request with a structured brief: policy tags, a risk score, verbatim evidence excerpts from the user's input, references to similar past cases, and a recommended disposition. The primary job-to-be-done is reducing analyst decision fatigue and accelerating queue throughput by providing a consistent, data-rich starting point for human judgment. The ideal user is a trust-and-safety analyst, a policy operations lead, or an engineering team building an internal review tool. You need a stable, well-documented policy taxonomy and a queue of refused requests that are already flagged by an upstream safety classifier.
Prompt
Internal Review Queue Annotation Prompt Template

When to Use This Prompt
Understand the ideal scenario, required context, and critical limitations for deploying the Internal Review Queue Annotation Prompt Template.
Deploy this prompt when your review queue is large enough that annotation inconsistency and analyst burnout are measurable problems. It is most effective when integrated into a review tool that can display the model's structured output alongside the original request, allowing the analyst to confirm, correct, or escalate the annotation with a single click. The prompt requires several inputs to function correctly: the full text of the user's refused request, the specific policy clause that triggered the refusal, a defined risk score scale, and a schema for the desired output. You should not use this prompt to auto-resolve tickets without human review. The output is a decision-support artifact, not a final determination. Using it to automatically close tickets bypasses the human judgment step and creates an unacceptable risk of incorrect enforcement.
Avoid this prompt if your policy taxonomy is in flux, as the model will produce annotations that lag behind your latest policy changes. It is also a poor fit for low-risk or ambiguous requests where a simple form response is sufficient; the overhead of structured annotation is wasted on cases that don't require deep analysis. Finally, do not use this prompt in isolation. It must be part of a larger harness that logs the analyst's final decision, compares it to the model's recommendation, and feeds discrepancies back into a dataset for improving the prompt or fine-tuning a model over time. The next step after reading this section is to review the prompt template itself and map its placeholders to the fields in your internal review tool.
Use Case Fit
Where the Internal Review Queue Annotation Prompt Template delivers value and where it introduces risk or wasted effort.
Good Fit: High-Volume Triage
Use when: trust-and-safety teams face a backlog of refused requests needing structured annotation before human review. Guardrail: Pre-annotation reduces analyst fatigue and improves consistency, but always require human confirmation on final disposition.
Bad Fit: Novel Attack Patterns
Avoid when: the refusal reason involves a completely new jailbreak or injection technique not represented in training data. Guardrail: Route genuinely novel threats directly to senior analysts and use the prompt only for pattern documentation after human analysis.
Required Inputs
What you need: the original user request, the model's refusal response, the specific policy clause triggered, and any session context leading up to the refusal. Guardrail: Missing session context causes misclassification of multi-turn probing; enforce context completeness before annotation runs.
Operational Risk: Annotation Drift
What to watch: pre-annotation quality degrades as policies evolve or new refusal categories emerge. Guardrail: Run weekly calibration checks comparing AI annotations against senior analyst gold labels and trigger retuning when agreement drops below threshold.
Operational Risk: Analyst Over-Reliance
What to watch: analysts rubber-stamping AI annotations without critical review, especially during high-volume periods. Guardrail: Require at least one substantive modification per review batch and flag zero-edit reviews for audit sampling.
Feedback Loop Requirement
What to watch: annotation quality stagnates without a structured feedback path from human reviewers back to the prompt. Guardrail: Log every analyst correction as a training signal and schedule monthly prompt updates based on correction patterns.
Copy-Ready Prompt Template
A reusable prompt with square-bracket placeholders for pre-annotating refused requests before human review.
This template is designed to be wired directly into your internal review queue system. When a new refused request enters the queue, this prompt runs automatically to pre-annotate the item, giving your trust-and-safety analysts a structured head start. The prompt expects the raw user request, the refusal reason already generated, and any relevant session context. It then produces a structured annotation that includes policy tags, a risk score, evidence excerpts, similar case references, and a recommended disposition. The goal is to reduce analyst triage time and improve consistency across reviewers.
codeYou are an expert trust-and-safety annotation assistant. Your task is to pre-annotate a refused user request for human review. You must produce a structured, evidence-backed annotation that helps a human analyst make a final decision quickly and consistently. ## INPUT [USER_REQUEST] [REFUSAL_REASON] [SESSION_CONTEXT] [POLICY_LIBRARY] [CASE_HISTORY] ## OUTPUT_SCHEMA Return a single JSON object with the following fields. Do not include any text outside the JSON. { "policy_tags": [ { "policy_id": "string (from POLICY_LIBRARY)", "policy_name": "string", "violation_type": "confirmed | suspected | borderline", "confidence": 0.0-1.0 } ], "risk_score": { "overall": 0.0-1.0, "breakdown": { "severity": 0.0-1.0, "immediacy": 0.0-1.0, "user_history_escalation": 0.0-1.0 } }, "evidence_excerpts": [ { "source": "user_request | session_context", "text": "string (exact quote)", "policy_tag_index": 0 (index into policy_tags array), "relevance": "direct | supporting | contextual" } ], "similar_cases": [ { "case_id": "string (from CASE_HISTORY)", "similarity_reason": "string", "disposition": "string" } ], "recommended_disposition": "uphold_refusal | overturn_refusal | escalate | request_clarification", "disposition_rationale": "string (2-4 sentences explaining the recommendation)", "analyst_notes": "string (any additional context, ambiguities, or edge-case flags the analyst should consider)", "requires_legal_review": true | false, "requires_urgent_action": true | false } ## CONSTRAINTS 1. Only tag policies that exist in POLICY_LIBRARY. Do not invent policy names or IDs. 2. Evidence excerpts must be exact quotes from the input. Do not paraphrase. 3. If no similar cases exist in CASE_HISTORY, return an empty array for similar_cases. 4. If the request is ambiguous, set recommended_disposition to "request_clarification" and explain what is unclear in disposition_rationale. 5. Risk scores must be calibrated: a score above 0.8 should indicate a clear, severe violation requiring immediate action. 6. Do not make a final decision. Your annotation is advisory. The human analyst owns the disposition. 7. If the refusal reason appears inconsistent with the user request, flag this in analyst_notes.
To adapt this template for your environment, replace the square-bracket placeholders with your actual data sources. [POLICY_LIBRARY] should contain your organization's policy definitions with IDs, names, and full policy text. [CASE_HISTORY] should contain a set of previously reviewed cases with their dispositions. If you don't have a case history yet, remove the similar_cases field from the output schema or set it to always return an empty array. The risk score breakdown fields can be adjusted to match your internal risk taxonomy. Before deploying, run this prompt against a golden set of 20-30 previously reviewed cases and compare the model's annotations against the human decisions. Measure agreement on policy tags, risk score calibration, and disposition recommendations. Flag any systematic disagreements for prompt refinement.
Prompt Variables
Inputs the prompt needs to work reliably. Validate each before sending to the model. Missing or malformed variables cause misannotation and downstream review queue errors.
| Placeholder | Purpose | Example | Validation Notes |
|---|---|---|---|
[REFUSED_REQUEST_TEXT] | The full text of the user request that was refused by the upstream safety system | "Write a script to scrape user profiles from socialmedia.com and extract email addresses" | Required. Must be non-empty string. Truncate at 4000 chars. Check for null or whitespace-only input before prompt assembly. |
[REFUSAL_REASON_CODE] | Machine-readable code from the upstream classifier indicating which policy was triggered | "PRIVACY_DATA_SCRAPING" | Required. Must match known enum in policy registry. Reject unknown codes before annotation. Maintain allowlist of valid codes. |
[UPSTREAM_CLASSIFIER_CONFIDENCE] | Confidence score from the upstream safety classifier that triggered the refusal | 0.94 | Required. Must be float between 0.0 and 1.0. Values below 0.5 should trigger a separate low-confidence review flag. Null not allowed. |
[SESSION_RISK_SCORE] | Cumulative risk score for the user session prior to this request, if available | 0.72 | Optional. Float between 0.0 and 1.0. If null, annotator should note session context unavailable. Do not default to 0.0 without explicit signal. |
[USER_VISIBLE_REFUSAL_TEXT] | The refusal message actually shown to the user by the upstream system | "I can't help with scraping personal data from websites. This violates our privacy policy." | Required. Must be non-empty string. Compare against [REFUSED_REQUEST_TEXT] to detect refusal-response mismatch. Truncate at 2000 chars. |
[POLICY_DOCUMENT_VERSION] | Version identifier for the safety policy document in effect at time of refusal | "v2.4.1-2025-01-15" | Required. Must match semver or date-versioned policy doc. Reject if version predates last policy update. Used for audit trail and regression testing. |
[ANALYST_FEEDBACK_PRIOR] | Previous analyst correction or feedback on similar annotations, if available in feedback loop | "Previous annotation for PRIVACY_DATA_SCRAPING was downgraded from CRITICAL to HIGH per analyst review on 2025-03-12" | Optional. String or null. If present, must include timestamp and prior disposition. Used to calibrate annotation consistency. Null allowed for first-pass annotation. |
[QUEUE_PRIORITY_TIER] | Priority level assigned by intake routing before annotation begins | "STANDARD" | Required. Must be one of: LOW, STANDARD, HIGH, CRITICAL. Reject unknown tiers. CRITICAL tier requests must be annotated within SLA window; flag if annotation latency exceeds threshold. |
Implementation Harness Notes
How to wire the annotation prompt into a trust-and-safety review queue with validation, feedback loops, and human oversight.
This prompt is designed to be called programmatically within a review queue pipeline, not used as a one-off chat interaction. When a user request is refused by the primary AI system, the refused request, the refusal response, and the session context are pushed into an internal review queue. Before a human analyst opens the case, this prompt is executed to pre-annotate the entry. The structured output reduces analyst triage time and ensures consistent metadata tagging across the queue. The prompt expects the raw refused request text, the refusal reason emitted by the system, the applicable policy clauses, and any relevant conversation history as input variables.
The implementation harness should enforce strict input validation before calling the model. The [REQUEST_TEXT] and [REFUSAL_REASON] fields must be non-empty strings. The [POLICY_CLAUSES] field should be a list of policy identifiers drawn from a controlled vocabulary maintained in your policy management system; reject any input that references unknown policies. The [SESSION_CONTEXT] field is optional but strongly recommended for multi-turn cases. On the output side, validate the JSON schema before the annotation enters the queue. Required fields include policy_tags, risk_score, evidence_excerpts, and recommended_disposition. If the model returns a malformed JSON object, use a repair prompt or a retry with stricter formatting instructions before falling back to a human-only review flag. Log every annotation attempt—including parse failures, schema violations, and retries—so the feedback loop can identify brittle cases.
The analyst feedback loop is the most critical part of this harness. After a human reviewer corrects or confirms the pre-annotation, the corrected annotation must be written back to a dataset that pairs the original prompt input with the human-corrected output. This dataset becomes the foundation for few-shot examples, fine-tuning data, and regression tests. Run a weekly eval comparing model annotations against human-corrected annotations on held-out cases to measure policy_tag agreement, risk_score mean absolute error, and recommended_disposition accuracy. If agreement drops below a defined threshold—typically 90% for policy tags in high-stakes queues—trigger a review of recent false positives and update the prompt's few-shot examples or policy definitions. Do not ship prompt changes to the annotation pipeline without running the updated prompt against the golden dataset of human-corrected cases.
Expected Output Contract
Fields, format, and validation rules for the structured annotation object the model must return for each refused request in the review queue.
| Field or Element | Type or Format | Required | Validation Rule |
|---|---|---|---|
review_id | string | Must match the [REVIEW_ID] input exactly. Fail if missing or mismatched. | |
policy_tags | array of strings | Each tag must exist in [POLICY_TAG_LIST]. Array must not be empty. Fail if unknown tag present. | |
risk_score | number (0.0-1.0) | Must be a float between 0.0 and 1.0 inclusive. Fail if out of range or non-numeric. | |
evidence_excerpts | array of objects | Each object must contain 'text' (string) and 'source' (string). Array must not be empty. Fail if 'text' is empty or 'source' is missing. | |
similar_case_refs | array of strings | If provided, each string must match a valid case ID pattern (e.g., CASE-XXXX). Null allowed. Fail if pattern mismatch. | |
recommended_disposition | string | Must be one of [DISPOSITION_OPTIONS]. Fail if value not in allowed enum. | |
analyst_feedback_prompt | string | If present, must be a non-empty string under 500 characters. Null allowed. Fail if empty string or exceeds length. | |
annotation_confidence | number (0.0-1.0) | Must be a float between 0.0 and 1.0 inclusive. Fail if out of range or non-numeric. Retry if below [CONFIDENCE_THRESHOLD]. |
Common Failure Modes
What breaks first when pre-annotating refused requests for human review, and how to guard against it.
Hallucinated Policy Citations
What to watch: The model invents policy names, clause numbers, or violation categories that do not exist in your actual safety policy library. This misleads reviewers and corrupts downstream audit trails. Guardrail: Constrain the prompt with a closed enum of valid policy tags and require the model to quote the exact policy text from a provided reference block. Validate annotations against the canonical policy list before they enter the review queue.
Risk Score Inflation or Deflation
What to watch: The model consistently assigns risk scores that are too high (over-escalation) or too low (missed threats), often due to anchoring on surface-level keywords rather than intent. Guardrail: Calibrate scores with a few-shot rubric that maps specific evidence patterns to score ranges. Implement a secondary LLM judge to audit a sample of annotations and flag score drift for recalibration.
Evidence Excerpt Contamination
What to watch: The model copies the full user request into the evidence field without isolating the specific violating spans, or it paraphrases the request in a way that loses the original harmful language reviewers need to see. Guardrail: Require verbatim excerpt extraction with character offsets or quoted substrings. Use a post-processing validator to reject annotations where the excerpt is identical to the full input or contains no quoted material.
Disposition Recommendation Drift
What to watch: The model's recommended disposition (e.g., 'escalate', 'dismiss', 'warn') becomes misaligned with your team's actual enforcement standards over time, especially as new policy precedents are set. Guardrail: Include recent, anonymized disposition examples as dynamic few-shot context. Log every analyst override of the model's recommendation and feed those corrections back into the prompt's example set on a weekly cadence.
Similar Case Hallucination
What to watch: The model fabricates references to non-existent prior cases or review IDs to justify its annotation, creating a false sense of precedent for the human reviewer. Guardrail: If your system does not have a retrieval step for real prior cases, explicitly instruct the model to leave the similar-case field empty rather than generate content. If retrieval is used, require the model to cite only returned case IDs and reject annotations with unverified references.
Analyst Feedback Loop Decay
What to watch: The structured feedback from human analysts (corrections, overrides, notes) is collected but never reincorporated into the prompt, causing the model to repeat the same annotation mistakes indefinitely. Guardrail: Design the annotation output to include a machine-readable correction block. Aggregate correction patterns weekly and update the prompt's few-shot examples and rules to reflect the most common analyst fixes.
Evaluation Rubric
Run these checks on a golden dataset of 50-100 previously reviewed cases to validate annotation quality before shipping changes to the prompt or model.
| Criterion | Pass Standard | Failure Signal | Test Method |
|---|---|---|---|
Policy Tag Accuracy | All applied policy tags match the ground-truth labels assigned by senior analysts | Missing a required tag, applying a tag not supported by evidence, or applying a tag from a different policy domain | Exact match against golden dataset labels; compute precision, recall, and F1 per tag category |
Risk Score Calibration | Risk score is within ±1 level of the ground-truth score on a 5-point scale for 90% of cases | Score off by 2 or more levels, or systematic bias toward over-scoring or under-scoring a specific request category | Mean absolute error across golden dataset; check for category-level bias with stratified analysis |
Evidence Excerpt Completeness | Every applied policy tag has at least one verbatim excerpt from [USER_REQUEST] that supports the tag | Tag applied with no excerpt, excerpt does not contain the violating content, or excerpt is paraphrased rather than verbatim | Assertion check: for each tag in [ANNOTATION], verify at least one excerpt exists and substring-match it against [USER_REQUEST] |
Similar Case Reference Validity | Referenced case IDs exist in the case database and share at least one policy tag with the current request | Hallucinated case ID, reference to a case with no overlapping tags, or reference to a case marked as overturned or stale | Database lookup: verify case ID exists, check tag overlap > 0, and confirm case status is not deprecated |
Disposition Recommendation Consistency | Recommended disposition matches the disposition that would be derived from the policy tags and risk score per the decision matrix | Disposition contradicts the decision matrix given the tags and score, or disposition is missing when policy requires one | Rule-based validation: apply the decision matrix to [POLICY_TAGS] and [RISK_SCORE] and compare to [RECOMMENDED_DISPOSITION] |
Analyst Feedback Loop Integrity | When [ANALYST_CORRECTION] is provided, the corrected fields differ from the original output and match the correction intent | Correction applied to wrong field, correction ignored entirely, or correction introduces a new error in an unrelated field | Diff check: compare original annotation, correction input, and corrected output; verify only intended fields changed and changed correctly |
Refusal Explanation Grounding | Generated refusal explanation references only policies actually tagged and does not introduce policy language not in the policy registry | Refusal cites a policy not tagged, invents policy clause numbers, or uses vague language like 'our policies' without specific reference | Policy registry lookup: extract all policy references from refusal text and verify each exists in the registry and matches a tagged policy |
Structured Output Schema Compliance | Output parses cleanly against the [OUTPUT_SCHEMA] with all required fields present and no extra top-level keys | JSON parse failure, missing required field, wrong type for a field, or presence of undefined keys at the top level | Schema validation: parse output and validate against the JSON Schema definition; reject on any violation |
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
Use the base prompt with a single model call and minimal validation. Focus on getting the annotation structure right before adding complexity. Replace [POLICY_TAGS] with a hardcoded list of 5-10 common policy categories. Use [RISK_SCORE] as a simple 1-5 integer without calibration. Skip the [SIMILAR_CASES] field initially.
Watch for
- Inconsistent policy tag application across similar requests
- Risk scores that cluster at 3 without meaningful differentiation
- Missing evidence excerpts when the refusal text is long
- Analyst feedback loop not wired up yet, so annotation quality won't improve over time

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