Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Run QA work in Jira like a professional, bug lifecycle and triage, JQL queries for testers, quality dashboards, sprint QA rituals, and REST API automation for bulk bug operations and reporting.
.claude/skills/pramoddutta-jira-qa-workflows/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 22% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 55% | 0% |
| case-23 | ✗→✓ | ▲ Improved | 70% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 77% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 71% | 0% |
You are an expert QA lead who runs testing operations in Jira. When the user asks you to write bugs, build JQL queries, design QA workflows, create dashboards, or automate Jira for testing, follow these instructions.
textSummary: [Checkout] Payment fails with saved Visa card on order > $500 (Area) + specific behavior + condition. Searchable, no "doesn't work". Environment: prod / staging build 2026.07.1 / browser + OS / test account Steps to Reproduce: 1. Sign in as user with saved Visa ending 4242 2. Add items totaling > $500 3. Checkout -> select saved card -> Place order Expected: Order confirmation page, payment captured once Actual: Spinner for 30s, then "Payment failed" toast; card charged (see txn id) Evidence: screenshot, HAR file, console errors, video for timing issues Severity vs Priority: severity = impact (S1 data loss ... S4 cosmetic); priority = fix order (set in triage, not by reporter) Links: blocks / is-blocked-by, duplicate-of, relates-to the story it broke
Rules: one defect per issue; reproduction rate stated (3/3, 1/5 flaky); logs as attachments or code blocks, never screenshots of text.
sql-- My open bugs, newest first assignee = currentUser() AND type = Bug AND statusCategory != Done ORDER BY created DESC -- Triage queue: new bugs with no priority project = SHOP AND type = Bug AND status = Open AND priority IS EMPTY -- Escapes: bugs found in production this quarter project = SHOP AND type = Bug AND labels = found-in-prod AND created >= startOfQuarter() -- Stale: touched by nobody in 14 days but still open type = Bug AND statusCategory = "In Progress" AND updated <= -14d -- Reopened bugs (quality of fixes signal) type = Bug AND status CHANGED FROM Resolved TO Reopened AFTER -30d -- Release readiness: unresolved S1/S2 against the fix version fixVersion = "2026.07" AND type = Bug AND priority in (Highest, High) AND statusCategory != Done -- Flaky-test label board feed labels = flaky-test AND statusCategory != Done ORDER BY priority DESC
Save each as a named filter; filters feed boards, dashboards, and subscriptions (email me new S1s hourly).
Recommended bug workflow: Open -> Triaged -> In Progress -> In Review -> Ready for QA -> Verified -> Closed, plus Reopened looping to In Progress.
Rules that keep it honest: only QA moves Ready for QA -> Verified (verification on a deployed build, not code review); Reopened requires a comment with new evidence; Closed without Verified needs a resolution (Duplicate, Cannot Reproduce, Won't Fix) and those resolutions are dashboard-tracked; every prod bug gets found-in-prod label at creation, this one label powers escape-rate metrics later.
Triage ritual (15 min daily or 3x week): walk the no-priority filter, set severity/priority, assign component owner, kill duplicates with links, label found-in-prod where true.
| Gadget | Filter behind it | Decision it feeds | |---|---|---| | Open bugs by priority (pie) | all open bugs | Is triage keeping up | | Created vs resolved (line, 30d) | type = Bug | Are we sinking or draining | | Unresolved by fixVersion (2D) | release filter | Go/no-go per release | | Reopened in 30d (counter) | reopen JQL above | Fix quality trend | | Escapes per quarter (counter) | found-in-prod filter | Where testing gaps are | | Aging In Progress > 14d (list) | stale JQL above | What to unblock this week |
typescript// bulk-label prod escapes from an incident list; ALWAYS dry-run first const jira = axios.create({ baseURL: 'https://yourco.atlassian.net/rest/api/3', auth: { username: process.env.JIRA_EMAIL!, password: process.env.JIRA_API_TOKEN! }, }); const jql = 'project = SHOP AND type = Bug AND key in (SHOP-101, SHOP-105, SHOP-118)'; const { data } = await jira.get('/search/jql', { params: { jql, fields: 'summary,labels' } }); for (const issue of data.issues) { console.log('WOULD UPDATE', issue.key, issue.fields.summary); // dry run if (process.env.APPLY === '1') { await jira.put(`/issue/${issue.key}`, { update: { labels: [{ add: 'found-in-prod' }] }, }); } }
Common automations worth building: create linked bug from a failed CI test (dedupe by summary hash first), weekly quality report from the dashboard filters posted to Slack, auto-transition Verified bugs to Closed after release ships. Use scoped API tokens; never a personal admin token in CI.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 19,127 | 17,151 | -10% | 1 | 1 | 0% | 2,098 | 3,617 | +72% | 0 | 0 | — |
case-02 | fail→fail | 21,535 | 20,062 | -7% | 1 | 1 | 0% | 2,776 | 3,862 | +39% | 0 | 0 | — |
case-03 | fail→pass | 28,843 | 23,186 | -20% | 1 | 1 | 0% | 3,885 | 4,746 | +22% | 0 | 0 | — |
case-04 | pass→pass | 16,042 | 15,487 | -3% | 1 | 1 | 0% | 2,025 | 3,592 | +77% | 0 | 0 | — |
case-05 | pass→pass | 18,407 | 17,116 | -7% | 1 | 1 | 0% | 1,950 | 3,326 | +71% | 0 | 0 | — |
case-06 | pass→pass | 18,066 | 16,094 | -11% | 1 | 1 | 0% | 2,116 | 3,245 | +53% | 0 | 0 | — |
case-07 | pass→pass | 13,632 | 11,257 | -17% | 1 | 1 | 0% | 1,155 | 2,368 | +105% | 0 | 0 | — |
case-08 | pass→pass | 16,780 | 16,018 | -5% | 1 | 1 | 0% | 1,567 | 2,481 | +58% | 0 | 0 | — |
case-09 | fail→fail | 14,455 | 6,350 | -56% | 1 | 1 | 0% | 1,486 | 2,371 | +60% | 0 | 0 | — |
case-10 | pass→pass | 12,391 | 9,636 | -22% | 1 | 1 | 0% | 921 | 2,150 | +133% | 0 | 0 | — |
case-11 | pass→pass | 12,219 | 10,236 | -16% | 1 | 1 | 0% | 1,285 | 2,301 | +79% | 0 | 0 | — |
case-12 | pass→pass | 11,301 | 9,309 | -18% | 1 | 1 | 0% | 962 | 2,039 | +112% | 0 | 0 | — |
case-13 | fail→pass | 22,373 | 14,370 | -36% | 1 | 1 | 0% | 2,252 | 3,483 | +55% | 0 | 0 | — |
case-14 | pass→pass | 13,130 | 8,299 | -37% | 1 | 1 | 0% | 1,156 | 1,960 | +70% | 0 | 0 | — |
case-15 | pass→pass | 18,456 | 18,031 | -2% | 1 | 1 | 0% | 1,751 | 3,263 | +86% | 0 | 0 | — |
case-16 | pass→pass | 17,355 | 16,079 | -7% | 1 | 1 | 0% | 2,387 | 3,106 | +30% | 0 | 0 | — |
case-17 | fail→fail | 23,704 | 28,973 | +22% | 1 | 1 | 0% | 2,769 | 5,211 | +88% | 0 | 0 | — |
case-18 | pass→pass | 17,496 | 17,989 | +3% | 1 | 1 | 0% | 1,774 | 2,989 | +68% | 0 | 0 | — |
case-19 | pass→pass | 15,769 | 13,881 | -12% | 1 | 1 | 0% | 1,665 | 2,721 | +63% | 0 | 0 | — |
case-20 | pass→pass | 20,485 | 19,993 | -2% | 1 | 1 | 0% | 2,600 | 3,825 | +47% | 0 | 0 | — |
case-21 | pass→pass | 10,209 | 14,265 | +40% | 1 | 1 | 0% | 1,185 | 2,654 | +124% | 0 | 0 | — |
case-22 | pass→pass | 15,013 | 21,789 | +45% | 1 | 1 | 0% | 2,237 | 3,876 | +73% | 0 | 0 | — |
case-23 | fail→pass | 23,239 | 25,446 | +9% | 1 | 1 | 0% | 2,805 | 4,774 | +70% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +13 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.