Repository navigation
feat(pr-review): let a caller admit bot senders by numeric id - #734
Conversation
Both review reusables skip every [bot] actor, so a pull request pushed by an automation App is never reviewed. Add an optional input, allowed-bot-sender-ids (comma-separated numeric user ids, default empty). The job gate admits a bot only when the event sender's id is listed, guarded so an empty list never matches an event without a sender, and claude-code-action's allowed_bots gets that sender's login only when the id matched. Draft and fork skips are unchanged; an empty input leaves every existing caller as it was. The job-gate test now evaluates both gates and allowed_bots against listed, unlisted, near-miss, senderless, draft and fork events. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The empty-input guard caught only an exactly empty list. A list with a leading, trailing or doubled comma still contains ',,', which a senderless event formats to, so the gate would admit any bot there. Both the job gate and allowed_bots now also reject such a list and require a sender id. The job-gate test covers senderless events against those lists and a listed sender against each malformed shape. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Claude finished @kyle-sexton's task in 4m 2s —— View job Code review in progress
|
|
Claude finished @kyle-sexton's task in 3m 37s —— View job Security review —
|
|
claude-security-review has reviewed this pull request through 9d152cb; a later push is reviewed from there. |
|
claude-review has reviewed this pull request through 9d152cb; a later push is reviewed from there. |

No related issue: step 1 of Phase 17 in the claude-code-plugins pr-unblock plan (design T20/NEW-6, owner decision B2b); no tracker issue exists for it.
Hold: a human merges this.
No coordination step is owed: the CI/CD Conventions session has ended (owner, 2026-10-11), so the owner alone decides the merge.
Summary
pr-review.ymlandpr-review-security.ymlskip every[bot]actor, so a pull request the automation-lanes App pushes to is never AI-reviewed, and the merge lane then holds it forever. This adds a way for a caller to admit exactly one App by its numeric user id.Branched from main
b3a1d7dc01ae1a2e57dc8cf4ec535fa4e062c8f1, which was still the tip when the branch was cut.Fix
allowed-bot-sender-ids(string, default'', comma-separated numeric ids, no spaces) on both reusables.if:admits a[bot]actor only wheninputs.allowed-bot-sender-idsis non-empty and well formed (no leading, trailing or doubled comma),github.event.sender.idis present, andcontains(format(',{0},', ids), format(',{0},', github.event.sender.id))matches.allowed_botsgets the sender login only on that same guarded match. Draft and fork terms are unchanged.allowed_botson claude-code-action getsgithub.event.sender.loginonly when that id matched, else''.full. After a base merge that touches a PR file, the incremental review already falls back to a full review of the PR's files (pr-review.yml@ab83b01:247-272), so no incremental-scope change is needed. To ship it, cut a minor release under the existing names; this PR cuts no release.With the input empty, the gate and
allowed_botsbehave as before, so existing callers are unchanged.Verification
node --test .github/scripts/*.test.cjs: 312 pass, 0 fail (gate test 18/18, incl. senderless, near-miss ids and malformed lists).node --test .github/actions/report-lane-outcome/*.test.cjs: 21 pass. biome ci clean after 9d152cb.claude-lane-job-gates.test.cjsnow evaluates both job gates andallowed_botsagainst events: no list (bots skipped), human actor (reviewed, no bot allowed), listed sender (admitted, its login only), near-miss ids 22 and 2222 against list111,222(skipped), senderless event with empty input (skipped), listed bot on draft or fork PR (skipped). I checked that the tests can fail on a scratch copy: removing the empty-input guard fails the senderless case, and dropping the comma delimiters fails the near-miss case.actionlinton both files: clean.zizmor --offline: the same 2 mediumartipackedfindings as main (claude-code-action#1236, documented in the header).typosandmarkdownlint-cli2 README.md: clean.grep -c allowed-bot-sender-idsprints 13 for each file; theinputs.allowed-bot-sender-ids != ''per-file zero count prints 0.Related
allowed-bot-sender-idstoallowedInputsfor the release SHA, and the claude-lanes callers pass${{ vars.AUTOMATION_LANES_APP_SENDER_ID }}. Both happen after this merges and is released.🤖 Generated with Claude Code