Product engineering teams receive a constant stream of user feedback through support tickets, chat, NPS surveys, and sales calls. Every piece of feedback that is misrouted to the wrong development pipeline creates rework, delays fixes, and erodes trust in the feedback loop. This prompt classifies unstructured user input into feature_request, bug_report, or ambiguous and extracts the structured details each pipeline needs. Use it as the first stage in a feedback triage system that writes directly to your issue tracker API.
Prompt
Feature Request vs Bug Report Intent Prompt

When to Use This Prompt
Defines the operational boundary for the Feature Request vs Bug Report intent classifier, specifying when it is the right tool and when it creates risk.
The ideal input is a single, self-contained piece of user feedback with a clear subject. The prompt expects a [USER_FEEDBACK] string and an optional [PRODUCT_CONTEXT] describing the surface or feature area the user is referencing. It returns a strict JSON object with a classification field, a confidence score between 0.0 and 1.0, and an extracted_details object containing either reproduction steps for bugs or a feature description and use case for requests. Wire the output into a routing harness that creates a Linear ticket for bugs, a Productboard note for feature requests, and a triage queue item for ambiguous items.
Do not use this prompt when the input contains multiple unrelated requests, when the user is reporting a security vulnerability, or when the feedback is purely emotional without any actionable signal. In those cases, route to a multi-intent disambiguation prompt, a security incident workflow, or a sentiment analysis pipeline first. If the confidence score falls below your defined threshold (start at 0.70 and tune against production data), route to a human review queue rather than guessing. The cost of misclassification is not just a wrong label—it is a bug that goes unfixed or a feature request that clogs the triage backlog.
Use Case Fit
Where this prompt works, where it fails, and the operational conditions required before routing production feedback through it.
Good Fit: Structured Triage Pipelines
Use when: you have a defined feedback ingestion endpoint (API, form, or bot) and need to programmatically dispatch to Jira, Linear, or GitHub issue queues. Guardrail: map the classification output directly to a webhook or API call with a retry policy for malformed responses.
Bad Fit: Unmoderated Public Forums
Avoid when: raw, unauthenticated public feedback contains prompt injection, spam, or adversarial inputs. Guardrail: place this prompt behind an abuse and injection screening classifier. Never expose the raw model output directly to the public submitter.
Required Inputs
What you need: the full user-submitted text, an optional product area taxonomy, and a defined output schema. Guardrail: strip PII before the prompt if the feedback source is not already anonymized. Missing taxonomy leads to inconsistent labels.
Operational Risk: Misclassification Cost
Risk: routing a bug report as a feature request delays critical fixes; routing a feature request as a bug wastes engineering triage time. Guardrail: implement a confidence threshold below which items route to a human review queue. Track misclassification rates by severity.
Operational Risk: Ambiguous Feedback
Risk: users often report bugs and request features in the same message. A single-label classifier forces a false choice. Guardrail: allow an ambiguous classification with extracted spans for both intents. Downstream logic should split the ticket or ask for clarification.
Integration Dependency: Issue Tracker API
Risk: the prompt works but the downstream API is down or the schema changes. Guardrail: decouple classification from dispatch. Store the classified payload and implement a dead-letter queue for failed API calls with alerting on backlog growth.
Copy-Ready Prompt Template
A reusable prompt for classifying unstructured user feedback as a feature request, bug report, or ambiguous input, with structured extraction of key details.
This prompt template is designed to be the core classification engine in a feedback triage pipeline. It takes raw, unstructured user text—from support tickets, in-app feedback widgets, or email—and forces a structured decision. The model is instructed to output a strict JSON schema, making the result directly consumable by an API that routes the payload to a product backlog tool (like Jira or Linear) or a bug tracker. The prompt includes explicit definitions for each class and a mandatory ambiguous category to prevent the model from guessing when evidence is insufficient.
markdownYou are an expert product operations classifier. Your task is to analyze user feedback and determine whether it describes a feature request, a bug report, or is ambiguous. You must extract structured details to support downstream routing. ### INPUT [USER_FEEDBACK] ### CLASSIFICATION TAXONOMY - **feature_request**: The user is asking for new functionality, a change to existing behavior that is currently working as designed, or an improvement. The current system is not broken; the user wants it to do something new or different. - **bug_report**: The user is reporting something that is broken, not working as documented, producing an error, or behaving in a way that is clearly unintended. The core of the report is a defect, not a desire for new capability. - **ambiguous**: The feedback is too vague to classify, contains both a bug and a feature request with equal weight, or is not product feedback at all (e.g., general praise, a billing question, spam). ### EXTRACTION RULES - For **feature_request**: Extract a concise `title`, a `description` of the desired functionality, and the `current_behavior` the user is experiencing. - For **bug_report**: Extract a concise `title`, `steps_to_reproduce` as a list of strings, `expected_behavior`, and `actual_behavior`. - For **ambiguous**: Provide a `reason` for the ambiguity and a `suggested_clarification_question` to ask the user. - Always include a `confidence_score` between 0.0 and 1.0. ### CONSTRAINTS - Do not invent details not present in the user feedback. - If you cannot extract a field, use `null`. - Output must be a single, valid JSON object matching the schema below. No other text. ### OUTPUT_SCHEMA { "classification": "feature_request" | "bug_report" | "ambiguous", "confidence_score": <float 0.0-1.0>, "extracted_data": { "title": "<string | null>", "description": "<string | null>", "current_behavior": "<string | null>", "steps_to_reproduce": ["<string>", ...] | null, "expected_behavior": "<string | null>", "actual_behavior": "<string | null>", "reason": "<string | null>", "suggested_clarification_question": "<string | null>" } }
To adapt this template, you must replace the [USER_FEEDBACK] placeholder with the raw text from your system. The taxonomy definitions are the most critical part to tune; adjust the descriptions of feature_request and bug_report to match your team's specific conventions. If your downstream system expects a different schema, modify the OUTPUT_SCHEMA block, but keep the instructions strict. For high-stakes routing where a misclassification could cause a critical bug to be ignored, implement a post-processing validation step that checks the confidence_score and routes anything below a threshold (e.g., 0.8) to a human review queue. Do not rely on the model's confidence score as a calibrated probability without running your own evaluation on a labeled dataset.
Prompt Variables
Required and optional inputs for the Feature Request vs Bug Report Intent Prompt. Validate each before sending to the model to prevent misclassification and downstream routing errors.
| Placeholder | Purpose | Example | Validation Notes |
|---|---|---|---|
[USER_INPUT] | The raw, unstructured text from the user describing their issue or request | The export button does nothing when I click it. I need it to download a CSV. | Required. Must be a non-empty string. Check for prompt injection patterns before passing to the model. |
[PRODUCT_CONTEXT] | A brief description of the product or system the user is referencing | Analytics dashboard v2.3.1, web application, React frontend with Node.js backend | Required. Must be a non-empty string. Provides domain grounding for the classifier. Avoids misclassifying domain-specific language. |
[TAXONOMY] | The list of valid classification labels with definitions | feature_request: A request for new functionality or enhancement. bug_report: A report of broken or incorrect existing behavior. ambiguous: Cannot determine from input alone. | Required. Must be an array of label objects with 'label' and 'definition' keys. Validate JSON structure before injection. |
[OUTPUT_SCHEMA] | The exact JSON schema the model must use for its response | {"type": "object", "properties": {"classification": {"type": "string", "enum": ["feature_request", "bug_report", "ambiguous"]}, "confidence": {"type": "number", "minimum": 0, "maximum": 1}, "extracted_details": {"type": "string"}, "reproduction_steps": {"type": "string"}}, "required": ["classification", "confidence"]} | Required. Must be a valid JSON Schema object. Use strict enum values. Validate the model's output against this schema post-generation. |
[EXAMPLES] | Few-shot examples demonstrating correct classification for edge cases | [{"input": "Dark mode is hard to read.", "output": {"classification": "feature_request", "confidence": 0.92, "extracted_details": "Improve dark mode contrast", "reproduction_steps": null}}, {"input": "App crashes when I upload a PNG over 5MB.", "output": {"classification": "bug_report", "confidence": 0.95, "extracted_details": "Crash on large PNG upload", "reproduction_steps": "1. Open app. 2. Upload PNG >5MB. 3. Observe crash."}}] | Optional but recommended. Must be an array of valid input/output pairs. Keep to 2-4 examples. Validate that examples match the OUTPUT_SCHEMA exactly. |
[CONFIDENCE_THRESHOLD] | The minimum confidence score required to accept the classification without escalation | 0.80 | Optional. Defaults to 0.80 if not provided. Must be a float between 0 and 1. Classifications below this threshold should route to human review or an ambiguity handling workflow. |
[ESCALATION_TARGET] | The queue, team, or workflow identifier for low-confidence or ambiguous classifications | human_review_queue | Optional. Defaults to 'human_review' if not provided. Must be a non-empty string. Used by the application harness, not the prompt itself, to route uncertain cases. |
Implementation Harness Notes
How to wire the Feature Request vs Bug Report Intent Prompt into a production routing pipeline with validation, retries, and issue tracker integration.
This prompt is designed to sit at the ingress point of a product feedback pipeline. In a typical implementation, user-submitted text from a widget, support chat, or email integration hits an API endpoint that injects the input into the [USER_FEEDBACK] placeholder. The model response is parsed as JSON and the classification field drives routing: bug_report triggers issue creation in a bug tracker (e.g., Jira, Linear, GitHub Issues), feature_request routes to a product backlog or ideas portal, and ambiguous queues the item for human triage. The reproduction_steps or feature_description fields are mapped directly into the corresponding tracker's description template, while confidence is logged for later analysis but should not block routing on its own unless it falls below a configured threshold.
Before the classification result touches any downstream API, validate the output against a strict schema. At minimum, confirm that classification is one of the three allowed enum values, that confidence is a float between 0.0 and 1.0, and that the appropriate description field is present and non-empty for the classified intent. If classification is bug_report but reproduction_steps is null or fewer than 20 characters, route to human review. The same applies if feature_request lacks a substantive feature_description. Implement a retry layer: if the model returns malformed JSON or fails schema validation, retry once with the same input and a stronger format instruction appended to the system message. If the second attempt fails, log the raw response and escalate to a dead-letter queue for manual inspection. Do not silently drop feedback because of a parse error.
Model choice matters here. A fast, cost-effective model like GPT-4o-mini, Claude 3.5 Haiku, or Gemini 1.5 Flash is sufficient for this classification task in most cases. Reserve larger models only if your eval suite shows systematic misclassification on ambiguous or edge-case inputs. Wire the prompt into an observability pipeline that logs the input, classification, confidence, and downstream routing target for every request. Set up a periodic eval run against a golden dataset of 200+ labeled examples that includes clear bugs, clear features, ambiguous reports, and adversarial samples (e.g., feature requests disguised as bugs). Monitor the misclassification rate by class, and trigger a prompt review if the bug_report false-positive rate exceeds 5%—misrouting a feature request as a bug wastes engineering time and erodes trust in the routing system.
Expected Output Contract
Defines the exact fields, types, and validation rules for the structured JSON output produced by the Feature Request vs Bug Report Intent Prompt. Use this contract to build a parser, validator, and downstream router.
| Field or Element | Type or Format | Required | Validation Rule |
|---|---|---|---|
classification | enum: feature_request | bug_report | ambiguous | Must be exactly one of the three allowed string values. Reject any other string. | |
confidence_score | number (float 0.0-1.0) | Must be a float between 0.0 and 1.0 inclusive. If classification is ambiguous, this score must be below the [CONFIDENCE_THRESHOLD]. | |
reproduction_steps | array of strings or null | Required if classification is bug_report. Must be an array of ordered, actionable strings. If absent or null for a bug_report, flag for human review. | |
feature_description | string or null | Required if classification is feature_request. Must be a non-empty string summarizing the requested capability. If absent or null for a feature_request, flag for human review. | |
affected_component | string or null | Must be a string matching an entry in the [COMPONENT_CATALOG] if provided. If the model returns a component not in the catalog, route to an unclassified review queue. | |
evidence_spans | array of objects with 'text' (string) and 'source_index' (integer) fields | Each object must have a non-empty text string and a source_index integer referencing the input segment. If no evidence is found, return an empty array. | |
routing_target | string | Must be a valid queue or project key from the [ROUTING_TABLE] (e.g., 'dev_backlog', 'qa_queue'). If classification is ambiguous, this must be set to 'triage_review'. |
Common Failure Modes
Feature request vs. bug report classification breaks in predictable ways. These are the most common failure modes and how to guard against them before they reach production.
Ambiguous Inputs Default to Bug Report
What to watch: When a user describes unexpected behavior without clear reproduction steps, the model often defaults to bug_report because the language sounds negative. A user saying 'the dashboard feels slow' might be a performance feature request, not a bug. Guardrail: Add an explicit ambiguous category with a required clarification question. Set a confidence threshold below which the system asks 'Is this a bug you can reproduce, or a feature you'd like to see?' rather than guessing.
Feature Requests Disguised as Complaints
What to watch: Users often phrase feature requests as complaints: 'Why can't I export to CSV?' or 'It's annoying that I have to click three times to save.' The model misclassifies these as bug_report because the tone matches defect language. Guardrail: Include few-shot examples that explicitly show complaint-to-feature_request mappings. Add a secondary check: if the input describes missing capability rather than broken capability, route to feature_request regardless of sentiment.
Reproduction Steps Extracted from Feature Requests
What to watch: The prompt asks for reproduction steps on every input, and the model hallucinates steps for feature requests by inventing a 'current behavior' that doesn't exist. This pollutes the issue tracker with fake repro instructions. Guardrail: Gate reproduction step extraction on the classification label. Only extract steps when classification == 'bug_report'. For feature_request, extract the desired behavior and user story instead. Validate that extracted steps reference actual UI elements or API endpoints from a known schema.
Mixed Intent Gets Single Label
What to watch: A user reports a bug and in the same message requests a feature that would prevent it. The model picks one label and drops the other, losing half the signal. Example: 'The export fails with large files, can you add chunked export?' Guardrail: Add a multi_intent flag to the output schema. When both bug and feature signals are present, return both labels with evidence spans. Route to both queues or create linked tickets. Test with compound inputs in your eval set.
Domain-Specific Jargon Misclassified
What to watch: Internal team jargon like 'the pipeline is broken' or 'the transformer layer is dropping tokens' can mean a bug, a feature gap, or a configuration issue depending on context. The model lacks the domain knowledge to disambiguate. Guardrail: Inject a domain glossary into the system prompt with definitions and example classifications. For high-stakes domains, route ambiguous technical inputs to a human-in-the-loop queue with the model's best guess and evidence highlighted for review.
Confidence Scores Are Overconfident
What to watch: The model returns confidence: 0.95 on inputs that are genuinely ambiguous, making downstream routing trust the classification blindly. This is especially dangerous when the confidence threshold controls automated ticket creation. Guardrail: Calibrate confidence with a held-out test set containing ambiguous examples. Require the model to list evidence for and against each class before scoring. Set an upper bound on confidence for single-turn classification (e.g., max 0.85) and force clarification above that threshold.
Evaluation Rubric
Criteria for testing the Feature Request vs Bug Report Intent Prompt before production deployment. Each row defines a pass standard, a failure signal, and a concrete test method to validate classification quality.
| Criterion | Pass Standard | Failure Signal | Test Method |
|---|---|---|---|
Intent Classification Accuracy | Correctly labels feature_request, bug_report, or ambiguous for >= 95% of the golden dataset | Misclassifies bug_report as feature_request or vice versa in more than 5% of cases | Run prompt against a labeled golden dataset of 200+ real user feedback samples and measure exact-match accuracy |
Ambiguous Case Handling | Returns ambiguous with confidence < 0.80 when input lacks clear reproduction steps or feature description | Returns feature_request or bug_report with high confidence for vague inputs like 'the thing is broken' or 'make it better' | Inject 20 deliberately vague inputs and verify ambiguous label and confidence below threshold |
Reproduction Steps Extraction | Extracts at least one concrete reproduction step when bug_report is classified and input contains steps | Returns empty or null reproduction_steps field when input clearly describes how to reproduce the bug | Parse output JSON and assert reproduction_steps array is non-empty for 10 known bug reports with explicit steps |
Feature Description Extraction | Extracts a feature summary of >= 10 words when feature_request is classified and input describes a desired capability | Returns empty or single-word feature_description when input contains a detailed feature request | Parse output JSON and assert feature_description string length >= 10 characters for 10 known feature requests |
Confidence Score Calibration | Confidence >= 0.85 correlates with correct classification in >= 90% of cases | High-confidence predictions (>0.90) are wrong more than 10% of the time | Plot confidence vs accuracy curve across golden dataset and measure expected calibration error (ECE) |
Output Schema Compliance | Output is valid JSON matching the defined schema with all required fields present | Output is missing required fields, contains extra untyped fields, or is not parseable JSON | Validate output against JSON Schema using a programmatic validator; reject any response that fails parsing or schema check |
Edge Case: Mixed Signals | Returns ambiguous when input contains both a bug description and a feature request without clear primary intent | Confidently picks one label when evidence for both is roughly equal | Test with 15 inputs containing equal-weight bug and feature language; verify ambiguous rate >= 80% |
Latency Budget Compliance | Classification completes within 2 seconds end-to-end for inputs under 500 tokens | P95 latency exceeds 5 seconds under normal load | Measure response time across 100 sequential requests and verify P95 < 2000ms |
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 model call with no retries or validation beyond parsing the JSON. Hardcode the taxonomy (feature_request, bug_report, ambiguous) directly in the prompt. Skip reproduction steps extraction in the first pass—just get the classification right.
codeClassify the following user input as one of: feature_request, bug_report, ambiguous. Input: [USER_INPUT] Return JSON: {"intent": "...", "confidence": 0.0-1.0}
Watch for
- Model collapsing everything into
ambiguouswhen confidence is low - No handling of mixed signals (user reports a bug but also requests a feature)
- JSON parse failures on malformed model output
- No evidence spans to debug misclassifications

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