Author and run Linear bug workflows via the GraphQL API: issue creation, state transitions (workflowState assignment), priority assignment (0 No priority / 1 Urgent / 2 High / 3 Medium / 4 Low), label-based classification, search by team and content. Covers the issueCreate mutation, issueUpdate for state transitions, the workflowStates query for per-team state IDs, and Linear's API-key vs OAuth Bearer auth modes; resolve-by-type, CI wiring, and result parsing live in references/. Use when the target tracker is Linear specifically; for other trackers use jira-bug-workflow-runner (Jira) or github-issues-bug-workflow (GitHub Issues). Files and transitions the issue; reproducing the defect is a separate concern.
76
95%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Deep reference for linear-bug-workflow-runner SKILL.md. Consult when resolving
a workflow state by its lifecycle type without hard-coding names, discovering
states across all teams, wiring CI to file bugs on failure, or parsing the
identifiers returned by issueCreate.
Many automation flows want "transition to whatever the team uses
as Done" without hard-coding state names. Resolve the target state
by its lifecycle type, then reuse the transition helper from the
SKILL:
def transition_to_completed(issue_id, team_id):
done = next(s for s in get_states(team_id) if s["type"] == "completed")
return transition(issue_id, done["id"])The type enum (backlog, unstarted, started, completed,
canceled) is stable; the name is team-customisable, so resolving
by type survives a team renaming its columns.
Per the Linear quickstart docs the simpler, unfiltered form is:
query { workflowStates { nodes { id name } } }...which returns all states across all teams. Prefer the per-team filtered query in the SKILL - the unfiltered form has high latency on large workspaces and returns far more nodes than a single flow needs.
issueCreate.issue.identifier is the human-readable ID (e.g.,
ENG-1234). issueCreate.issue.url is the canonical permalink.
GraphQL errors surface under a top-level errors array even on an
HTTP 200 - check data.get("errors") before reading data["data"].
- name: File Linear bug on failure
if: failure()
env:
LINEAR_KEY: ${{ secrets.LINEAR_KEY }}
LINEAR_TEAM_ID: ${{ vars.LINEAR_TEAM_ID }}
run: python scripts/file-linear-bug.py results.xmlfile-linear-bug.py reads the JUnit XML, extracts the first failure,
deduplicates via find_dupes, and calls create_or_attach.