Skip to content

The moment it happens

Route new bugs to the right team

New issues in Triage get a team, label and priority, and you get a note explaining each choice.

Runs
The moment it happens
Apps
Linear
AI
Yes, uses the built-in AI allowance
Access
read+write

Send this to your assistant

Create a ClickRuntime automation: when a new Linear issue lands in Triage, pick the right team and label from its title and description, apply them, and Slack me what you changed and why.

Paste it into your assistant. It tells you what it will send or change before it runs live.

First time? Adding ClickRuntime to your assistant takes about two minutes.

Why use it

Why teams use this automation

A growing product team's bug intake is messy. Customers, support and QA create issues in Linear with vague titles, no label and no priority, and an engineering manager spends part of every morning deciding which team should take each one and how urgent it is. Meanwhile a serious bug filed at 5 p.m. sits untriaged until the next day, and the on-call engineer does not hear about it.

When a new issue is created in Linear, ClickRuntime reads the title and description, and its built-in AI suggests the owning team, a label and a priority. The issue is updated with those values, and a Slack message gives the reasoning, so the team can see why the issue was classified that way and correct it if the AI was wrong.

Teams with a high volume of incoming bugs gain the most.

What you get out of it

  • Urgent bugs reach the right team quickly

    A crash that affects checkout should not wait until the next morning's triage. Setting a high priority on arrival and posting to Slack puts it in front of the right engineers within minutes.

  • Triage meetings get shorter

    With team, label and priority already suggested, the weekly triage becomes a quick review of the exceptions. The time saved can go to fixing issues rather than sorting them. Engineers then spend their time on fixes, not sorting.

  • Classification is consistent

    Different people triage differently, and the same bug can get a different priority on different days. A single set of criteria makes the board more predictable and easier to filter.

  • The reasoning is visible

    Because the Slack note explains why the AI chose a team or priority, a manager can tell right away whether it makes sense. That makes corrections quick and builds trust in the process.

  • Support and QA get fast feedback

    People who file bugs see the issue assigned to a team within minutes rather than waiting for a response. It encourages them to file complete reports, since someone clearly reads them.

How it works

What happens, step by step

  1. When a new bug is filed in Linear, ClickRuntime picks it up straight away.

  2. AI reads the title and description and decides which team owns it, which label fits and how urgent it is.

  3. The issue is updated in Linear with that team, label and priority.

  4. A note goes to your #triage Slack channel saying where the bug was routed and why.

Before it runs live

  • Connect Linear
  • Paste your automation's link into the other app's webhook settings

What you get

RunsThe moment it happens
Route new bugs to the right teamjust nowSucceeded
Slack · #triageLogin loop after password reset → Identity / Bug: mentions auth redirect after reset, owned by Identity.

Build your own

Need it to work differently?

This template is a starting point. Copy the prompt and change it, or describe a different automation from scratch, with your own conditions, more apps or an AI step. Your assistant writes it, tests it and runs it on ClickRuntime.
  • Your own rules

    Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.

  • Any number of apps

    One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.

  • AI where it helps

    Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.

  • On a schedule or on each event

    Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.

Changes you can ask for

  • Act only on the items that match your own rules, and skip the rest
  • Change what the AI looks for, or how it writes the result
  • Add another app, for example also send it to Slack
  • Combine it with other Linear steps into one automation

Under the hood

The code that runs this automation

This is the Python script that runs each time the automation starts. Your AI assistant writes it for you when you send the prompt, and you allow each step in your assistant. To change how the automation works, describe the change to your assistant and it updates the script for you. For every function it can use, see the script reference.
ai_triage_of_new_bugs.pyexample
from clickruntime import on_event, http, credentials, ai, notify

def linear(query, variables=None):
    r = http.post(
        "https://api.linear.app/graphql",
        headers={"Authorization": credentials.secret("LINEAR_API_KEY")},
        json={"query": query, "variables": variables or {}},
    )
    r.raise_for_status()
    return r.json()["data"]

@on_event
def handle(event):
    body = event.json or {}
    issue = body.get("data", {})
    if body.get("action") != "create" or (issue.get("state") or {}).get("type") != "triage":
        return {"triaged": False}
    teams = linear("{ teams { nodes { id name } } }")["teams"]["nodes"]
    labels = linear("{ issueLabels(first: 100) { nodes { id name } } }")["issueLabels"]["nodes"]
    pick = ai.generate(
        f"Issue: {issue.get('title')}\n{(issue.get('description') or '')[:1500]}\n"
        f"Teams: {[t['name'] for t in teams]}\nLabels: {[l['name'] for l in labels]}",
        system="Pick the best team and label and give a one-line reason.",
        json_schema={"type": "object", "properties": {"team": {"type": "string"}, "label": {"type": "string"}, "reason": {"type": "string"}}},
        max_output_tokens=120,
    ).json
    team_id = next(t["id"] for t in teams if t["name"] == pick["team"])
    label_ids = [l["id"] for l in labels if l["name"] == pick["label"]]
    linear("""mutation($id: String!, $input: IssueUpdateInput!) {
      issueUpdate(id: $id, input: $input) { success } }""",
           {"id": issue["id"], "input": {"teamId": team_id, "labelIds": label_ids}})
    notify.slack(f"{issue.get('title')} → {pick['team']} / {pick['label']}: {pick['reason']}", channel="#triage")
    return pick

FAQ

Common questions

Can the AI change an issue I have already triaged?
Only if you want it to. By default it handles newly created issues and sets team, label and priority once. You can ask for it to skip issues that already have a priority, so manual decisions are never overwritten.
How does the AI know which team owns what?
You give it a short description of each team's area, such as payments, mobile or infrastructure, and it matches the issue text against those descriptions. Updating a description is how you teach it about reorganizations or new products.
Is a ClickRuntime AI key required?
No external AI key is needed. The classification runs on the AI that is built into ClickRuntime, so the only connections you need are Linear and Slack. This is the same on every plan, including the free plan.
What permissions does it need?
read+write. Nothing else in your accounts is used.
Does it need AI?
Yes. It uses ClickRuntime's built-in AI, so you don't need an OpenAI or Anthropic key. Every plan includes a monthly AI allowance.
How many runs does it use?
One run for each event the app sends.
Can I change how it works?
Yes. Describe the change to your AI assistant, for example a different schedule, channel or filter. It updates the automation, tests it and tells you what changed.

Set up “Route new bugs to the right team” from your assistant

Copy the prompt above, or connect your assistant first. Free plan, no credit card.