On a schedule
See which open issues nobody has touched
Every Monday you get the open issues with no updates in 14 days, grouped by team and priority.
- Runs
- On a schedule
- Apps
- Linear
- AI
- Not needed
- Access
- read
Send this to your assistant
Create a ClickRuntime automation: every Monday at 9am, Slack me Linear issues that aren't done or cancelled and haven't been updated in 14 days, grouped by team and priority.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
Open issues age quietly. A medium-priority bug filed in March is still open in June, nobody has commented since, and the engineer who owned it has changed teams. Each team's board looks busy, but a good share of it is dead weight, and the real risks, such as a high-priority issue that was forgotten, are buried among tickets that no longer matter.
Every Monday, ClickRuntime queries Linear for issues that have not been updated for 14 days or more and are not completed or canceled, groups them by team and priority, and posts the list to Slack. Each team sees its own forgotten work at the start of the week, when there is time to deal with it.
Team leads who want a steady habit of backlog hygiene, without a quarterly cleanup project, use it most.
What you get out of it
Forgotten high-priority issues resurface
A high-priority bug that nobody has touched in two weeks is the kind of thing that causes an incident later. Grouping by priority puts those at the top, where the team lead cannot miss them.
Every team sees its own backlog debt
Grouping by team gives each lead a clear list of what belongs to them. Nobody can say the stale tickets belong to someone else, and ownership becomes obvious. Accountability works best when it is specific.
Cleanup happens in small steps
Fifteen minutes on Monday handling the list prevents a pile of hundreds of stale tickets from forming. The work is spread out over weeks instead of becoming a painful project.
Reporters get answers
Closing or commenting on a stale issue lets the person who filed it know what is happening. Customers and colleagues notice when their reports are acknowledged, even if the answer is no.
The backlog shrinks to what matters
Deciding to close or revive each issue leaves a list that reflects real plans. Planning becomes easier when everyone trusts that what is open is worth doing. That is how a roadmap stays believable over time.
How it works
What happens, step by step
Once a week, ClickRuntime looks for open Linear issues that nobody has updated in 14 days or more.
Finished and cancelled issues are left out.
It groups the stale issues by team and priority.
A single message goes to your Slack channel listing each issue, so the team can pick them up or close them.
Before it runs live
- Connect Linear
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
- Run it at a different time, more or less often, or only on weekdays
- Add an AI step, for example to summarize, sort or draft a reply
- 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
from datetime import datetime, timedelta, timezone
from clickruntime import on_trigger, http, credentials, 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_trigger
def run(event):
cutoff = (datetime.now(timezone.utc) - timedelta(days=14)).isoformat()
issues = linear("""query($cutoff: DateTimeOrDuration!) {
issues(first: 250, filter: {updatedAt: {lt: $cutoff}, state: {type: {nin: ["completed", "canceled"]}}}) {
nodes { identifier title url priorityLabel team { name } } } }""", {"cutoff": cutoff})["issues"]["nodes"]
if not issues:
return {"stale": 0}
issues.sort(key=lambda i: (i["team"]["name"], i["priorityLabel"]))
lines = [f"{i['team']['name']} · {i['priorityLabel']} · <{i['url']}|{i['identifier']}> {i['title']}" for i in issues]
notify.slack(f"{len(issues)} issues untouched for 14+ days:\n" + "\n".join(lines), channel="#eng")
return {"stale": len(issues)}FAQ
Common questions
What counts as untouched for 14 days?
Is this the same as the automation that moves stale issues?
Can I post each team's list in its own channel?
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
Move issues that have stalled
Issues left in one status too long are moved back automatically, with a comment, and you get the list.
See how it worksGet warned before an issue breaches its SLA
You hear about issues a few hours before their SLA runs out, once per issue.
See how it worksBack up all your Linear issues weekly
Every week you get a CSV of all your issues as a backup.
See how it worksKeep exploring
Set up “See which open issues nobody has touched” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.