All loops
Claude CodeMedium 12 min· claude-sonnet-4-5

GitHub issue auto-triage

New issue → labeled, assigned, and linked to similar issues in 8 seconds.

NOT DEPLOYEDNOT DEPLOYED
0144ms
Trigger
POST https://hooks.claudeloops.run/github-issue-triage · event=stripe.customer.subscription.created
02804ms
Agent
claude-sonnet-4-5 · in 904 tok · out 230 tok
03194ms
Tools
github-mcp/openai embeddings:invoke → 200 OK · 224ms
0434ms
Verify
schema check · json-schema draft-2020 passed
0564ms
Output
changelog updated · v1.4.2
0624ms
Notify
audit log written · runbook link attached
SUCCESS
0%
0 runs
P50
0ms
median
P95
0ms
tail
AVG COST
per run
LAST OK
never
LAST FAIL
never
none
Latency · last 30 runs0 samples
no runs yet
Latest output · what your users see
Openacme/web #2124
fix: retry 429s from Anthropic with jitter
4 files+284-14
  • Ran full test suite → 218 passed, 0 failed (12.3s)
  • Coverage delta: +0.4% on `src/lib/*`
  • No breaking changes detected in public API
// press Test to run once · Watch live to keep streaming · Deploy to make it real
The problem

Open-source maintainers drown in untriaged issues. Most are duplicates or belong to the wrong area.

The outcome

Every new issue arrives labeled, with `Possible duplicates: #421, #788` in a comment, and a suggested code owner mentioned.

Ingredients & skills

Secrets
  • ANTHROPIC_API_KEY
  • GITHUB_WEBHOOK_SECRET
  • GITHUB_TOKEN
  • OPENAI_API_KEY
Providers
  • Anthropic
  • GitHub
  • OpenAI embeddings
MCP servers
  • github-mcp
#github#open source#agents

How it works

GitHub webhook fires on `issues.opened`. Claude reads the title and body, picks labels from your existing label set, finds duplicates by embedding similarity, and assigns the right code owner.

Step 1

1 — Issue webhook

Verify the GitHub signature. Reject delivery retries by id.

Step 2

2 — Embed and search duplicates

Maintain a pgvector table of all issue bodies. Compare new body cosine-distance, top 5.

Step 3

3 — Label, assign, comment

Use the GitHub MCP server so the bot doesn't need its own token in code.

typescript
await github.issues.addLabels({ owner, repo, issue_number, labels });
await github.issues.createComment({ owner, repo, issue_number, body: dupNote });
One-line deploy

The button above runs the same command with your saved config. This is the raw CLI form.

bash
gh locker apply issue-triage
https://hooks.claudeloops.run/github-issue-triage

Related loops