Triage the Linear issues waiting in Triage, with a suggested team and priority

Every weekday at 10: the issues sitting in Linear Triage, oldest first, each with a suggested team, priority and label, ready to accept or change.

Runs
Weekdays at 10:00
Uses
Linear
Posts
Asks you

What lands on your board

AcmeLinear triage queue · Claude Code

8 issues waiting in Triage, oldest 4 days

Apply the suggested team, priority and label to these 8 issues?

Suggestions are ready for all 8. 2 look like duplicates, and SUP-311 reports missing invoices after a plan change, so it is marked Urgent.

IssueFromTeamPriorityLabel
SUP-305 SSO login loops on SafariSlackPlatformHighBug
SUP-309 Export reports to ExcelIntercomReportingLowFeature request
SUP-311 Invoices missing after a plan changeIntercomBillingUrgentBug
SUP-312 Dark mode on mobileLinearMobileLowFeature request
SUP-314 Webhook timeouts for an EU workspaceSlackPlatformHighBug
SUP-316 Typo on the pricing pageLinearWebLowBug

SUP-313 repeats ENG-874 and SUP-315 repeats WEB-221; both would be marked as duplicates.

Resolve
An example with made-up numbers. Your agent posts your real ones.

What it does

Triage is quick per issue and slow in bulk. The PM on duty opens the Triage view to find thirty issues from support, Slack and the Intercom integration, a few of them duplicates, and the oldest ones are exactly the ones a customer is waiting on.

The agent reads everything in Triage, searches open issues for likely duplicates, and suggests a team, a priority and an existing label for each one, with the reason. Nothing leaves Triage until you answer the card.

How it works

  1. 1Read the queue

    Query issues(filter: { state: { type: { eq: "triage" } } }, first: 50) with identifier title description createdAt creator { name } team { key } labels { nodes { name } } attachments { nodes { sourceType } }, then sort oldest first by createdAt.

  2. 2Check for duplicates

    For each issue, run searchIssues(term: "<key words from the title>", first: 5) and treat an open issue with a near-identical title or the same error message as a likely duplicate.

  3. 3Suggest team, priority and label

    Pick the team from what the issue describes, matched against teams { nodes { key name description } }. Suggest Urgent only for data loss, security or an outage, High when a paying customer is blocked, Medium or Low otherwise. Take labels from issueLabels; never invent one.

  4. 4

    4Ask, then apply

    Post the queue with the suggestions and ask whether to apply them. On a yes, call issueUpdate with teamId, priority, labelIds and the target team's Backlog stateId, and issueRelationCreate with type: duplicate for duplicates.

  5. Post it to the board

    With BRIEFKIN_TOKEN set, the agent sends the result as one card that updates in place every run. Without it, you get the report in the chat.

What you get

  • Waiting in Triage: the count, and the age of the oldest.
  • The queue, oldest first: identifier, title, where it came from, suggested team, priority and label.
  • Likely duplicates, each with the issue it repeats.
  • The ask: apply all suggestions, go one by one, or leave them.

Install and run it

Pick your agent, where the data comes from and how to schedule it; the commands below follow.

Agent
Data
Schedule
  1. Install the skill

    One command. It puts the SKILL.md in ~/.claude/skills and in ~/.agents/skills, which Codex, Cursor, Gemini CLI, Copilot CLI and OpenCode read too.

    shellcurl -fsSL https://briefkin.dev/skills/linear-triage-queue/install | sh
  2. Run it

    Ask Claude Code:

    promptRun the linear-triage-queue skill

    Or paste the prompt instead of installing:

    promptUsing the Linear GraphQL API (or the Linear MCP server), list every issue in a triage state (state.type = "triage"), oldest first, with identifier, title, description, team, creator and where it came from. For each, search open issues for a likely duplicate, and suggest a team, a priority (Urgent only for data loss, security or an outage; High when a paying customer is blocked; otherwise Medium or Low) and one existing label. Show the queue as a table with your suggestions and duplicates marked, then ask me whether to apply them. Change nothing until I answer.
  3. Put it on a schedule

    Weekdays at 10:00, from cron on any machine where Claude Code is signed in:

    crontab0 10 * * 1-5 claude -p "Run the linear-triage-queue skill"

    Add it with crontab -e. A laptop asleep at that time runs it when it wakes if you use launchd or Task Scheduler instead; GitHub Actions works for the API route.

  4. Send it to your board

    Connect Briefkin once with curl -fsSL https://briefkin.dev/install | sh and every run lands on your board as a question for you. How setup works

View the SKILL.mdRaw file
SKILL.md---
name: linear-triage-queue
description: "Every weekday at 10: the issues sitting in Linear Triage, oldest first, each with a suggested team, priority and label, ready to accept or change. Use when the user asks for this, or when it runs on a schedule."
---

# Linear triage queue

Every weekday at 10: the issues sitting in Linear Triage, oldest first, each with a suggested team, priority and label, ready to accept or change.

Triage is quick per issue and slow in bulk. The PM on duty opens the Triage view to find thirty issues from support, Slack and the Intercom integration, a few of them duplicates, and the oldest ones are exactly the ones a customer is waiting on.

The agent reads everything in Triage, searches open issues for likely duplicates, and suggests a team, a priority and an existing label for each one, with the reason. Nothing leaves Triage until you answer the card.

## Two ways to get the data

Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.

## Route A: API or MCP server

### What you need

- Membership in the teams that receive triage, and permission to edit their issues if the agent should apply your answer.
- The Linear MCP server or connector, or `LINEAR_API_KEY` with write access for the GraphQL mutations.

If something is missing, say what and stop; do not invent numbers.

### Steps

1. **Read the queue** (Linear): Query `issues(filter: { state: { type: { eq: "triage" } } }, first: 50)` with `identifier title description createdAt creator { name } team { key } labels { nodes { name } } attachments { nodes { sourceType } }`, then sort oldest first by `createdAt`.
2. **Check for duplicates** (Linear): For each issue, run `searchIssues(term: "<key words from the title>", first: 5)` and treat an open issue with a near-identical title or the same error message as a likely duplicate.
3. **Suggest team, priority and label** (Linear): Pick the team from what the issue describes, matched against `teams { nodes { key name description } }`. Suggest Urgent only for data loss, security or an outage, High when a paying customer is blocked, Medium or Low otherwise. Take labels from `issueLabels`; never invent one.
4. **Ask, then apply**: Post the queue with the suggestions and ask whether to apply them. On a yes, call `issueUpdate` with `teamId`, `priority`, `labelIds` and the target team's Backlog `stateId`, and `issueRelationCreate` with `type: duplicate` for duplicates.

## Route B: the browser

### What you need

- Signed in to Linear as a member of the teams whose Triage you read; applying suggestions needs permission to edit those issues.
- Triage turned on for the team under Team settings > Triage, or the view does not appear in the sidebar.

If something is missing, say what and stop; do not invent numbers.

### Steps

Start at https://linear.app/. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.

1. **Open the Triage view**: In the sidebar, expand the team that receives new issues and click **Triage** (or press `G` then `T`). If several teams have a Triage inbox, repeat the steps for each one.
2. **Sort oldest first**: Open **View options**, set **Ordering** to `Created` and flip the order so the oldest is on top. Turn on the `Created`, `Labels` and `Assignee` display properties.
3. **Read each issue**: Open the issues one by one and read the title, description, who created it and where it came from (a Slack, Intercom or Zendesk badge sits next to the title when an integration created it).
4. **Look for duplicates**: Press `/` or open **Search** and type the key words from the title. An open issue with a near-identical title or the same error text is a likely duplicate; keep its identifier.
5. **Suggest, then wait**: Write the queue with a suggested team, priority (Urgent only for data loss, security or an outage; High when a paying customer is blocked; otherwise Medium or Low) and one existing label per issue, and ask. Only after a yes, use **Accept** (`1`) and set the properties in the right-hand panel, or **Mark as duplicate** (`3`) for duplicates.

Note: On Business and Enterprise plans, Triage Intelligence already shows suggested assignees and labels in the panel; read them as one more input. Snoozed issues are hidden from the view unless you turn them on in View options.

## The report

- **Waiting in Triage**: the count, and the age of the oldest.
- **The queue**, oldest first: identifier, title, where it came from, suggested team, priority and label.
- **Likely duplicates**, each with the issue it repeats.
- The ask: apply all suggestions, go one by one, or leave them.

## Post it to Briefkin

When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.

```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
  -H "authorization: Bearer $BRIEFKIN_TOKEN" \
  -H "content-type: application/json" \
  -d @- <<'JSON'
{
  "v": 1,
  "event_id": "linear-triage-queue/<date of this run, e.g. 2026-10-16>",
  "item_key": "linear-triage-queue",
  "project": "Acme",
  "source": "Linear triage queue skill",
  "kind": "action",
  "title": "8 issues waiting in Triage, oldest 4 days",
  "summary": "Suggestions are ready for all 8. **2 look like duplicates**, and SUP-311 reports missing invoices after a plan change, so it is marked Urgent.",
  "action": {
    "request": "Apply the suggested team, priority and label to these 8 issues?",
    "options": [
      "Apply all",
      "Apply all but duplicates",
      "Go one by one",
      "Leave them"
    ]
  },
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Issue",
          "From",
          "Team",
          "Priority",
          "Label"
        ],
        "rows": [
          [
            "SUP-305 SSO login loops on Safari",
            "Slack",
            "Platform",
            "High",
            "Bug"
          ],
          [
            "SUP-309 Export reports to Excel",
            "Intercom",
            "Reporting",
            "Low",
            "Feature request"
          ],
          [
            "SUP-311 Invoices missing after a plan change",
            "Intercom",
            "Billing",
            "Urgent",
            "Bug"
          ],
          [
            "SUP-312 Dark mode on mobile",
            "Linear",
            "Mobile",
            "Low",
            "Feature request"
          ],
          [
            "SUP-314 Webhook timeouts for an EU workspace",
            "Slack",
            "Platform",
            "High",
            "Bug"
          ],
          [
            "SUP-316 Typo on the pricing page",
            "Linear",
            "Web",
            "Low",
            "Bug"
          ]
        ]
      }
    },
    {
      "type": "Callout",
      "props": {
        "text": "SUP-313 repeats ENG-874 and SUP-315 repeats WEB-221; both would be marked as duplicates.",
        "tone": "info"
      }
    }
  ]
}
JSON
```

Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.

## Run it on a schedule

Suggested: Weekdays at 10:00 (`0 10 * * 1-5`). From cron, with the agent signed in on that machine:

```bash
0 10 * * 1-5 claude -p "Run the linear-triage-queue skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```

Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/linear-triage-queue#schedule

Source: https://briefkin.dev/skills/linear-triage-queue

What your agent needs

  • Membership in the teams that receive triage, and permission to edit their issues if the agent should apply your answer.

  • The Linear MCP server or connector, or LINEAR_API_KEY with write access for the GraphQL mutations.

Connecting Linear

  1. Linear MCP server, Linear's official remote server at https://mcp.linear.app/mcp. Add Linear from Claude's connector directory, or run claude mcp add --transport http linear https://mcp.linear.app/mcp in Claude Code, and sign in with OAuth.
  2. GraphQL API with a personal API key. Create a key in Linear's settings under Security & access, store it in LINEAR_API_KEY, and send it as the Authorization header with no Bearer prefix. For a workspace bot, an OAuth app with the read scope does the same job.

When you create the key, give it Read access and only the teams in the report; it then can't create or edit issues.

Questions

Will it move issues without asking?

No. The card is a question, and the skill only calls issueUpdate after you answer. If you pick Go one by one, it walks through each issue in the chat and waits for a yes or a change on every one.

How does it choose the team?

From the description, matched against each team's name, description and recent issues, and it gives the reason next to the suggestion. Vague team names get vague suggestions, so add one line per team to the prompt saying what it owns.

Do I need Briefkin to use the Linear triage queue skill?

No. The skill runs with your own agent and gives you the report in the chat. With a Briefkin token set, each run also posts it to your board as a asks you, so you can glance at it instead of asking again.

Which agents can run it?

Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, Windsurf and Amp all read SKILL.md files. The install command puts it in ~/.claude/skills and ~/.agents/skills, where they look. ChatGPT, the Claude app and Grok take the prompt instead. Pick your agent under "Install and run it" and the commands change to match.

Can it work without an API or MCP server, from my browser?

Yes. Switch the data source to "Your browser" and the steps change to the Linear pages themselves: the agent opens linear.app in a browser you are signed in to and reads the numbers off the page. Claude Code, Codex, Cursor, Claude app and ChatGPT can drive a browser out of the box; Gemini CLI, Copilot CLI and OpenCode need a Playwright or Chrome DevTools MCP server first. It is slower than the API and needs you signed in, so it suits a report you run by hand or from a scheduler on your own computer.

Answer your agents from one board, or from Telegram

Skills are free to use with any agent. Briefkin is where their results land: one board for every report, number and question your agents send, with a ping when something needs you.

Free during the open beta. No card.