| 1 | name: Close stale issues |
| 2 | |
| 3 | on: |
| 4 | schedule: |
| 5 | - cron: '17 5 * * *' # daily, off-peak |
| 6 | workflow_dispatch: {} |
| 7 | |
| 8 | permissions: |
| 9 | issues: write |
| 10 | pull-requests: write |
| 11 | |
| 12 | jobs: |
| 13 | stale: |
| 14 | runs-on: ubuntu-latest |
| 15 | timeout-minutes: 15 |
| 16 | steps: |
| 17 | # Pinned from actions/stale@v10; update deliberately when refreshing the policy. |
| 18 | - uses: actions/stale@4391f3da665fdf50b6810c1a66712fb9ba21aa93 |
| 19 | with: |
| 20 | days-before-stale: 14 |
| 21 | days-before-close: 7 |
| 22 | # No stale or close messages (founder, 2026-09-22). An empty message |
| 23 | # makes actions/stale label and close without commenting (it checks |
| 24 | # `staleIssueMessage.length === 0` at the pinned SHA). The `stale` |
| 25 | # label is the signal; any reply removes it before the close. |
| 26 | stale-issue-message: '' |
| 27 | close-issue-message: '' |
| 28 | stale-issue-label: 'stale' |
| 29 | only-labels: 'needs-info' |
| 30 | exempt-issue-labels: 'pinned,keep-open,release-blocker,security' |
| 31 | # Don't touch PRs — `actions/stale` defaults can be aggressive |
| 32 | # there. We only want it for `needs-info` issues. |
| 33 | days-before-pr-stale: -1 |
| 34 | days-before-pr-close: -1 |
| 35 | operations-per-run: 60 |
| 36 |