The moment it happens
Triage new GitHub issues with AI and flag urgent ones
Every new GitHub issue is labelled by type and priority, possible duplicates are noted, and urgent ones are posted to Slack.
- Runs
- The moment it happens
- Apps
- GitHub, Slack
- AI
- Yes, uses the built-in AI allowance
- Access
- issues:write; chat:write
Send this to your assistant
Create a ClickRuntime automation: when a new issue is opened in acme/app, have AI label it bug, feature or question with a priority, comment if it looks like a duplicate of an open issue, and post high-priority ones to #eng.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
An open-source project with a small maintainer team gets several new issues a day. Half are questions, a quarter are duplicates, and the occasional serious bug waits days for someone to notice it among the rest.
Labelling each issue the moment it arrives, pointing out likely duplicates and flagging the urgent ones in Slack means the serious bugs reach a maintainer within minutes. The backlog stays sorted without anyone spending their morning on it.
What you get out of it
Serious bugs are seen first
High-priority issues are posted in Slack straight away. A data-loss bug does not sit unnoticed behind feature requests.
Duplicates are linked early
A comment points to the open issue that looks the same. Reporters find the existing discussion and maintainers avoid fixing the same thing twice.
A labelled backlog
Every issue arrives with a type and priority label. Filtering and planning get easier without a weekly triage session.
Faster response for reporters
People who report issues see a label or comment within minutes. That simple acknowledgement keeps contributors engaged.
How it works
What happens, step by step
When an issue is opened, GitHub notifies ClickRuntime straight away.
ClickRuntime gathers the titles of recent open issues for comparison.
AI reads the new issue and chooses a type, a priority and any likely duplicate.
The labels are added to the issue, and a comment links the possible duplicate.
High-priority issues are posted to your #eng Slack channel.
Before it runs live
- Connect GitHub
- Connect Slack, then invite the app to the channel (type /invite @ClickRuntime there)
- Paste your automation's link into the other app's webhook settings
What you get
Build your own
Need it to work differently?
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 Google Sheets
- Combine it with other GitHub and Slack steps into one automation
Under the hood
The code that runs this automation
from clickruntime import on_event, credentials, http, notify, verify, ai
def gh(method, path, **kw):
resp = http.request(method, f"https://api.github.com{path}", headers={
"Authorization": f"Bearer {credentials.connection('github', 'work')}", "Accept": "application/vnd.github+json"}, **kw)
return resp.raise_for_status() or (resp.json() if resp.content else None)
SCHEMA = {"type": "object", "properties": {"type": {"type": "string", "enum": ["bug", "feature", "question"]},
"priority": {"type": "string", "enum": ["high", "medium", "low"]}, "duplicate_of": {"type": "integer"}}}
@on_event
def handle(event):
if not verify.github(event.body, event.header("X-Hub-Signature-256"), credentials.secret("GITHUB_WEBHOOK_SECRET")):
return {"ignored": "bad signature"}
body = event.json
if event.header("X-GitHub-Event") != "issues" or body["action"] != "opened":
return {"ignored": True}
issue, repo = body["issue"], body["repository"]["full_name"]
open_issues = gh("GET", f"/repos/{repo}/issues", params={"state": "open", "per_page": 50})
others = "\n".join(f"#{i['number']} {i['title']}" for i in open_issues if i["number"] != issue["number"])
t = ai.generate(f"New issue: {issue['title']}\n{(issue.get('body') or '')[:3000]}\n\nOpen issues:\n{others}", json_schema=SCHEMA, max_output_tokens=80,
system="Classify the new issue. Set duplicate_of only if it is clearly the same as an open issue, else 0.").json
gh("POST", f"/repos/{repo}/issues/{issue['number']}/labels", json={"labels": [t["type"], f"priority: {t['priority']}"]})
if t.get("duplicate_of"):
gh("POST", f"/repos/{repo}/issues/{issue['number']}/comments", json={"body": f"This looks like it may be the same as #{t['duplicate_of']}."})
if t["priority"] == "high":
notify.slack(f"High-priority {t['type']}: <{issue['html_url']}|{issue['title']}>", channel="#eng")
return tFAQ
Common questions
Can maintainers change the labels?
How does it spot duplicates?
Which labels does it use?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Turn new errors into GitHub issues with a Slack alert
Each new kind of error opens a GitHub issue with a likely cause, and the team is told in Slack. Repeats of a known error are not filed again.
See how it worksGet an AI first review on every pull request
Each new pull request gets a review comment pointing out likely bugs and risks, and Slack shows a one-line verdict with the link.
See how it worksSummarise documentation changes in Slack
When someone changes the docs in GitHub, Slack gets a short plain-language summary of what changed and why it matters.
See how it worksKeep exploring
Set up “Triage new GitHub issues with AI and flag urgent ones” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.