From 4923c56078206304877df8179028916a44d93c36 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 13 Aug 2026 14:09:03 +0000 Subject: [PATCH 1/2] Let the unlabeled-item sweep see pull requests again `triage-unlabeled-items` lists candidates with `issues.listForRepo`, which returns issues and pull requests together. Pull requests are dropped from that response unless the token can read them, and the drop is silent - a shorter list, not an error. Since #275 gave the job its own permissions block with `issues: read` and no `pull-requests` scope, it has been blind to pull requests. This repository currently has no open issues, so the sweep reported "Found 0 open issues and PRs" and triaged nothing, while #277 sat open and unlabeled. Granting `pull-requests: read` restores what the job saw before #275, when it inherited `pull-requests: write` from the workflow level. It stays read-only: the sweep only reads and dispatches, and the label writes happen in the triage jobs it dispatches to. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01RdDrWtq6hWWuDDQDxQx94G --- .github/workflows/reusable-issue-triage.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/reusable-issue-triage.yml b/.github/workflows/reusable-issue-triage.yml index 538b23d..76c5aee 100644 --- a/.github/workflows/reusable-issue-triage.yml +++ b/.github/workflows/reusable-issue-triage.yml @@ -220,6 +220,12 @@ jobs: permissions: actions: write issues: read + # `listForRepo` below returns issues *and* pull requests, but the pull + # requests are filtered out of the response unless the token can read + # them - silently, as an empty list rather than an error. Without this + # the job reports "Found 0 open issues and PRs" in a repository whose + # open items are all pull requests, and triages nothing. + pull-requests: read contents: read steps: - name: Find and dispatch triage for unlabeled items From 78f03679c488a13e5852c462b4606869922e18ac Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 13 Aug 2026 14:22:50 +0000 Subject: [PATCH 2/2] Stop pinning triage to a model Copilot no longer offers Every triage run since the v3 upgrade has failed. With debug logging on, the Copilot CLI's stderr says why: Error: Model "gpt-4.1" from --model flag is not available. `gpt-4.1` is `actions/ai-inference`'s own default for the `model` input, so the workflow inherited it without naming it. The action only passes `--model` when the input is non-empty, and `auto` is the CLI's documented value for letting Copilot choose, so setting it explicitly both fixes the failure and stops a future model retirement from breaking triage again. This also settles the open question about authentication. Run unauthenticated, the CLI fails with "No authentication information found" before it ever validates the model. CI got the model error instead, so the token was accepted: `GITHUB_TOKEN` with `copilot-requests: write` authenticates, the organization policy is enabled, and no PAT is needed. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01RdDrWtq6hWWuDDQDxQx94G --- .github/workflows/reusable-issue-triage.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/reusable-issue-triage.yml b/.github/workflows/reusable-issue-triage.yml index 76c5aee..a942001 100644 --- a/.github/workflows/reusable-issue-triage.yml +++ b/.github/workflows/reusable-issue-triage.yml @@ -84,6 +84,12 @@ jobs: ITEM_BODY: ${{ github.event_name == 'pull_request_target' && github.event.pull_request.body || github.event.issue.body }} ITEM_TYPE: ${{ github.event_name == 'pull_request_target' && 'pull request' || 'issue' }} with: + # `actions/ai-inference` defaults this to `gpt-4.1`, which Copilot no + # longer offers - the CLI rejects it outright and the step fails on + # every run. `auto` lets Copilot pick, so a model being retired + # cannot break triage again. Pin a specific model here only if a + # future prompt needs one, and expect to maintain it when it ages out. + model: auto prompt: | ## Role @@ -368,6 +374,12 @@ jobs: ITEM_BODY: ${{ fromJSON(steps.get-item.outputs.result).body }} ITEM_TYPE: ${{ fromJSON(steps.get-item.outputs.result).type }} with: + # `actions/ai-inference` defaults this to `gpt-4.1`, which Copilot no + # longer offers - the CLI rejects it outright and the step fails on + # every run. `auto` lets Copilot pick, so a model being retired + # cannot break triage again. Pin a specific model here only if a + # future prompt needs one, and expect to maintain it when it ages out. + model: auto prompt: | ## Role