From d661fb49b80411ae216af8fcf59ba3080b7636a7 Mon Sep 17 00:00:00 2001 From: G30 <50341825+silentoplayz@users.noreply.github.com> Date: Mon, 10 Aug 2026 22:45:02 -0400 Subject: [PATCH] ci: relabel bug reports when the title is corrected after opening (#28333) The labeler only listened for issues.opened, so it judged a title exactly once. Reporters who omit the prefix are asked by the triage bot to add one, and the title they then fix is never looked at again, leaving a genuine bug report unlabelled until somebody notices it by hand. It now also runs on issues.edited. Body only edits return immediately, so the extra runs are limited to titles actually changing, and a bug label a maintainer has already removed is not restored: on an edit the issue events are checked for a previous removal first. The opened path is unchanged and makes no additional API call. The title pattern also required a delimiter after the bracket, so the bracketed form the comment advertises, "[Bug] something is broken", never matched unless it happened to be written "[Bug]: something is broken". Both forms match now, while "[bug/perf]" keeps matching and titles that merely mention the word, such as "[UI Bug]" or "fixed a typo", still do not. --- .github/workflows/issue-label.yaml | 36 +++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/.github/workflows/issue-label.yaml b/.github/workflows/issue-label.yaml index 94f0d82ead..a2a343a022 100644 --- a/.github/workflows/issue-label.yaml +++ b/.github/workflows/issue-label.yaml @@ -2,7 +2,7 @@ name: Issue Labeler on: issues: - types: [opened] + types: [opened, edited] permissions: issues: write @@ -22,22 +22,48 @@ jobs: return; } + const isEdit = context.payload.action === 'edited'; + const titleWasEdited = Boolean(context.payload.changes?.title); + + if (isEdit && !titleWasEdited) { + return; + } + const title = issue.title ?? ''; const body = issue.body ?? ''; // Freeform bug reports: "issue: ...", "bug: ...", "fix: ...", "[Bug] ...", "issue/UX: ..." - const bugLikeTitle = /^\s*\[?(bug|issue|fix)\]?\s*[:/\-]/i.test(title); + const bugLikeTitle = /^\s*(\[\s*(bug|issue|fix)\b[^\]]*\]|(bug|issue|fix)\s*[:/\-])/i.test(title); // API/CLI-created issues that reproduce the bug report form structure. // Only headings distinctive to the bug form (both are required fields there) — // generic headings like "Expected Behavior" also appear in freeform feature requests. const bugFormBody = /###\s*(Installation Method|Open WebUI Version)/i.test(body); - if (bugLikeTitle || bugFormBody) { - await github.rest.issues.addLabels({ + if (!bugLikeTitle && !bugFormBody) { + return; + } + + if (isEdit) { + const events = await github.paginate(github.rest.issues.listEvents, { owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, - labels: ['bug'] + per_page: 100 }); + + const bugLabelWasRemoved = events.some( + (event) => event.event === 'unlabeled' && event.label?.name === 'bug' + ); + + if (bugLabelWasRemoved) { + return; + } } + + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issue.number, + labels: ['bug'] + });