1010 pull_request :
1111 types : [opened, synchronize, ready_for_review]
1212
13+ permissions : {}
14+
1315# Single source of truth for the models. Bumping either is a one-line change.
1416env :
1517 CLAUDE_MODEL : claude-opus-4-8
@@ -155,11 +157,11 @@ jobs:
155157 DATABASE_DRIVER : neon
156158 DATABASE_SSL : ' true'
157159 permissions :
158- contents : write
159- pull-requests : write
160- issues : write
161- actions : read
162- id-token : write
160+ contents : write # Commit and push implementation changes
161+ pull-requests : write # Update pull requests and progress
162+ issues : write # Update issue comments and progress
163+ actions : read # Inspect workflow runs and checks
164+ id-token : write # Authenticate the Claude Code action with OIDC
163165 # Serialize @claude runs on the same issue/PR (incl. reviews — shared group with the
164166 # review job) so back-to-back triggers don't clobber each other.
165167 concurrency :
@@ -172,6 +174,8 @@ jobs:
172174 with :
173175 fetch-depth : 0
174176 token : ${{ secrets.PAT }}
177+ # The implementation agent commits and pushes its changes.
178+ persist-credentials : true
175179
176180 - name : Setup pnpm
177181 uses : pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
@@ -358,9 +362,9 @@ jobs:
358362 DATABASE_SSL : ' true'
359363 permissions :
360364 contents : read
361- pull-requests : write
362- actions : read
363- id-token : write
365+ pull-requests : write # Post pull-request review comments
366+ actions : read # Inspect workflow runs and checks
367+ id-token : write # Authenticate the Claude Code action with OIDC
364368 concurrency :
365369 group : claude-${{ github.event.pull_request.number || github.event.issue.number }}
366370 cancel-in-progress : false
0 commit comments