name: Claude Issue Triage on: issues: types: [opened] issue_comment: types: [created] jobs: triage-issue: # This job calls Claude, so it runs on GitHub's egress-firewall runner, which # filters the job's outbound network traffic (allow list: .github/egress-firewall.yaml). runs-on: ubuntu-24.04-firewall timeout-minutes: 10 if: >- github.event_name == 'issues' || (github.event_name == 'issue_comment' && !github.event.issue.pull_request && github.event.comment.user.type != 'Bot') concurrency: group: issue-triage-${{ github.event.issue.number }} cancel-in-progress: true permissions: contents: read issues: write # Required to mint the OIDC token exchanged for a Claude API access token (Workload Identity Federation) id-token: write steps: - name: Checkout repository uses: actions/checkout@v4 - name: Run Claude Code for Issue Triage timeout-minutes: 5 uses: anthropics/claude-code-action@v1 env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_REPO: ${{ github.repository }} CLAUDE_CODE_SCRIPT_CAPS: '{"edit-issue-labels.sh":2}' with: github_token: ${{ secrets.GITHUB_TOKEN }} allowed_non_write_users: "*" prompt: "/triage-issue REPO: ${{ github.repository }} ISSUE_NUMBER: ${{ github.event.issue.number }} EVENT: ${{ github.event_name }}" # Authenticate to the Claude API via Workload Identity Federation # (the workflow's OIDC token is exchanged for a short-lived access # token) instead of a static API key. anthropic_federation_rule_id: ${{ vars.ANTHROPIC_FEDERATION_RULE_ID }} anthropic_organization_id: ${{ vars.ANTHROPIC_ORGANIZATION_ID }} anthropic_service_account_id: ${{ vars.ANTHROPIC_SERVICE_ACCOUNT_ID }} anthropic_workspace_id: ${{ vars.ANTHROPIC_WORKSPACE_ID }} # --permission-mode auto: a tool call that needs permission and is outside the allowed-tools # list in .claude/commands/triage-issue.md runs only if Claude Code's safety review passes # it. Tools in --disallowedTools never run. claude_args: | --permission-mode auto --disallowedTools "WebFetch,WebSearch,Write,Edit,MultiEdit,NotebookEdit" --model claude-opus-4-6