name: Lock closed issues on: issues: types: [closed] pull_request: types: [closed] schedule: - cron: "0 0 * * *" # Run daily at midnight for backlog workflow_dispatch: permissions: issues: write pull-requests: write concurrency: group: lock-threads jobs: # Lock immediately when issue/PR is closed (new issues get comment) lock-on-close: if: github.event_name == 'issues' || github.event_name == 'pull_request' runs-on: ubuntu-latest steps: - name: Lock issue/PR after close uses: actions/github-script@v7 with: script: | const createdAt = new Date(context.payload.issue?.created_at || context.payload.pull_request?.created_at); const cutoffDate = new Date('2026-01-27T00:00:00Z'); const isNew = createdAt >= cutoffDate; const number = context.payload.issue?.number || context.payload.pull_request?.number; const isIssue = !!context.payload.issue; // Add comment only for new issues/PRs if (isNew) { const comment = isIssue ? 'This issue has been automatically locked. Please open a new issue for related bugs and reference this issue if needed.' : 'This pull request has been automatically locked. Please open a new issue for related bugs.'; await github.rest.issues.createComment({ ...context.repo, issue_number: number, body: comment }); } // Lock the issue/PR await github.rest.issues.lock({ ...context.repo, issue_number: number, lock_reason: 'resolved' }); # Scheduled run for backlog (old issues without comment) lock-backlog: if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest steps: - uses: dessant/lock-threads@v6 with: github-token: ${{ github.token }} issue-inactive-days: 1 issue-lock-reason: "resolved" issue-comment: "" pr-inactive-days: 1 pr-lock-reason: "resolved" pr-comment: ""