Code review skill

Review code for actionable defects.

by phuryn · MIT license · GitHub ↗
INSTALL
mkdir -p ~/.claude/skills && curl -sL https://codeload.github.com/phuryn/pm-skills/tar.gz/8607e3b07781 \
  | tar -xz -C ~/.claude/skills --strip-components=3 pm-skills-8607e3b07781/pm-ai-shipping/skills/code-review
Copies only this folder into ~/.claude/skills/code-review, pinned to commit 8607e3b · ✓ run on 25 Sep 2026: all 4 files
Download ZIPOnly this folder · 4 files · 13.9 KB
Code review — PM Skills marketplace: skills, commands, and all 9 plugins at a glance (from the phuryn/pm-skills README)

From the phuryn/pm-skills README — shows the whole collection, not only this skill. · view on GitHub

Files of Code review

Files 4 files
Show the full text254 lines
namedescription
code-reviewReview code for actionable defects. Correctness is the core; performance and security are optional sub-cases of the same engine. Anchors on agreements between participants across a boundary, forces a violating execution, and refutes every candidate before reporting. Use when asked to review changes, find bugs, audit a codebase, or check whether a fix is safe.

Code Review

Purpose

Most review output is noise: a list of things that look wrong, unranked, unrefuted, and impossible to act on. This skill produces the opposite — a small number of findings, each with a required behaviour, a feasible trigger, a concrete contradiction, an observable consequence, and the strongest counterargument already checked.

Its central bet: the defects reviewers miss are rarely visible inside one file. They are disagreements between two participants that each look reasonable alone — a caller and a callee, a producer and a consumer, a writer and a later reader, two branches that should establish the same state. A checklist applied file-by-file cannot see those, because the two halves are never in view at the same time. So the unit of review here is the agreement, not the file.

Structure: one engine, three anchors

Code review is the skill. Correctness is its core — the dimension generic tooling covers worst, and the one described in full below. Performance and security are sub-cases: the same engine, the same refutation discipline, the same report contract, with a different anchor and one or two extra rules each.

Sub-case Anchor Where its rules live
Correctness (core, default) Agreements between participants across a boundary This file + references/correctness-taxonomy.md
Performance Workload → resource demand → growth or contention → consequence references/performance-review.md
Security Source → trust boundary → sink, with an attacker controlling the source references/security-review.md

Read a sub-case's file only when that sub-case is selected. Each is short on purpose: it states what differs, and the rest of this file still applies.

Sub-cases are independently activated, not mutually exclusive. One root cause can carry correctness and security impact — report it once, with both impacts.

Invocation

/pm-ai-shipping:code-review
/pm-ai-shipping:code-review dimensions=correctness scope=changes
/pm-ai-shipping:code-review dimensions=performance,security
/pm-ai-shipping:code-review dimensions=all

Claude Code ships its own bundled /code-review. Use the plugin-qualified form above when you mean this one.

These are instruction arguments, not shell flags.

  • Default: correctness. Bare "review this" or "find bugs" means correctness only.
  • An explicit list selects exactly those sub-cases; all selects three. Never silently reinterpret an unknown or empty selection — ask.
  • Scope: use what was asked. Otherwise review working changes if present, else the repository.
  • State the selected dimensions, the scope and the comparison baseline before investigating.
  • Reviewing changes means following dependencies beyond the changed lines, and distinguishing defects the change introduced from defects it merely revealed.
  • Review and report. Apply fixes only when asked.

Shared engine

Every sub-case uses one skeleton. Only the anchor and the refutation rules differ.

Map a flow → identify an obligation → inspect every participant → construct a violating execution → trace the consequence → attempt refutation → report.

Build one minimal map first: inputs, major execution flows, who owns which state, external dependencies, observable effects. Each selected sub-case enriches it — do not build three maps, and do not make a security-only run wait on correctness mapping.

Correctness: the agreement engine

A boundary is semantic, not a file split. It separates a caller and a callee, two callbacks, two executions of the same function, a producer and a consumer, or a value written now and read later.

For each consequential agreement, hold these in working notes — not in the report:

Participants:
Value, entity or effect exchanged:
Authority (who decides the real answer):
Identity and lifetime/version:
Required relationship:
Evidence for that relationship:
Relevant transitions or orderings:
Observable consumer or consequence:

Establish the obligation without inventing intent. Evidence comes from specifications, documented contracts, language or protocol semantics, tests that encode an expectation, or a necessary producer/consumer relationship. A consumer's implementation alone does not prove the consumer is right. Where participants disagree, say why the disagreement produces a wrong outcome — sometimes the contradiction is certain while which side should change is genuinely open. Missing documentation is a limitation, not automatically a finding.

Start where agreements are most likely to break: values transformed or negotiated, identities reassigned, work becoming asynchronous, state persisted and reloaded, several effects that must agree. Then do a local pass over ordinary decisions, arithmetic, boundaries and error branches — the anchor must not become a filter that discards plain bugs.

Force a violating execution

A suspicion is not a finding until you construct the execution that breaks it. Where the implementation permits:

  • make a requested value differ from the accepted or effective one;
  • keep two operations live at once and vary their completion order;
  • change the relevant identity or generation between observation and use;
  • compare distinct transitions that should end in equivalent state;
  • inject failure between effects, and interruption before completion;
  • exercise empty, exact-boundary and adjacent-boundary inputs.

Establish that each case is actually reachable. Do not assume it.

Two lenses that need a forced probe, not a mention

Across a large evaluation of planted runtime defects in real codebases, two classes were almost never even reported by strong agents — not missed at the fix, missed at the look. Naming them in a checklist will not help; each needs an explicit probe:

  1. Authority reconciliation. Follow a proposed value through validation, normalisation, negotiation or commit, and find downstream state still derived from the proposal where the authority can return something different. A requested value is not an applied value. Probe: force them apart and ask what still reads the request.
  2. Identity and correlation. Trace how an operation's result finds its originating entity, then establish that the key is unique, stable and live for long enough — under overlap, reordering, removal and reuse. A label, a position or arrival order is suspicious exactly when those properties can fail. Probe: run two operations concurrently and complete them out of order.

The full set of thirteen diagnostic lenses, each with a detection tell, is in references/correctness-taxonomy.md. They are overlapping lenses, not a quota to fill.

Refutation: the discipline that makes this worth running

A candidate becomes a finding only with all five:

  1. A supported obligation — what must hold, and on what evidence.
  2. A feasible execution — inputs, state and ordering the real system permits.
  3. A concrete contradiction — where the obligation fails.
  4. An observable consequence — wrong output, state, effect, completion or progress.
  5. An examined counterargument — the strongest mechanism that would prevent or repair it.

Actively hunt for the refutation: an enclosing guarantee that makes the execution impossible; synchronisation excluding the interleaving; reconciliation before any consequential read; an intentional contract; a precondition excluding the input; a different owner responsible for it.

Outcome Rule
Keep Evidence establishes the defect; the counterargument checked does not prevent it.
Drop Cited evidence defeats the execution, the obligation or the consequence.
Unresolved An essential contract or runtime fact is unknown. List it separately from findings.

Do not import the security sub-case's attacker/victim test into correctness. A correctness defect can harm only the person who triggered it and still be serious. Equally, "keep unless disproved" is too permissive here — an ungrounded suspicion with no constructed execution is not a finding. When both sub-cases are active, apply each test only to its own dimension.

Absorption is not prevention. The most expensive refutation mistake is finding something downstream that happens to hide the defect - a cache that usually holds the value, a retry that usually succeeds, a default that is usually right - and dropping the finding. That is not a guarantee, it is a coincidence with good odds, and it fails the day the absorber is cold, evicted or reconfigured. Drop only on a mechanism that makes the execution impossible, and say which mechanism it was. For the same reason, "it works nearly always" describes a race, not a refutation - a timing window that usually resolves correctly is a finding, and the fact that you had to reason about which side usually wins is the evidence.

Passing tests, unfamiliar code, a suspicious name, a missing test and a sibling difference are evidence to investigate — none of them is proof, and none is refutation. Deduplicate by violated agreement and root cause, never by file. There is no findings quota; zero supported findings is a valid result.

Parallelism

Fan out over complete flows or connected groups of agreements — never over files, and never one agent per taxonomy class. Partitioning by file is precisely the split that hides cross-boundary defects, which are the ones worth finding.

  1. The coordinator builds the initial map and identifies shared state.
  2. Each worker gets a bounded flow, its participants, the selected sub-cases and open questions.
  3. Workers inspect both sides of their agreements and may follow dependencies outside their list.
  4. Workers return candidates, cited evidence, completed refutations and unresolved relationships.
  5. The coordinator reconciles assumptions and any relationship that crosses assignments.
  6. Strong candidates get a separate verification pass before they are reported.

Allow overlapping reads. Two workers reading the same authority is far cheaper than either one holding half its contract. Keep integration capacity in reserve: an unresolved relationship spanning two assignments stays unexamined until someone closes it. One level of fan-out is the target; if delegation is unavailable or the scope is small, run the same procedure sequentially.

Run workers on the strongest model available, and match the current session's effort level. This is recall-first work: a missed cross-boundary flow is the costly failure, and a worker that silently drops to a cheaper model or a lower effort is the cheapest way to lose one. If any worker is rerouted or downgraded, say which in the report — a reader who assumes one model saw everything will misjudge the coverage.

One model. Name it on every worker. Fan-out here buys coverage, not a second opinion. Pass the coordinator's own model explicitly on each spawn — "inherit" is not a routing decision, and a worker that quietly lands on a cheaper model is the easiest way to lose a finding. Do not bring in a different model, to review or to cross-check, unless you are explicitly asked: mixing models makes the result unattributable, and when this skill is being measured or compared across models, one foreign worker invalidates the number. The independent second-model pass is a separate, explicitly-invoked step (/ship-check Step 6), never something this skill reaches for on its own.

Tell workers they are reading, not editing. A review worker needs to read, search and navigate; it must not modify the tree. State that in the worker's instructions — a worker that starts editing drifts from reviewing into "helpfully" fixing and stops reporting what it silently repaired, and the findings can no longer be checked against the code they describe. Say it in the prompt rather than assuming the host will enforce it, and confirm the tree is unchanged when the run ends.

Report

Lead with supported findings, ordered by impact. Keep severity separate from evidential strength.

Review scope:
Comparison baseline:
Selected dimensions:

[Severity] [Dimension] Concrete consequence
  Expectation:  required behaviour, and the evidence for it
  Trigger:      feasible preconditions and execution
  Defect:       the violated relationship
  Evidence:     source locations for EVERY participant
  Impact:       observable consequence and affected scope
  Refutation:   strongest counterargument checked, and why it fails
  Remedy:       minimal correction to the violated relationship
  Verification: what was executed, versus established from source

Coverage:
Unexamined areas and essential unknowns:

Cite both participants for a cross-boundary defect, and do not group findings only by file — that hides the relationship the review exists to find.

Coverage means work performed, not boxes ticked. For each selected sub-case report: examined with supported findings · examined, none supported · not applicable, with reason · not examined, with reason. Zero findings in a category does not mean "not covered", and a table of ticks is not evidence of completeness. Say "no supported findings in the examined scope" — never that the code is bug-free.

Notes

  • Say explicitly what is well built. A review that only accuses is easy to dismiss.
  • The two sub-cases have mature commands behind them: /security-audit-static (trust boundaries, sinks, OWASP backstop) and /performance-audit-static (over-fetching, indexes, caching). Run the command when the sub-case is the whole job; use the reference file when it is one dimension of a broader review. This skill does not restate either.
  • For the doc-vs-code axis use the intended-vs-implemented skill.
  • A static review produces code-review findings, not confirmed exploits or measured regressions.
1---
2name: code-review
3description: "Review code for actionable defects. Correctness is the core; performance and security are optional sub-cases of the same engine. Anchors on agreements between participants across a boundary, forces a violating execution, and refutes every candidate before reporting. Use when asked to review changes, find bugs, audit a codebase, or check whether a fix is safe."
4---
5 
6# Code Review
7 
8## Purpose
9 
10Most review output is noise: a list of things that *look* wrong, unranked, unrefuted, and impossible
11to act on. This skill produces the opposite — a small number of findings, each with a required
12behaviour, a feasible trigger, a concrete contradiction, an observable consequence, and the strongest
13counterargument already checked.
14 
15Its central bet: **the defects reviewers miss are rarely visible inside one file.** They are
16disagreements between two participants that each look reasonable alone — a caller and a callee, a
17producer and a consumer, a writer and a later reader, two branches that should establish the same
18state. A checklist applied file-by-file cannot see those, because the two halves are never in view at
19the same time. So the unit of review here is the **agreement**, not the file.
20 
21## Structure: one engine, three anchors
22 
23Code review is the skill. **Correctness is its core** — the dimension generic tooling covers worst,
24and the one described in full below. **Performance and security are sub-cases**: the same engine, the
25same refutation discipline, the same report contract, with a different anchor and one or two extra
26rules each.
27 
28| Sub-case | Anchor | Where its rules live |
29|---|---|---|
30| **Correctness** *(core, default)* | Agreements between participants across a boundary | This file + `references/correctness-taxonomy.md` |
31| **Performance** | Workload → resource demand → growth or contention → consequence | `references/performance-review.md` |
32| **Security** | Source → trust boundary → sink, with an attacker controlling the source | `references/security-review.md` |
33 
34Read a sub-case's file only when that sub-case is selected. Each is short on purpose: it states what
35*differs*, and the rest of this file still applies.
36 
37Sub-cases are independently *activated*, not mutually exclusive. One root cause can carry correctness
38and security impact — report it once, with both impacts.
39 
40## Invocation
41 
42```
43/pm-ai-shipping:code-review
44/pm-ai-shipping:code-review dimensions=correctness scope=changes
45/pm-ai-shipping:code-review dimensions=performance,security
46/pm-ai-shipping:code-review dimensions=all
47```
48 
49Claude Code ships its own bundled `/code-review`. Use the plugin-qualified form above when you mean
50this one.
51 
52These are instruction arguments, not shell flags.
53 
54- **Default: `correctness`.** Bare "review this" or "find bugs" means correctness only.
55- An explicit list selects exactly those sub-cases; `all` selects three. Never silently reinterpret
56 an unknown or empty selection — ask.
57- **Scope:** use what was asked. Otherwise review working changes if present, else the repository.
58- **State the selected dimensions, the scope and the comparison baseline before investigating.**
59- Reviewing changes means following dependencies *beyond* the changed lines, and distinguishing
60 defects the change **introduced** from defects it merely **revealed**.
61- Review and report. Apply fixes only when asked.
62 
63## Shared engine
64 
65Every sub-case uses one skeleton. Only the anchor and the refutation rules differ.
66 
67**Map a flow → identify an obligation → inspect every participant → construct a violating execution
68→ trace the consequence → attempt refutation → report.**
69 
70Build one minimal map first: inputs, major execution flows, who owns which state, external
71dependencies, observable effects. Each selected sub-case enriches it — do not build three maps, and
72do not make a security-only run wait on correctness mapping.
73 
74## Correctness: the agreement engine
75 
76A *boundary* is semantic, not a file split. It separates a caller and a callee, two callbacks, two
77executions of the same function, a producer and a consumer, or a value written now and read later.
78 
79For each consequential agreement, hold these in working notes — not in the report:
80 
81```
82Participants:
83Value, entity or effect exchanged:
84Authority (who decides the real answer):
85Identity and lifetime/version:
86Required relationship:
87Evidence for that relationship:
88Relevant transitions or orderings:
89Observable consumer or consequence:
90```
91 
92**Establish the obligation without inventing intent.** Evidence comes from specifications,
93documented contracts, language or protocol semantics, tests that encode an expectation, or a
94necessary producer/consumer relationship. A consumer's implementation alone does not prove the
95consumer is right. Where participants disagree, say why the disagreement produces a *wrong outcome* —
96sometimes the contradiction is certain while which side should change is genuinely open. Missing
97documentation is a limitation, not automatically a finding.
98 
99**Start where agreements are most likely to break:** values transformed or negotiated, identities
100reassigned, work becoming asynchronous, state persisted and reloaded, several effects that must
101agree. Then do a local pass over ordinary decisions, arithmetic, boundaries and error branches — the
102anchor must not become a filter that discards plain bugs.
103 
104### Force a violating execution
105 
106A suspicion is not a finding until you construct the execution that breaks it. Where the
107implementation permits:
108 
109- make a **requested** value differ from the **accepted or effective** one;
110- keep two operations live at once and vary their completion order;
111- change the relevant identity or generation between observation and use;
112- compare distinct transitions that should end in equivalent state;
113- inject failure between effects, and interruption before completion;
114- exercise empty, exact-boundary and adjacent-boundary inputs.
115 
116Establish that each case is actually reachable. Do not assume it.
117 
118### Two lenses that need a forced probe, not a mention
119 
120Across a large evaluation of planted runtime defects in real codebases, two classes were almost never
121*even reported* by strong agents — not missed at the fix, missed at the look. Naming them in a
122checklist will not help; each needs an explicit probe:
123 
1241. **Authority reconciliation.** Follow a proposed value through validation, normalisation,
125 negotiation or commit, and find downstream state still derived from the **proposal** where the
126 authority can return something different. *A requested value is not an applied value.* Probe:
127 force them apart and ask what still reads the request.
1282. **Identity and correlation.** Trace how an operation's result finds its originating entity, then
129 establish that the key is unique, stable and live for long enough — under overlap, reordering,
130 removal and reuse. A label, a position or arrival order is suspicious exactly when those
131 properties can fail. Probe: run two operations concurrently and complete them out of order.
132 
133The full set of thirteen diagnostic lenses, each with a detection tell, is in
134`references/correctness-taxonomy.md`. They are overlapping lenses, not a quota to fill.
135 
136## Refutation: the discipline that makes this worth running
137 
138A candidate becomes a finding only with all five:
139 
1401. **A supported obligation** — what must hold, and on what evidence.
1412. **A feasible execution** — inputs, state and ordering the real system permits.
1423. **A concrete contradiction** — where the obligation fails.
1434. **An observable consequence** — wrong output, state, effect, completion or progress.
1445. **An examined counterargument** — the strongest mechanism that would prevent or repair it.
145 
146Actively hunt for the refutation: an enclosing guarantee that makes the execution impossible;
147synchronisation excluding the interleaving; reconciliation before any consequential read; an
148intentional contract; a precondition excluding the input; a different owner responsible for it.
149 
150| Outcome | Rule |
151|---|---|
152| **Keep** | Evidence establishes the defect; the counterargument checked does not prevent it. |
153| **Drop** | Cited evidence defeats the execution, the obligation or the consequence. |
154| **Unresolved** | An essential contract or runtime fact is unknown. List it *separately from findings*. |
155 
156Do not import the security sub-case's attacker/victim test into correctness. **A correctness defect
157can harm only the person who triggered it and still be serious.** Equally, "keep unless disproved" is
158too permissive here — an ungrounded suspicion with no constructed execution is not a finding. When
159both sub-cases are active, apply each test only to its own dimension.
160 
161**Absorption is not prevention.** The most expensive refutation mistake is finding something
162downstream that happens to hide the defect - a cache that usually holds the value, a retry that
163usually succeeds, a default that is usually right - and dropping the finding. That is not a
164guarantee, it is a coincidence with good odds, and it fails the day the absorber is cold, evicted or
165reconfigured. Drop only on a mechanism that makes the execution *impossible*, and say which mechanism
166it was. For the same reason, **"it works nearly always" describes a race, not a refutation** - a
167timing window that usually resolves correctly is a finding, and the fact that you had to reason about
168which side usually wins is the evidence.
169 
170Passing tests, unfamiliar code, a suspicious name, a missing test and a sibling difference are
171evidence to investigate — none of them is proof, and none is refutation. Deduplicate by violated
172agreement and root cause, never by file. There is no findings quota; zero supported findings is a
173valid result.
174 
175## Parallelism
176 
177Fan out over **complete flows or connected groups of agreements** — never over files, and never one
178agent per taxonomy class. Partitioning by file is precisely the split that hides cross-boundary
179defects, which are the ones worth finding.
180 
1811. The coordinator builds the initial map and identifies shared state.
1822. Each worker gets a bounded flow, its participants, the selected sub-cases and open questions.
1833. Workers inspect **both sides** of their agreements and may follow dependencies outside their list.
1844. Workers return candidates, cited evidence, completed refutations and unresolved relationships.
1855. The coordinator reconciles assumptions and any relationship that crosses assignments.
1866. Strong candidates get a separate verification pass before they are reported.
187 
188**Allow overlapping reads.** Two workers reading the same authority is far cheaper than either one
189holding half its contract. Keep integration capacity in reserve: an unresolved relationship spanning
190two assignments stays unexamined until someone closes it. One level of fan-out is the target; if
191delegation is unavailable or the scope is small, run the same procedure sequentially.
192 
193**Run workers on the strongest model available, and match the current session's effort level.** This
194is recall-first work: a missed cross-boundary flow is the costly failure, and a worker that silently
195drops to a cheaper model or a lower effort is the cheapest way to lose one. If any worker is rerouted
196or downgraded, say which in the report — a reader who assumes one model saw everything will
197misjudge the coverage.
198 
199**One model. Name it on every worker.** Fan-out here buys coverage, not a second opinion. Pass the
200coordinator's own model explicitly on each spawn — "inherit" is not a routing decision, and a worker
201that quietly lands on a cheaper model is the easiest way to lose a finding. **Do not bring in a
202different model**, to review or to cross-check, unless you are explicitly asked: mixing models makes
203the result unattributable, and when this skill is being measured or compared across models, one
204foreign worker invalidates the number. The independent second-model pass is a separate,
205explicitly-invoked step (`/ship-check` Step 6), never something this skill reaches for on its own.
206 
207**Tell workers they are reading, not editing.** A review worker needs to read, search and navigate;
208it must not modify the tree. State that in the worker's instructions — a worker that starts editing
209drifts from reviewing into "helpfully" fixing and stops reporting what it silently repaired, and the
210findings can no longer be checked against the code they describe. Say it in the prompt rather than
211assuming the host will enforce it, and confirm the tree is unchanged when the run ends.
212 
213## Report
214 
215Lead with supported findings, ordered by impact. Keep severity separate from evidential strength.
216 
217```
218Review scope:
219Comparison baseline:
220Selected dimensions:
221 
222[Severity] [Dimension] Concrete consequence
223 Expectation: required behaviour, and the evidence for it
224 Trigger: feasible preconditions and execution
225 Defect: the violated relationship
226 Evidence: source locations for EVERY participant
227 Impact: observable consequence and affected scope
228 Refutation: strongest counterargument checked, and why it fails
229 Remedy: minimal correction to the violated relationship
230 Verification: what was executed, versus established from source
231 
232Coverage:
233Unexamined areas and essential unknowns:
234```
235 
236Cite **both** participants for a cross-boundary defect, and do not group findings only by file — that
237hides the relationship the review exists to find.
238 
239**Coverage means work performed, not boxes ticked.** For each selected sub-case report: examined with
240supported findings · examined, none supported · not applicable, with reason · not examined, with
241reason. Zero findings in a category does **not** mean "not covered", and a table of ticks is not
242evidence of completeness. Say "no supported findings in the examined scope" — never that the code is
243bug-free.
244 
245## Notes
246 
247- Say explicitly what is well built. A review that only accuses is easy to dismiss.
248- The two sub-cases have mature commands behind them: `/security-audit-static` (trust boundaries,
249 sinks, OWASP backstop) and `/performance-audit-static` (over-fetching, indexes, caching). Run the
250 command when the sub-case is the whole job; use the reference file when it is one dimension of a
251 broader review. This skill does not restate either.
252- For the doc-vs-code axis use the `intended-vs-implemented` skill.
253- A static review produces code-review findings, not confirmed exploits or measured regressions.
254