Let an agent session request a review with a /review comment - #883
claude[bot] wants to merge 3 commits into
Conversation
Before: the only requester `dispatch-on-comment` accepted besides a human OWNER/MEMBER/COLLABORATOR was `cursor[bot]`. A Claude Code remote/web session acts as `claude[bot]`, and had no working way to ask for a review at all: its pushes carry `sender.type == 'Bot'`, which skips every `review /` job on the automatic `pull_request` path, and a `workflow_dispatch` it issued itself started a run that `claude-code-action` short-circuited at zero cost, because `allowed-bots` admits `github-actions[bot]` and not `claude[bot]`. After: `claude[bot]` is on that job's login allowlist, so such a session posts a `/review` comment and gets a real review. The job's own dispatch runs under `GITHUB_TOKEN`, so it re-enters as `github-actions[bot]` -- the actor `allowed-bots` already admits -- and the sender gate is never consulted, because the run arrives as a `workflow_dispatch`. Neither gate is widened. How: one login added to the existing `fromJSON` allowlist, plus the comment block recording why a direct dispatch is not the alternative it appears to be. Measured on Morrison-Lab/ai-config, 2026-09-18: 4 of 4 dispatches with `triggering_actor: claude[bot]` packed `failure-kind: short-circuit`, `attempts: 1`, `total-cost-usd: 0.0000`, `SELF_MOD: false`; 4 of 4 with `triggering_actor: github-actions[bot]` reviewed normally. A zero-cost short-circuit is also gha#368's signature, so CLAUDE.md now says to read the actor before the failure kind -- retrying reproduces this one. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017qehMo49hC1bfozVnjwdKc
|
@claude reivew |
|
@claude review |
|
👀 Picked up by workflow run #35316929502. Setup runs first; Claude itself responds after that. |
|
👀 Picked up by workflow run #35316925288. Setup runs first; Claude itself responds after that. |
This comment has been minimized.
This comment has been minimized.
`changelog.d/README.md` requires each fragment's contents to be Markdown
bullets, and `antigravity-review/scripts/preflight_check.py`'s
`check_changelog_fragments()` enforces it: the first non-blank line must
start with `- `.
This PR's fragment was written as bare prose, so `antigravity-tests`
failed on `test_preflight_checks_pass`, an integration test that runs the
preflight checker against the real repo tree rather than a fixture:
AssertionError: False is not true
Prepend the bullet marker, indent the continuation lines by two, and add
the PR reference the README asks for. Wording is otherwise unchanged.
All 42 tests in `antigravity-review/tests` pass on this commit.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019uYVSv4N5XreA1QyYeKPtr
|
Stopping Point: Clean stopping point reached — the misspelled — posted by @claude post-step from workflow run 💰 Cost: $0.9904228000000003 |
|
Pushed Cause. Fix. Prepend the bullet marker, indent the continuation lines by two, and add the Verified. Reproduced the failure at Pushed with The remote tip was still Posted by Claude Code (AI agent) --- not written by a human. Generated by Claude Code |
This comment has been minimized.
This comment has been minimized.
…tion `lint-markdown` failed on `check_list_item_splices.mjs`: this repo's house style requires a blank line between wrapped list items, and the new `/review` section's Do/Don't block had none. The measurement in that section also undercounted its own population. There were four `claude[bot]` dispatches, not three -- 35267489584 was missing -- and the `github-actions[bot]` side is now stated as the four runs actually checked rather than as an exhaustive count. Each run is linked, and the deriving query is recorded beside them so the next reader queries rather than recalls. Verified locally against the same base ref CI used (15b202a): `check_list_item_splices.mjs` reports no splices. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017qehMo49hC1bfozVnjwdKc
|
Fixed the
The measurement. The section undercounted its own population. There were four
Disclosure. This push used Posted by Claude Code (AI agent) --- not written by a human. |
|
@claude review |
|
👀 Picked up by workflow run #35375418309. Setup runs first; Claude itself responds after that. |
|
Claude finished review — View run Stopping PointRe-verifying the CI/review-status claims in my prior message before finalizing, since the stop hooks correctly flagged that What I actually confirmed with authoritative instruments:
So, to be precise about what my With that caveat stated explicitly, my review content and diff-correctness verdict from my prior message stand unchanged — the diff itself (login-allowlist addition, CLAUDE.md documentation, changelog fragment) has no bugs, security issues, or CLAUDE.md violations that I found. VerdictReady for merge (code-review assessment of the diff's content; see the CI/review-status caveat above — this is not an independent claim that all merge gates are currently green) Structured Review Data (JSON){
"schema_version": "1.1",
"reviewer": "claude",
"commit_sha": "dd243dc0db6858940f13d77457a7d928238ec1f1",
"verdict": "CLEAN",
"findings": [],
"detailed_assessment": "Traced the dispatch-on-comment if: gate change in .github/workflows/claude-review.yml, verified the GITHUB_TOKEN re-entry mechanism against unchanged surrounding code, confirmed claude[bot] is the real webhook login via the REST API, and cross-checked all eight cited Morrison-Lab/ai-config run IDs and the gha#368 reference; no factual, logic, or security defect found in the diff content.",
"holistic_assessment": "Change is scoped to a single caller-side login allowlist plus documentation, requires no permissions widening or tag slide, and needs no test-fixture updates since no offline suite pins this allowlist; paginated check-runs at the PR head show 71/71 success-or-skipped with none failing, though the review check itself is attached to main's tip rather than the PR head due to this PR's own gha#598 workflow-edit path, so a fresh confirming review pass after this one posts is advisable before relying on require-review at the actual head SHA."
}Stopping Point: Clean stopping point reached — full code review completed and posted with instrument-backed CI/review-status caveats; no further action needed from this task. Reviewed commit: dd243dc |
Requested by Ezra · project thread
Before: the only requester
dispatch-on-commentaccepted besides a human OWNER/MEMBER/COLLABORATOR wascursor[bot].A Claude Code remote/web session acts as
claude[bot], and had no working way to ask for a review at all.Its pushes carry
sender.type == 'Bot', which skips everyreview /job on the automaticpull_requestpath; and aworkflow_dispatchit issued itself started a run thatclaude-code-actionshort-circuited at zero cost, becauseallowed-botsadmitsgithub-actions[bot]and notclaude[bot].After:
claude[bot]is on that job's login allowlist, so such a session posts a/reviewcomment and gets a real review.The job's own dispatch runs under
GITHUB_TOKEN, so it re-enters asgithub-actions[bot]— the actorallowed-botsalready admits — and the sender gate is never consulted, because the run arrives as aworkflow_dispatch.Neither gate is widened, and the requester is still checked by login before anything is dispatched.
How: one login added to the existing
fromJSONallowlist, plus the comment block recording why a direct dispatch is not the alternative it appears to be, and aCLAUDE.mdsection saying the same for a session reading the repo rather than the workflow.Measured on
Morrison-Lab/ai-config, 2026-09-18: 4 of 4 dispatches withtriggering_actor: claude[bot]packedfailure-kind: short-circuit,attempts: 1,total-cost-usd: 0.0000,SELF_MOD: false, with the "Run Claude Code Review" step lasting 35ms; 4 of 4 withtriggering_actor: github-actions[bot]reviewed normally.The run IDs are tabulated in the companion PR, Morrison-Lab/ai-config#3767, which ports this whole job into that repo's caller.
A zero-cost short-circuit is also gha#368's signature, so
CLAUDE.mdnow says to read the actor before the failure kind — retrying reproduces this one exactly, since the discriminator is the actor and not the attempt.This gate lives entirely in the caller, so it takes effect on merge to
mainwithout waiting for a@v2slide.Notes for the reviewer
ALLOW_UNREVIEWED_PUSH=1; the pre-push guard cannot see a verdict from this harness (no-unshipped-commit and no-push-without-self-review deadlock while a review is in flight ai-config#3739). An adversarial review was dispatched over this diff and its findings will be addressed in a follow-up push.mwcgrant, per the request that produced it.🤖 Generated with Claude Code
https://claude.ai/code/session_017qehMo49hC1bfozVnjwdKc
Generated by Claude Code