Invoke the built-in
skill through the Skill tool on the merge request's
changes — fetch the source branch first, then pass the branch or commit range as the
target,
always at effort (
). Never rely on the skill's
sticky last-used level: it carries over from whatever was typed last for unrelated
reasons, and review depth has to be the same on every merge request.
The developer's checkout does not move. The review usually runs from the
developer's own clone, and the built-in reviewer reads the files of the branch it is
given; left to itself it may get them by
of that branch in this very
clone, which leaves the developer on somebody else's branch after the review, and with
uncommitted work either carried across or blocking the switch. So, before invoking it:
sh
git rev-parse HEAD; git branch --show-current; git status --porcelain
wt=$(mktemp -d) && git worktree add --detach "$wt" "<source-branch>" && echo "$wt"
The first line is the record to compare against afterwards. The second puts the source
branch into a worktree of its own; write down the path it prints, because a shell
variable does not survive into the next command. Then pass the target as the range plus
one sentence that names the worktree —
high <target>...<source-branch>; the branch is checked out at <worktree path>, read its files there and do not run git checkout or git switch in the current clone
. The whole argument reaches the reviewer as its review
target, so the sentence is read where it is needed; it is text, not a flag, and nothing
else about the call changes.
When the reviewer returns, run the first line again and compare. If the branch or the
commit moved, switch back to what was recorded (
, or
git checkout --detach <commit>
when there was no branch) and say in the report that the built-in
reviewer moved the checkout and it was restored; if the switch back fails, stop and tell
the developer exactly where the clone stands. Then
git worktree remove "<worktree path>"
, which removes the directory as well. The same applies to
below.
Two rules when using it here:
- Never pass or . Posting belongs to this skill and targets
GitLab; targets GitHub pull requests. And a reviewer does not change code.
- Its findings are raw input, not the review. Every one passes the checklist and
the standard first. A finding that contradicts the standard or the task's stated
scope is dropped or reframed, not forwarded.
When the diff touches authentication, authorization, parsing of untrusted input, file
uploads or secrets, also run the built-in
skill on the branch. Same
two rules; its findings land in the security category. Parsing of untrusted input
means a new parser, deserializer or raw-byte handling — code that decides what the
bytes mean. Adding or changing a standard validation rule on a request, or the usual
coercion of a route parameter, does not count: the framework already decides what the
bytes mean there, and a review that ran the security pass on every
would
run it on every merge request. This is the same line
draws, so the
author's own run and this review reach the same decision on the same diff.
When the merge request implements a Figma mockup, pull the reference through the
official Figma MCP (
, and
for tokens) and compare
the implementation against it. A visual deviation from the mockup is a finding like
any other.
When a built-in reviewer is not there at all, which is the normal state outside
Claude Code, do not skip this step — it is the bug-hunting half of the review. Read the
diff yourself against review-checklist.md at the depth
this step prescribes, and say in the report that the built-in reviewers were unavailable
and the hunt was manual. A review that quietly loses its bug-hunting pass reads exactly
like one that found no bugs.
通过 Skill 工具对合并请求的变更调用内置
skill——先获取 source branch,再将分支或 commit 范围作为审查目标传入,始终使用
强度(
)。绝不能依赖该 skill 黏性的上次使用级别:它会因为上次出于无关原因输入的内容而沿用,而每次 MR 的审查深度必须保持一致。
开发者当前的 checkout 不会移动。 审查通常在开发者自己的 clone 中运行,内置 reviewer 会读取传给它的 branch 文件。如果放任它自行处理,它可能通过在当前 clone 中执行
获取该 branch 的文件,结果是审查后开发者留在别人的 branch 上,而未提交的工作要么被带过去,要么阻碍切换。因此,在调用它之前执行:
sh
git rev-parse HEAD; git branch --show-current; git status --porcelain
wt=$(mktemp -d) && git worktree add --detach "$wt" "<source-branch>" && echo "$wt"
第一行命令是事后用于比较的基准记录。第二行会把 source branch 放入独立的 worktree;记下它打印的路径,因为 shell 变量无法保留到下一条命令中。
然后将目标写为该范围加上一句说明 worktree 位置的话——
high <target>...<source-branch>; the branch is checked out at <worktree path>, read its files there and do not run git checkout or git switch in the current clone
。整个参数会作为审查目标传给 reviewer,因此那句话会在需要时被读到;它是文本,不是 flag,调用方式的其他部分保持不变。
当 reviewer 返回后,再运行一遍第一行命令并进行比较。如果 branch 或 commit 发生了变化,就切回最初记录的 branch(或 commit)(没有 branch 时使用
git checkout --detach <commit>
),并在报告中说明内置 reviewer 移动了 checkout,但现已恢复;如果切回失败,停止操作并准确告知开发者 clone 当前所处的状态。然后执行
git worktree remove "<worktree path>"
,这也会删除对应目录。对下文的
同样适用。
在这里使用它时有两条规则:
- 绝不能传入 或 。 发布评论由本 skill 负责,并且目标是 GitLab; 面向 GitHub pull request。reviewer 不负责修改代码。
- 它的发现只是原始输入,不是审查结果。 每一条发现都必须先通过检查清单和标准的检验。与标准或任务明示范围冲突的发现应丢弃或重新表述,而不是直接转发。
当 diff 涉及身份验证、授权、不可信输入解析、文件上传或 secrets 时,还要对 branch 运行内置
skill。遵守同样的两条规则;其发现归入安全类别。不可信输入解析是指新增 parser、deserializer 或 raw-byte 处理,也就是决定 bytes 含义的代码。对请求新增或修改标准验证规则,或者对 route parameter 进行常规类型强制转换,不属于此列:框架已经决定 bytes 的含义;如果每次审查
都触发安全审查,那么每个 MR 都会触发。这与
划出的界线相同,因此作者自己的执行和本次审查会针对同一 diff 得出相同决定。
当合并请求实现 Figma mockup 时,通过官方 Figma MCP(
,以及使用
获取 tokens)拉取参考内容,并将实现与其比较。与 mockup 的视觉偏差也是一项审查发现,和其他问题一样。
当完全没有内置 reviewer 时——在 Claude Code 之外通常如此——不要跳过此步骤,因为它是审查中用于查找 bug 的另一半。按本步骤规定的深度,自行对照 review-checklist.md 阅读 diff,并在报告中说明内置 reviewers 不可用,排查过程是手动完成的。如果审查悄悄丢失了 bug 排查环节,读起来就会像是根本没有发现问题。