receiving-code-review
When to use
- A PR has review comments (from bots like Copilot, Greptile, Augment,
or from human reviewers) and the next step is to address them
- Someone pasted review feedback into the conversation and asks you
to "fix it" or "handle it"
- A pair-programming partner gave verbal suggestions about code you
just wrote
- You are tempted to reply "you are absolutely right" before reading
the rest of the comment
Do NOT use when:
- You are writing a review yourself (different discipline)
- The user explicitly asks for blind implementation of a specific change
that is not framed as review feedback
- The feedback is pure style/formatting that a linter should decide
automatically — just run the linter
Goal
Treat review feedback as suggestions to evaluate, not orders to
execute. Separate correct feedback from reviewer confusion. Push back
with technical reasoning when the suggestion is wrong for this
codebase. Never agree performatively.
The Iron Law
NO IMPLEMENTATION UNTIL THE FEEDBACK IS UNDERSTOOD AND VERIFIED.
A "fix" implemented against a misread comment is worse than no fix —
it ships the wrong behavior under the label of "addressed feedback".
Procedure
1. Read the full comment set before touching code
Read every open comment on the PR first. Comments often relate to
each other — fixing comment #3 in isolation can conflict with comment
#5. Group them:
- Blocking — breaks behavior, introduces a bug, security issue
- Important — logic is correct but design / readability issue
- Minor — naming, comment style, formatting the linter missed
- Wrong — reviewer misunderstood the code, or suggestion would
regress another behavior
2. Restate each comment in your own words
For every comment, write (internally or to the user): "The reviewer
is asking me to X because Y."
If you cannot complete that sentence confidently → the comment is
unclear. Ask for clarification before implementing anything. Do
not implement the clear ones first and ask later — they may be linked.
3. Verify each claim against the code
For each comment classified as blocking/important:
- Reproduce the alleged issue locally (run the test, hit the endpoint,
read the actual runtime value — see
systematic-debugging)
- Check what the code actually does, not what the reviewer thinks
it does
- Check whether the suggested fix would break another test or caller
- Check
git blame / history — the current code may be the way it is
for a reason
- Consult memory for prior context. Via
memory-access,
call retrieve(types=["historical-patterns"], keys=<files in the review>, limit=3). A registered historical pattern
may confirm the reviewer's concern (accept). For architectural rationale
("why is the current shape intentional?"), check the ADR index
docs/decisions/INDEX.md — push back
with the cited ADR number.
4. Decide: accept, push back, or escalate
| Situation |
Response |
| Reviewer is right, fix is local, no caller impact |
Implement, reference the comment in the commit message |
| Reviewer is right but fix affects other callers |
Note the downstream effects in the reply, then implement |
| Reviewer is wrong — based on misreading the code |
Reply with evidence (specific line / test / value), do not change code |
| Reviewer suggests a feature the codebase does not use (YAGNI) |
Reply asking whether the feature is actually needed, do not build speculatively |
| Reviewer and user / architecture disagree |
Escalate to the user before implementing either path |
5. Reply in the right place, with the right tone
- For inline PR comments → reply in the thread of that comment,
not as a top-level PR comment
- Quote evidence, not opinion — "line 47 already handles this via
$x->isNull()" beats "I think that's fine"
- No flattery. No "great catch", "absolutely right", "thanks for
noticing". The existing
language-and-tone rule already bans this —
actions are the acknowledgement
- If you were wrong in your earlier pushback, state it factually and
move on. No long apology
6. Implement in priority order, one at a time
- Blocking issues first
- Important issues next
- Minor issues last (or bundle them into a single commit)
- Wrong / YAGNI: no code change, only a reply with reasoning
Run the relevant tests and linters between each group — do not
batch four changes and then run tests once. See
verify-completion-evidence.
Output format
When reporting back to the user after handling review:
- Triage table — comment → classification → decision
- Implemented changes — bullet per change with file + commit ref
- Pushed back — bullet per rejected comment with the evidence
- Outstanding — anything awaiting clarification, with the
specific question
Gotchas
- Bot comments (Copilot, Greptile) are not automatically right.
They frequently flag false positives on patterns the codebase uses
deliberately. Verify like you would a human comment.
- A comment that reads like a question ("should this be X?") is often
a polite way of saying "change it to X". Ask if unclear instead of
guessing the register.
- Resolving a comment in the GitHub UI without an accompanying fix or
reply silently marks it handled — reviewers may not notice the lack
of substance.
- Stacked PRs — a comment on the base PR may already be fixed in the
child PR. Check both before touching code.
- A suggestion that passes review aesthetics but fails the test suite
is still a regression. Run tests even when "the change is trivial".
- Flattery leaks in as "good point" or "thanks". Delete before
sending. The code change itself is the acknowledgement.
Do NOT
- Do NOT reply "you are absolutely right", "great catch", or any
flattery variant — actions acknowledge, words do not
- Do NOT implement a suggestion before verifying it against the code
- Do NOT fix the clear items first and ask about the unclear ones
later when the items are linked
- Do NOT accept a reviewer's suggestion that conflicts with an
explicit architectural decision without raising it
- Do NOT batch multiple unrelated fixes into one commit — reviewers
cannot re-review selectively
- Do NOT mark a comment resolved without either a code change or a
reply with reasoning
Anti-patterns
- Replying "Fixed!" after a commit that does not actually address the
comment (wrong file, missed case)
- Rewriting the comment author's suggestion into your own words
without checking whether the reinterpretation still matches intent
- Implementing the YAGNI-suggested feature "just in case" the reviewer
comes back
- Silent disagreement — ignoring a comment without a reply
When to hand over to another skill / command
Validation checklist
Before considering review handling done:
1---2name: receiving-code-review3description: When processing code review feedback (bot or human) before changing anything — triages, verifies and pushes back with technical reasoning — even when the user just says 'fix the comments'.4---56# receiving-code-review78## When to use910* A PR has review comments (from bots like Copilot, Greptile, Augment,11 or from human reviewers) and the next step is to address them12* Someone pasted review feedback into the conversation and asks you13 to "fix it" or "handle it"14* A pair-programming partner gave verbal suggestions about code you15 just wrote16* You are tempted to reply "you are absolutely right" before reading17 the rest of the comment1819Do NOT use when:2021* You are writing a review yourself (different discipline)22* The user explicitly asks for blind implementation of a specific change23 that is not framed as review feedback24* The feedback is pure style/formatting that a linter should decide25 automatically — just run the linter2627## Goal2829Treat review feedback as **suggestions to evaluate**, not orders to30execute. Separate correct feedback from reviewer confusion. Push back31with technical reasoning when the suggestion is wrong for this32codebase. Never agree performatively.3334## The Iron Law3536```37NO IMPLEMENTATION UNTIL THE FEEDBACK IS UNDERSTOOD AND VERIFIED.38```3940A "fix" implemented against a misread comment is worse than no fix —41it ships the wrong behavior under the label of "addressed feedback".4243## Procedure4445### 1. Read the full comment set before touching code4647Read **every** open comment on the PR first. Comments often relate to48each other — fixing comment #3 in isolation can conflict with comment49#5. Group them:5051* **Blocking** — breaks behavior, introduces a bug, security issue52* **Important** — logic is correct but design / readability issue53* **Minor** — naming, comment style, formatting the linter missed54* **Wrong** — reviewer misunderstood the code, or suggestion would55 regress another behavior5657### 2. Restate each comment in your own words5859For every comment, write (internally or to the user): *"The reviewer60is asking me to X because Y."*6162If you cannot complete that sentence confidently → the comment is63unclear. Ask for clarification **before** implementing anything. Do64not implement the clear ones first and ask later — they may be linked.6566### 3. Verify each claim against the code6768For each comment classified as blocking/important:6970* Reproduce the alleged issue locally (run the test, hit the endpoint,71 read the actual runtime value — see [`systematic-debugging`](../systematic-debugging/SKILL.md))72* Check what the code actually does, not what the reviewer **thinks**73 it does74* Check whether the suggested fix would break another test or caller75* Check `git blame` / history — the current code may be the way it is76 for a reason77* **Consult memory for prior context.** Via78 [`memory-access`](../../../docs/guidelines/agent-infra/memory-access.md),79 call `retrieve(types=["historical-patterns"],80 keys=<files in the review>, limit=3)`. A registered historical pattern81 may confirm the reviewer's concern (accept). For architectural rationale82 ("why is the current shape intentional?"), check the ADR index83 [`docs/decisions/INDEX.md`](../../../docs/decisions/INDEX.md) — push back84 with the cited ADR number.8586### 4. Decide: accept, push back, or escalate8788| Situation | Response |89|---|---|90| Reviewer is right, fix is local, no caller impact | Implement, reference the comment in the commit message |91| Reviewer is right but fix affects other callers | Note the downstream effects in the reply, then implement |92| Reviewer is wrong — based on misreading the code | Reply with evidence (specific line / test / value), do not change code |93| Reviewer suggests a feature the codebase does not use (YAGNI) | Reply asking whether the feature is actually needed, do not build speculatively |94| Reviewer and user / architecture disagree | Escalate to the user before implementing either path |9596### 5. Reply in the right place, with the right tone9798* For inline PR comments → reply **in the thread** of that comment,99 not as a top-level PR comment100* Quote **evidence**, not opinion — "line 47 already handles this via101 `$x->isNull()`" beats "I think that's fine"102* No flattery. No "great catch", "absolutely right", "thanks for103 noticing". The existing `language-and-tone` rule already bans this —104 actions are the acknowledgement105* If you were wrong in your earlier pushback, state it factually and106 move on. No long apology107108### 6. Implement in priority order, one at a time1091101. Blocking issues first1112. Important issues next1123. Minor issues last (or bundle them into a single commit)1134. Wrong / YAGNI: no code change, only a reply with reasoning114115Run the relevant tests and linters **between** each group — do not116batch four changes and then run tests once. See117[`verify-completion-evidence`](../verify-completion-evidence/SKILL.md).118119## Output format120121When reporting back to the user after handling review:1221231. **Triage table** — comment → classification → decision1242. **Implemented changes** — bullet per change with file + commit ref1253. **Pushed back** — bullet per rejected comment with the evidence1264. **Outstanding** — anything awaiting clarification, with the127 specific question128129## Gotchas130131* Bot comments (Copilot, Greptile) are **not** automatically right.132 They frequently flag false positives on patterns the codebase uses133 deliberately. Verify like you would a human comment.134* A comment that reads like a question ("should this be X?") is often135 a polite way of saying "change it to X". Ask if unclear instead of136 guessing the register.137* Resolving a comment in the GitHub UI without an accompanying fix or138 reply silently marks it handled — reviewers may not notice the lack139 of substance.140* Stacked PRs — a comment on the base PR may already be fixed in the141 child PR. Check both before touching code.142* A suggestion that passes review aesthetics but fails the test suite143 is still a regression. Run tests even when "the change is trivial".144* Flattery leaks in as "good point" or "thanks". Delete before145 sending. The code change itself is the acknowledgement.146147## Do NOT148149* Do NOT reply "you are absolutely right", "great catch", or any150 flattery variant — actions acknowledge, words do not151* Do NOT implement a suggestion before verifying it against the code152* Do NOT fix the clear items first and ask about the unclear ones153 later when the items are linked154* Do NOT accept a reviewer's suggestion that conflicts with an155 explicit architectural decision without raising it156* Do NOT batch multiple unrelated fixes into one commit — reviewers157 cannot re-review selectively158* Do NOT mark a comment resolved without either a code change or a159 reply with reasoning160161## Anti-patterns162163* Replying "Fixed!" after a commit that does not actually address the164 comment (wrong file, missed case)165* Rewriting the comment author's suggestion into your own words166 without checking whether the reinterpretation still matches intent167* Implementing the YAGNI-suggested feature "just in case" the reviewer168 comes back169* Silent disagreement — ignoring a comment without a reply170171## When to hand over to another skill / command172173* Executing the fixes across many comments → [`fix-pr-comments`](../../commands/fix-pr-comments.md)174 (handles both bot + human reviewers in one pass)175* Running the full verification gate before pushing replies →176 [`verify-completion-evidence`](../verify-completion-evidence/SKILL.md)177* Writing the commit message that references the review →178 [`conventional-commits-writing`](../conventional-commits-writing/SKILL.md)179* Digging into *why* the reviewer's scenario actually fails →180 [`systematic-debugging`](../systematic-debugging/SKILL.md)181182## Validation checklist183184Before considering review handling done:185186* [ ] Every open comment has been read, classified, and has a decision187* [ ] No comment was implemented without a one-sentence restatement188* [ ] Every implemented fix has been verified by a test or runtime check189* [ ] Every rejected comment has a reply quoting evidence190* [ ] No comment was marked resolved without code change or reply191* [ ] No reply contains flattery192* [ ] Linters and relevant tests pass after the changes