Inferensys

Prompt

Structured Ticket Generation Prompt from User Reports

A practical prompt playbook for converting customer emails and chat transcripts into structured, developer-ready bug tickets with acceptance criteria, environment details, and impact statements.
Developer doing prompt engineering on laptop, prompt variations visible on screen, casual coding session.
PROMPT PLAYBOOK

When to Use This Prompt

Determine if the structured ticket generation prompt is the right tool for your support-to-engineering handoff workflow.

This prompt is designed for the support-to-engineering handoff: converting unstructured customer emails, chat transcripts, or voice-to-text reports into internal bug tickets that developers can act on immediately. It extracts the core symptom, reproduction steps, environment details, user impact, and acceptance criteria from raw user language. Use this when your support team spends more time rewriting tickets than resolving issues, or when inconsistent ticket quality causes engineering rework.

This prompt assumes you already have a user report and a target ticket schema. It does not classify severity, detect duplicates, or route to teams. Pair it with the severity classification, duplicate detection, and routing prompts in this pillar for a complete triage pipeline. The prompt works best with reports that contain at least a symptom description and some environment context—it will flag missing critical fields rather than hallucinate them, but it cannot invent reproduction steps that were never provided.

Do not use this prompt for live chat where the agent needs to ask clarifying questions interactively—that requires a different conversation-state-aware prompt. Avoid it for reports containing multiple unrelated bugs; split those into separate inputs first. If your user reports are already structured (e.g., form submissions with typed fields), you likely need a simpler mapping layer rather than this extraction prompt. For regulated environments where ticket content must be auditable, ensure you log the raw input alongside the generated ticket and implement human review before the ticket reaches an engineering queue.

PRACTICAL GUARDRAILS

Use Case Fit

Where this prompt delivers value and where you should reach for a different tool.

01

Good Fit: High-Volume Support-to-Engineering Handoff

Use when: Customer emails, chat transcripts, or support forms must be converted into structured internal tickets at scale. Guardrail: The prompt excels at extracting structured fields from messy, conversational text, reducing manual triage time and ensuring developers receive consistent, actionable reports.

02

Bad Fit: Real-Time Incident Command

Avoid when: A live site is down and seconds matter. Guardrail: This prompt is designed for asynchronous handoff, not real-time alerting. During active incidents, use a dedicated on-call escalation prompt that integrates with paging systems and live runbooks.

03

Required Inputs: Unstructured User Report

What to watch: The prompt cannot function without the original user report text. Guardrail: The harness must validate that the [USER_REPORT] input is present and non-empty. If the input is missing, the system should return a clear error, not a hallucinated ticket.

04

Required Inputs: Output Schema & Component Catalog

What to watch: Without a strict [OUTPUT_SCHEMA] and a [COMPONENT_CATALOG], the model will invent fields and team names. Guardrail: Always provide a predefined JSON schema and a list of valid component labels. Validate the output against the schema and check that the component field matches a value from the catalog.

05

Operational Risk: Loss of Critical Context

What to watch: The model may omit a crucial detail from the user's report, such as a specific error code or a unique environment variable, in its summary. Guardrail: Implement an eval that checks for the presence of key entities from the input in the generated ticket. For high-severity items, route the ticket for human review before it reaches the engineering backlog.

06

Operational Risk: Hallucinated Acceptance Criteria

What to watch: The model might invent plausible but incorrect reproduction steps or acceptance criteria not present in the user's report. Guardrail: The prompt must instruct the model to only derive criteria from the explicit text. Add a validation step that flags any ticket where the reproduction steps cannot be traced back to a sentence in the source report.

PROMPT PLAYBOOK

Copy-Ready Prompt Template

A copy-ready prompt that converts unstructured user reports into a structured, developer-ready ticket object with acceptance criteria, environment details, and impact assessment.

This prompt template is the core instruction set for your AI harness. It takes raw user reports—emails, chat transcripts, or support form submissions—and extracts the signal needed for engineering triage. The prompt enforces a strict output schema, requires explicit 'unknown' markers for missing information, and separates user-reported facts from model-inferred impact. Before integrating, review the placeholders and ensure your application layer supplies the required context variables.

text
You are a technical triage assistant converting unstructured user reports into structured internal bug tickets. Your output must be valid JSON conforming to the schema below. Do not invent details not present in the report. Use the exact string 'UNKNOWN' for any required field where the report provides no information.

## INPUT
[USER_REPORT]

## CONTEXT
Current Product Version: [PRODUCT_VERSION]
Deployment Environment: [DEPLOYMENT_ENVIRONMENT]
Component Catalog: [COMPONENT_CATALOG]
Severity Rubric: [SEVERITY_RUBRIC]

## OUTPUT SCHEMA
{
  "ticket": {
    "title": "string (concise summary of the core symptom, max 100 chars)",
    "description": "string (clear technical description of the observed behavior, preserving all user-provided technical details)",
    "reproduction_steps": [
      {
        "step_number": "integer",
        "action": "string",
        "expected_result": "string",
        "actual_result": "string"
      }
    ],
    "environment": {
      "os": "string | UNKNOWN",
      "browser": "string | UNKNOWN",
      "app_version": "string | UNKNOWN",
      "device": "string | UNKNOWN"
    },
    "severity": {
      "level": "string (must match one of the levels in the provided Severity Rubric)",
      "justification": "string (explain why this severity was chosen based on the rubric definitions and the report's evidence)"
    },
    "component": {
      "name": "string (must match an entry in the provided Component Catalog)",
      "confidence": "number (0.0 to 1.0)"
    },
    "impact_assessment": {
      "affected_user_segment": "string | UNKNOWN",
      "blocks_critical_workflow": "boolean",
      "revenue_risk_note": "string | UNKNOWN"
    },
    "acceptance_criteria": [
      "string (a verifiable condition that must be true for the fix to be accepted)"
    ]
  }
}

## CONSTRAINTS
- Do not fabricate reproduction steps. If the user describes them, extract and number them. If not, return an empty array.
- For the 'component' field, select the single best match from the Component Catalog. Set confidence below 0.5 if the mapping is ambiguous.
- The 'impact_assessment' fields are inferences. Base them strictly on the user's description of their role and workflow. Do not assume enterprise impact for a personal-use report.
- Generate at least one acceptance criterion that directly verifies the reported failure mode.

To adapt this template, replace the square-bracket placeholders with data from your application context. [USER_REPORT] should contain the full raw text. [COMPONENT_CATALOG] should be a structured list of your system's services or modules, such as ['auth-service', 'payment-gateway', 'user-profile', 'dashboard-ui']. [SEVERITY_RUBRIC] must define your organization's severity levels with clear criteria (e.g., 'S1: System down, all users blocked'). If your application does not have a formal rubric, provide a simple three-tier definition inline. The [PRODUCT_VERSION] and [DEPLOYMENT_ENVIRONMENT] fields anchor the report to a specific release, which is critical for regression detection. After pasting the prompt, validate that your harness parses the JSON output and checks every field against the schema before creating a ticket in your issue tracker.

IMPLEMENTATION TABLE

Prompt Variables

Each placeholder must be populated before the prompt is sent to the model. Validation notes describe how to check that the input is well-formed.

PlaceholderPurposeExampleValidation Notes

[USER_REPORT]

Raw customer email, chat transcript, or support ticket body containing the bug description

Subject: App crashes when I upload a PNG. Body: Every time I try to upload a screenshot the app just closes. I'm on Windows 11 using Chrome 122.

Check string length > 20 characters. Reject empty or whitespace-only input. Warn if no punctuation or line breaks detected (possible garbled input).

[REPORT_SOURCE]

Origin channel of the report to preserve traceability and SLA context

zendesk_ticket_48291 or intercom_chat_2024-03-15 or email_thread_abc123

Must match a known source enum: zendesk, intercom, email, slack, api, web_form. Reject unknown sources. Required for audit trail generation.

[REPORT_TIMESTAMP]

ISO-8601 timestamp when the user submitted the report, used for SLA clock and regression correlation

2024-03-15T14:22:00Z

Parse as valid ISO-8601. Reject future timestamps more than 5 minutes ahead. Warn if timestamp is older than 30 days (stale report).

[COMPONENT_CATALOG]

List of valid component or service names the ticket can be assigned to, used for routing and ownership classification

["auth-service", "file-upload", "billing", "notifications", "search-index"]

Must be a non-empty JSON array of strings. Each string must match a known component in the service registry. Reject if catalog is empty or contains duplicates.

[SEVERITY_RUBRIC]

Definition of severity levels with criteria for each, used to ground the classification decision

S1: Critical outage affecting all users. S2: Major feature broken for many users. S3: Partial degradation with workaround. S4: Cosmetic or minor inconvenience.

Must contain at least 3 severity levels with distinct criteria. Each level must have a label and a non-empty description. Reject if descriptions are identical across levels.

[EXISTING_TICKETS]

Recent open tickets for duplicate detection, provided as a JSON array of {id, title, description} objects

[{"id":"BUG-1042","title":"PNG upload crashes on Windows","description":"User reports crash when uploading PNG files larger than 2MB on Windows 11 Chrome."}]

Must be a valid JSON array. Each object must have id, title, and description fields. Allow empty array if no existing tickets. Warn if array exceeds 500 items (consider limiting to recent N).

[OUTPUT_SCHEMA]

JSON schema the model output must conform to, defining required fields, types, and enum constraints

{"type":"object","required":["title","severity","component"],"properties":{"severity":{"enum":["S1","S2","S3","S4"]}}}

Must be a valid JSON Schema object. Required fields must be a subset of defined properties. Enum values must match severity rubric labels. Reject if schema is not parseable JSON.

[SLA_POLICY]

Time-to-acknowledge and time-to-resolve targets per severity level, used for escalation deadline calculation

{"S1":{"ack_minutes":15,"resolve_hours":4},"S2":{"ack_minutes":60,"resolve_hours":24},"S3":{"ack_hours":8,"resolve_days":5},"S4":{"ack_hours":24,"resolve_days":14}}

Must be a valid JSON object with severity keys matching the severity rubric. Each value must have numeric ack and resolve fields. Reject if any severity level from the rubric is missing.

PROMPT PLAYBOOK

Implementation Harness Notes

How to wire the structured ticket generation prompt into a production support-to-engineering pipeline with validation, retries, and human review gates.

This prompt is designed to sit inside an API handler that receives raw user reports—email bodies, chat transcripts, or web form submissions—and returns a structured ticket payload. The harness is responsible for preparing the input, calling the LLM, validating the output, and deciding whether to auto-create the ticket or queue it for human review. The prompt itself handles the transformation logic, but the surrounding code must enforce the contract: the output must match the expected schema, contain no hallucinated fields, and preserve critical user context that a developer will need to reproduce the issue.

Start by constructing the prompt payload with the required placeholders. The [INPUT] field receives the raw user report text, cleaned of signatures and disclaimers but otherwise unmodified. The [OUTPUT_SCHEMA] field should contain the exact JSON schema you expect, including required fields (title, description, reproduction_steps, environment, severity, impact_statement, acceptance_criteria) and enum constraints for severity levels (S1 through S4). The [CONSTRAINTS] field should specify that the model must not invent details not present in the report, must mark missing information as "unknown" rather than guessing, and must preserve the user's original language for symptom descriptions. If your system maintains a component catalog or team routing map, pass it as [CONTEXT] so the model can suggest ownership. Call the LLM with a low temperature (0.0–0.2) to maximize schema consistency, and set response_format to JSON mode if your provider supports it. On receiving the response, validate it immediately: check that all required fields are present, severity is a valid enum value, reproduction steps are an array of strings, and no field contains placeholder text like "N/A" or "todo". If validation fails, retry once with the validation errors appended to the prompt as additional constraints—this often resolves minor format drift. If the second attempt also fails, route the ticket to a human triage queue with the raw report and both failed attempts attached.

For high-risk deployments where tickets may trigger pager alerts or customer-facing SLAs, add a confidence gate. After validation passes, run a secondary eval prompt that scores the output on three axes: completeness (are all reportable symptoms captured?), faithfulness (are any details invented?), and actionability (can a developer start debugging from this ticket?). If any score falls below your threshold, flag the ticket for human review. Log every LLM call with the input report, the generated ticket, validation results, and the final routing decision. This audit trail is essential for debugging prompt drift and for demonstrating triage consistency to compliance reviewers. Avoid wiring this prompt directly to automatic ticket creation in your issue tracker without a review gate unless you have calibrated the eval thresholds against at least 100 real user reports and confirmed that the false-positive rate for auto-creation is acceptable for your team's response SLAs.

IMPLEMENTATION TABLE

Expected Output Contract

The model must return a JSON object matching this structure. Every field is required in the output, even if its value is null or an empty array. Use this table to validate the response before routing the ticket to an engineering team.

Field or ElementType or FormatRequiredValidation Rule

ticket_id

string (UUID v4)

Must match UUID v4 pattern; reject if missing or malformed

title

string (5-120 chars)

Must be a single sentence summarizing the defect; reject if empty or exceeds 120 chars

description

string (markdown)

Must contain a non-empty summary of the problem; reject if null or whitespace-only

severity

enum: S1 | S2 | S3 | S4

Must be exactly one of the allowed enum values; reject if missing or invalid

component

string or null

Must match an entry in the provided component catalog or be null; reject if non-null and not in catalog

reproduction_steps

array of strings

Must be a non-empty array of ordered, atomic steps; reject if empty or any step is whitespace-only

environment

object

Must contain os, browser, app_version keys; each value is string or null; reject if object is missing

affected_users_estimate

integer or null

Must be a non-negative integer or null; reject if negative or non-integer

regression_flag

boolean

Must be true or false; reject if string or missing

assignee_team

string or null

Must match a team slug from the routing map or be null; reject if non-null and not in map

PRACTICAL GUARDRAILS

Common Failure Modes

What breaks first when this prompt runs in production, and how to guard against each failure.

01

Critical Context Dropped During Structuring

What to watch: The model omits nuanced user descriptions, error messages, or environment quirks that don't fit neatly into the target schema, losing the signal an engineer needs to debug. Guardrail: Add an [UNSTRUCTURED_NOTES] field to the output schema and instruct the model to preserve any detail that doesn't map to a structured field. Run an eval that measures information retention by comparing input and output key facts.

02

Hallucinated Acceptance Criteria

What to watch: The model invents plausible-sounding reproduction steps or expected results that were never mentioned in the user report, sending developers on a wild goose chase. Guardrail: Require the model to cite the specific user quote or log line that supports each reproduction step. Implement a validator that flags any step without a source reference for human review before the ticket is created.

03

Severity Inflation or Deflation

What to watch: The model misclassifies a minor cosmetic bug as a critical blocker (wasting on-call attention) or downgrades a data-loss issue to low priority (delaying a critical fix). Guardrail: Provide a strict severity rubric with concrete examples in the prompt. Route all S1/S2 classifications to a human triage queue for confirmation. Log severity overrides for weekly calibration reviews.

04

Component Misrouting from Ambiguous Descriptions

What to watch: A user describes a symptom that spans multiple services (e.g., 'login is broken'), and the model routes the ticket to the wrong team, adding resolution delay. Guardrail: Include a current component catalog with descriptions and ownership in the prompt context. When confidence is below a threshold, output multiple candidate components with a confidence score and route to a triage lead for manual assignment.

05

Environment Details Extracted as 'Unknown' When Present

What to watch: The model fails to parse version numbers, browser strings, or device models from messy user text and fills the structured environment block with nulls, forcing the developer to ask the reporter again. Guardrail: Use few-shot examples showing extraction from non-standard formats (e.g., 'chrome latest', 'windows 11 home'). Add a post-processing check that flags tickets where all environment fields are null and the original text contains version-like patterns.

06

Duplicate Detection False Negatives

What to watch: The incoming bug is a known issue, but the model fails to match it against existing tickets because the user described the symptom differently, leading to wasted duplicate investigation. Guardrail: Retrieve candidate duplicates using both keyword search and embedding similarity before the prompt runs. Include the top 5 candidates in the prompt context and ask the model to explain why it is or isn't a duplicate. Track duplicate merge rates weekly.

IMPLEMENTATION TABLE

Evaluation Rubric

Test output quality before shipping this prompt to production. Run these checks against a golden dataset of 20-50 user reports with manually reviewed reference tickets.

CriterionPass StandardFailure SignalTest Method

Field Completeness

All required fields in [OUTPUT_SCHEMA] are present and non-null unless source data is missing

Missing title, description, or severity field in output

Schema validation script checks for required field presence across golden dataset

Severity Accuracy

Severity label matches reference label in >= 90% of cases; off-by-one severity errors count as partial failure

Severity differs from reference by more than one level (e.g., S1 vs S3)

Inter-rater agreement calculation between prompt output and manually reviewed reference tickets

Reproduction Step Atomicity

Each reproduction step describes exactly one action; no compound steps (e.g., 'click X and then type Y')

Multiple actions concatenated into a single numbered step

Manual review or LLM-as-judge check for step count matching action count

Environment Detail Extraction

OS, browser, app version, and device fields are populated when present in source; 'unknown' marker used for missing fields

Fabricated environment values not present in the original user report

Field-by-field comparison against manually extracted environment details from golden dataset

Impact Statement Grounding

Impact statement references specific user segments or workflows mentioned in the source report

Generic impact language with no connection to the user's described scenario

Keyword overlap check between impact statement and source report user-impact phrases

Acceptance Criteria Testability

Each acceptance criterion describes a verifiable condition with clear pass/fail observable behavior

Criteria use vague language like 'works correctly' or 'fixed properly' without observable conditions

LLM-as-judge evaluation of each criterion against testability rubric

No Critical Context Loss

All user-reported symptoms, error messages, and workflow-blocking conditions appear in the structured ticket

User mentions a specific error code or blocked action that does not appear anywhere in the output

Diff check between source report key facts list and output ticket fact coverage

Schema Compliance

Output strictly conforms to [OUTPUT_SCHEMA] with correct types, enum values, and no extra fields

Type mismatch, invalid enum value, or additional undeclared fields in JSON output

JSON Schema validator run against every output in the evaluation batch

ADAPTATION OPTIONS

Adapt This Prompt

How to adapt

Start with the base prompt and a simple JSON schema. Use a lightweight model call without retries or strict validation. Focus on getting the structure right before hardening.

  • Remove strict enum constraints; accept freeform severity and component strings.
  • Use a single example in the prompt instead of a full few-shot set.
  • Log raw outputs manually to spot format drift.
code
[SYSTEM]: Convert the following user report into a JSON ticket with title, description, severity, component, and reproduction_steps.

[USER_REPORT]: [INPUT]

Watch for

  • Missing schema checks: fields will be omitted or renamed under varied phrasing.
  • Overly broad instructions: the model may add commentary or refuse ambiguous reports instead of making a best-effort extraction.
  • Hallucinated environment details when the report is sparse.
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.