/
DE

⚡ Promptolis Original · Coding & Development

🎫 Jira Ticket Quality Rewriter

Rewrites your vague Jira ticket into the structured spec engineers can actually start work on — with acceptance criteria, edge cases, and the 5 questions PMs always forget to answer.

⏱️ 3 min to try 🤖 ~60 seconds in Claude 🗓️ Updated 2026-04-28

Why this is epic

Most Jira tickets are 'add filter to dashboard' with one screenshot and zero acceptance criteria. Engineer reads it, asks 5 clarifying questions in Slack, waits 2 days for answers. This Original rewrites the ticket so engineers can start immediately.

Outputs a complete, well-structured ticket: user story, acceptance criteria, edge cases, technical context, the 5 questions PMs forget (empty state, error state, mobile, accessibility, analytics), test cases, and the explicit DoD (Definition of Done).

Calibrated to 2026 ticket reality: AI-assisted engineers (Cursor, Claude Code) need MORE context than humans, not less. The structured ticket becomes high-quality input to AI coding tools.

Includes the 'what's NOT in scope' section — the most underrated part of a good ticket. Saves the 'wait, I thought we were also building X' rework round.

The prompt

Promptolis Original · Copy-ready
<role> You are a ticket-quality engineer with 6+ years standardizing Jira tickets across product + engineering teams. You have rewritten 1000+ tickets from vague to actionable. You know exactly which 5 questions PMs forget and which acceptance-criteria patterns produce engineers' clarifying questions. You are direct. You will tell a PM their user story is missing the user, that acceptance criteria are non-binary, or that the ticket lacks scope boundaries. You refuse to recommend 'add more detail' as generic advice — you'll specify which 3-5 fields are missing. </role> <principles> 1. User story first, implementation second. 'As X I want Y so Z' before any technical detail. 2. Acceptance criteria are binary, testable statements. Not aspirational ones. 3. Always answer the 5 PMs-forget questions: empty state, error state, mobile, accessibility, analytics. 4. Out-of-scope is mandatory. What's NOT included prevents 80% of scope creep. 5. Design / screenshot link for any UI work. 6. Test cases included — don't make QA derive them. 7. Bugs need: reproduction steps, expected vs actual, environment, frequency, severity. </principles> <input> <draft-ticket>{paste the original ticket text — title + description, however vague}</draft-ticket> <ticket-type>{feature / bug / tech debt / spike / 'recommend'}</ticket-type> <context>{any additional context not in the ticket — Slack threads, related work, why this matters}</context> <team-conventions>{ticket structure your team uses — story format, AC format, definition of done, etc., or 'standard'}</team-conventions> <priority>{P0 / P1 / P2 / P3 if known}</priority> <sprint>{current sprint or backlog}</sprint> <related-tickets>{Jira keys of related tickets if any}</related-tickets> <known-constraints>{technical constraints, deadlines, dependencies}</known-constraints> </input> <output-format> # [Rewritten Ticket Title] ## Title Clear, action-oriented. Format: [Component] [Action] [Outcome]. ## User Story As a [role], I want [capability], so I can [outcome]. ## Background / Why 2-3 sentences. Why this work matters. Link to relevant context (PRD, customer feedback, etc.). ## Acceptance Criteria Binary, testable statements. 5-10 of them. Format as 'When X, then Y.' or 'User can Z.' ## In Scope Explicit list of what THIS ticket delivers. ## Out of Scope Explicit list of what is NOT included. Critical for preventing scope creep. ## The 5 Questions Most PMs Forget 1. **Empty state:** what user sees when there's no data. 2. **Error state:** what user sees when something fails. 3. **Mobile / responsive:** how this behaves at smaller breakpoints. 4. **Accessibility:** keyboard nav, screen reader, color contrast requirements. 5. **Analytics / observability:** events to log, metrics to track. For each: the specific answer for THIS ticket. ## Technical Context Relevant codebase areas, similar patterns to follow, integration points, gotchas. ## Edge Cases 3-7 specific edge cases the implementation needs to handle. ## Test Cases 5-10 specific scenarios for QA. Format: 'When X happens, expect Y.' ## Definition of Done Checklist. Code merged, tests passing, deployed to staging, [team-specific items], etc. ## Estimate T-shirt size or story points if you can infer. Caveats noted. ## Open Questions Things the PM still needs to answer. Should be empty if the rewrite is complete; flag if not. ## Suggested Sub-Tasks If the work breaks naturally into sub-tasks, list them. </output-format> <auto-intake> If input incomplete: ask for the draft ticket text, ticket type, context, team conventions, priority, sprint, related tickets, known constraints. </auto-intake> Now, rewrite the ticket:

Example: input → output

Here's how this prompt actually performs. Real input below, real output from Claude Opus 4.

📝 Input
<draft-ticket>
Title: Add filter to customer list
Description: We need to add a filter to the customer list page so users can filter by plan tier and signup date. Should support multiple filters at once. Link to design: figma.com/file/abc123
</draft-ticket>
<ticket-type>feature</ticket-type>
<context>This came from sales team feedback — they're spending 5+ minutes scrolling the customer list to find specific customers. Pricing tier filter is most-requested. Signup date filter helps for cohort analysis. We have similar filter components on the deals list already.</context>
<team-conventions>Standard. We use 'As a... I want... so I can...' format. Acceptance criteria as bullet list. Code merged + tests passing + deployed to staging = DoD.</team-conventions>
<priority>P2</priority>
<sprint>Next sprint (Sprint 47)</sprint>
<related-tickets>PRD-892 has the original sales-team request. ENG-1245 added the deals list filter (pattern to follow).</related-tickets>
<known-constraints>Must use our existing FilterBar component (don't build new). Should ship within 1 sprint.</known-constraints>
🤖 Output

CustomerList: Add multi-filter support (plan tier + signup date)

Title

CustomerList: Add multi-filter support for plan tier and signup date

User Story

As a sales team member, I want to filter the Customers list by plan tier and signup date (combined or independently), so I can find specific customer cohorts in <30 seconds instead of scrolling.

Background / Why

Sales team feedback (see PRD-892): currently spending 5+ minutes/day scrolling Customers to find specific accounts for outreach. Plan-tier filter is most-requested (segment by Pro/Business customers); signup-date filter enables cohort-based outreach (e.g., 'reach out to all Q1 2026 signups'). The Deals list (ENG-1245) already has multi-filter; we're following that pattern for consistency.

Acceptance Criteria

1. User can open the filter bar from the Customers list page header (consistent UI placement with Deals list).

2. User can filter by Plan Tier with multi-select: Free, Starter, Growth, Enterprise. At least one tier can be applied.

3. User can filter by Signup Date with: 'Last 7 days,' 'Last 30 days,' 'Last 90 days,' 'This year,' 'Custom range' (with date pickers).

4. Filters can be combined (Plan Tier + Signup Date both applied = AND logic). Filters within a single field (e.g., Free + Starter) = OR logic.

5. Filter state persists in the URL query string (so links can be shared).

6. Customer list refreshes within 500ms of filter change (paginated; existing list pagination preserved).

7. Active filters show as chips above the list with 'remove' button per chip.

8. 'Clear all filters' button shows when 1+ filter is active.

9. Filter count badge displays on the filter button (e.g., '2' when 2 filter chips are active).

10. Empty result state: shows 'No customers match these filters' with 'Clear filters' CTA.

In Scope

  • Filter UI on Customers list (Plan Tier + Signup Date only)
  • URL query string sync
  • Empty result state
  • Filter chip display + remove
  • Backend API support for these filters (likely small adjustment to existing /api/customers query)
  • Tests (unit + integration)

Out of Scope

  • Saved/named filter sets ('My Q1 Cohort' saved filter) — defer to future ticket
  • Other filter dimensions (industry, company size, MRR, etc.) — defer
  • Bulk actions on filtered results — separate ticket
  • Filter on Deals list (already exists)
  • CSV export of filtered customers — separate ticket if needed
  • Mobile-specific filter UX optimization beyond responsive defaults

The 5 Questions Most PMs Forget

1. Empty state

When the filter set returns 0 customers: show 'No customers match these filters' message with a 'Clear filters' CTA button. Don't show the loading skeleton or 'no customers exist' (different from no-match).

2. Error state

If the filter API call fails: show toast/banner 'Couldn't apply filters. Please try again.' Customer list reverts to most recently successful filter state. Filter UI remains active so user can retry without losing their selections.

3. Mobile / responsive

Desktop (≥1024px): filter bar is a horizontal row with all filter buttons visible.

Tablet (640-1024px): filter bar wraps if needed; chip display below filters.

Mobile (<640px): filter button is a single 'Filter' button that opens a drawer/modal with the filter UI. Chips display below the customer list header.

4. Accessibility
  • All filter controls are keyboard-navigable (Tab, Enter, Escape).
  • Filter button has aria-expanded to indicate open/closed state.
  • Filter chips have aria-label indicating what they filter and how to remove.
  • Color contrast WCAG AA on all states (active chip, inactive button, etc.).
  • Screen reader announces filter changes ('Filter applied: Plan Tier Pro. Showing 47 customers.').
5. Analytics / observability

Log these events:

  • customer_list_filter_applied with properties: { plan_tiers: [...], signup_date_range: '...', total_results: N, user_id, timestamp }
  • customer_list_filter_cleared
  • customer_list_filter_combined (when 2+ filters active)

Monitor:

  • Filter API call latency (p50, p95). Alert if p95 >800ms.
  • Filter API error rate. Alert if >2%.

Technical Context

  • Reuse: <FilterBar> component from /components/FilterBar (built in ENG-1245). Add customer-list mode to existing variants. Don't build new.
  • Backend: /api/customers currently supports query params for pagination. Extend to accept plan_tiers[] and signup_after, signup_before query params. Existing query is in services/customer-list.ts:fetchCustomers().
  • State management: existing list uses URL-state (via Next.js router query). Filter state goes in same place.
  • Pattern to follow: see ENG-1245 implementation, especially the chip-display logic and the URL-sync hook.
  • Database: Customers table has plan_tier (enum) and signup_at (timestamp) — both already indexed. No migration required.
  • Caching: existing list uses SWR with stale-while-revalidate. Filter changes invalidate cache for the new filter combo, so first-time filters may be slower.

Edge Cases

1. No plan tier selected, just date filter active: valid; shows all tiers within date range.

2. Custom date range with end < start: disable Apply button + show inline 'End date must be after start.' validation.

3. Custom date range with future end date: allow it (returns 0 results since no customers signed up in future). Don't auto-clamp to today.

4. Filter applied while list is mid-loading: cancel pending request, fire new one with new filter.

5. Browser back-forward with filters in URL: restore filter state from URL on navigation.

6. All 4 plan tiers selected: equivalent to no plan-tier filter; behave identically (or auto-clear filter to indicate no filtering).

7. Very long custom date range (5+ years): allow but warn 'This may load slowly' (>10K results).

Test Cases

1. Apply Pro tier filter: customer list shows only Pro tier customers; URL updates with `?plan_tiers=pro`.

2. Apply Last 30 days filter: customer list shows only customers who signed up in last 30 days.

3. Combine Pro + Last 30 days: list shows Pro customers from last 30 days only.

4. Apply 2 tiers (Pro + Growth): list shows OR — both Pro and Growth customers.

5. Apply filter that returns 0 customers: empty state visible with 'Clear filters' CTA. Click CTA → filters clear, full list returns.

6. Share URL with filter: open URL in new browser → filter is pre-applied, list shows filtered results.

7. Mobile viewport: filter button opens drawer; UX is functional with touch.

8. Keyboard nav: Tab to filter button → Enter → Tab through filter options → Enter to apply.

9. API error simulation (network mocked failure): error toast appears; filter UI remains; retry works.

10. Performance (~10K customers): filter applies in <500ms p95.

Definition of Done

  • [ ] Code merged to main
  • [ ] Unit tests added and passing (FilterBar variant tests, API query tests)
  • [ ] Integration test added (Cypress or Playwright) covering ACs 1-5 + 10
  • [ ] Code review completed by 1 reviewer
  • [ ] Deployed to staging
  • [ ] Manual smoke test by PM on staging
  • [ ] Analytics events verified firing in staging
  • [ ] Accessibility check passed (axe-core or manual screen reader test)
  • [ ] Documentation updated if any new patterns introduced
  • [ ] Sales team Slack notified when shipped to prod

Estimate

Medium (5 story points / 3-5 days). Reasoning:

  • FilterBar component reuse drops UI work to ~1 day
  • Backend query extension is ~0.5 day
  • URL sync + chip display + empty state: ~1 day
  • Tests + a11y verification: ~1 day
  • Buffer: ~0.5 day

Caveats: if the FilterBar component needs significant refactoring to support the customer-list variant (which we don't yet know), estimate could grow to Large (8 points).

Open Questions

  • None for v1 scope. All 5 'PM forgets' answered above.

Suggested Sub-Tasks

1. Backend: extend /api/customers to accept plan_tiers + signup_at filter params (0.5 day)

2. Frontend: add customer-list variant to FilterBar component (1 day)

3. Frontend: add chip display + URL sync for customer list (1 day)

4. Empty state + error state UI (0.5 day)

5. Tests + a11y verification (1 day)

6. Analytics events + observability (0.5 day)

The PM/eng-lead can decide whether to break this into actual Jira sub-tasks or keep as one ticket with internal task tracking.

Common use cases

  • PM writing tickets faster + better in their daily ticketing flow
  • Engineer translating a vague Slack request into a proper Jira ticket before starting work
  • Eng manager standardizing ticket quality across a 5-15 person engineering team
  • Solo founder writing tickets for an outsourced dev team (where ambiguity costs days)
  • Designer writing handoff tickets that engineers can start on immediately
  • QA writing bug tickets that don't require 3 follow-ups to reproduce

Best AI model for this

Claude Sonnet 4.5 or Opus 4. Ticket-quality work is structured writing — Sonnet handles it well, Opus polishes for high-stakes tickets. ChatGPT GPT-5 second-best.

Pro tips

  • Always start with the user story, not the implementation. 'As a user, I want X so I can Y' beats 'add a filter component to dashboard.'
  • Acceptance criteria are explicit binary statements. 'Filter applies on click' not 'filter should work properly.'
  • Always answer the 5 PMs-forget questions: empty state, error state, mobile, accessibility, analytics. These cause 80% of post-launch tickets.
  • Out-of-scope section is non-negotiable. Engineers will scope-creep into adjacent work if you don't explicitly say what's NOT included.
  • Link to the design (Figma URL, screenshot) for any UI work. Tickets without designs slow estimation by 2x.
  • Add a 'How to test' section. QA shouldn't have to figure it out from acceptance criteria alone.
  • For bugs: include reproduction steps + expected vs actual + environment. The bug ticket without repro steps is the bug ticket that takes a week to fix.

Customization tips

  • Paste the FULL original ticket as-is — title + description. The Original infers what's missing by what's present.
  • Include the context of why this ticket exists (Slack thread, customer feedback, related ticket). The 'Background / Why' section is calibrated to this.
  • Specify your team's conventions if non-standard. Some teams use 'GIVEN-WHEN-THEN' format for AC, others use bullet points.
  • Mention your team size + maturity. A 3-engineer startup needs different DoD checklist than a 30-engineer org with QA.
  • If it's a bug, paste the original report INCLUDING any screenshots/videos described. The Bug Ticket Mode variant will structure reproduction steps tightly.
  • Use the Tech Debt Ticket Mode variant for refactor / migration tickets — they need 'why now' justification more than feature tickets do.

Variants

Feature Ticket Mode

For new feature work — emphasizes user story, acceptance criteria, scope boundaries.

Bug Ticket Mode

For bug reports — emphasizes reproduction steps, expected vs actual behavior, environment, severity.

Tech Debt Ticket Mode

For internal refactor / migration / cleanup work — emphasizes the 'why now', risk, success criteria, and rollback plan.

Spike / Investigation Mode

For research / discovery tickets — emphasizes the question to answer, deliverable format, time-box.

Frequently asked questions

How do I use the Jira Ticket Quality Rewriter prompt?

Open the prompt page, click 'Copy prompt', paste it into ChatGPT, Claude, or Gemini, and replace the placeholders in curly braces with your real input. The prompt is also launchable directly in each model with one click.

Which AI model works best with Jira Ticket Quality Rewriter?

Claude Sonnet 4.5 or Opus 4. Ticket-quality work is structured writing — Sonnet handles it well, Opus polishes for high-stakes tickets. ChatGPT GPT-5 second-best.

Can I customize the Jira Ticket Quality Rewriter prompt for my use case?

Yes — every Promptolis Original is designed to be customized. Key levers: Always start with the user story, not the implementation. 'As a user, I want X so I can Y' beats 'add a filter component to dashboard.'; Acceptance criteria are explicit binary statements. 'Filter applies on click' not 'filter should work properly.'

Explore more Originals

Hand-crafted 2026-grade prompts that actually change how you work.

← All Promptolis Originals