Repairs defect bookkeeping that reports the wrong numbers - a weekly summary showing zero in the top severity band, a 'new defects this week' figure counting items already fixed, duplicates that were never merged, or one script moving issues across several boards whose workflows disagree. Files, transitions, dedupes, and searches bugs through one tracker-agnostic workflow across Jira, Linear, GitHub Issues, and Azure DevOps: authenticate, dedupe-search before creating, classify severity and priority, transition lifecycle states, and wire idempotent CI-driven filing from test failures. Jira Cloud REST API v3 is worked in full in the body (ADF descriptions, runtime transition lookup, JQL triage and duplicate queries, dry-run bulk transitions). Use when tracker data, defect metrics, or cross-board transitions are wrong or need automating.
70
88%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Deep Jira specifics for bug-tracker-workflow. Auth setup, create,
transition, and JQL search stay in SKILL.md; this file holds the
custom-field, update, and result-parsing detail.
severity is usually a custom field, not the built-in priority. Discover the
field ID once per tenant:
curl -u "$JIRA_EMAIL:$JIRA_TOKEN" \
"$JIRA_BASE/rest/api/3/field" \
| jq '.[] | select(.name=="Severity") | {id, name}'
# {"id": "customfield_10039", "name": "Severity"}Then submit it in the create payload:
"customfield_10039": {"value": severity}, # "Critical" | "High" | ...PUT /rest/api/3/issue/{key} for arbitrary field updates:
def update_priority(issue_key, priority_name):
r = requests.put(
f"{BASE}/rest/api/3/issue/{issue_key}",
json={"fields": {"priority": {"name": priority_name}}},
headers=HEADERS,
)
r.raise_for_status()create_bug returns the new issue key (e.g. ENG-12345). Build a permalink:
url = f"{BASE}/browse/{issue_key}"Search responses include expand, total, startAt, and issues (the
array). Always check total against maxResults for pagination.
text ~ "user input" accepts JQL operators - always
escape quotes and reserved characters before interpolating.