Code Review
When to Use
- The user shares code (file, snippet, or diff) and asks for feedback
- They paste a pull request or want to know if code is production-ready
- Pre-merge quality gate or bug hunting
- Reviewing architectural decisions in a PR
Context Required
From startup-context: tech stack, product stage, team size. Also need from the user:
- The code or diff to review
- What the code is supposed to do (PR purpose or feature context)
- Any specific concerns (performance, security, correctness)
- Language and framework if not obvious from the code
Workflow
Follow a structured five-step methodology. Each step must be completed before moving to the next.
- Context — Understand and summarize the PR's purpose before any analysis. Recap the intent back to the user in 1-2 sentences. If unclear, ask before proceeding. Never start reviewing without understanding what the code is trying to accomplish.
- Structure — Evaluate architectural decisions and design patterns:
- Does the code belong in the right module/layer?
- Are abstractions appropriate (not too many, not too few)?
- Does this change align with the existing codebase patterns?
- For non-obvious design choices, acknowledge the author's reasoning before proposing alternatives.
- Details — Assess code quality across multiple dimensions:
- Correctness: Logic errors, off-by-one bugs, null/undefined handling, race conditions, edge cases
- Security: OWASP Top 10 baseline — injection, broken auth, data exposure, XSS, access control, misconfig, insecure deserialization, vulnerable components
- Performance: N+1 queries, unnecessary re-renders, O(n^2) on large datasets, missing caching, memory leaks
- Naming and clarity: Do names communicate intent? Are functions focused on a single responsibility?
- Tests — Validate test coverage with equal rigor as code review:
- Are behavioral assertions present (not just implementation testing)?
- Are edge cases and error paths covered?
- Are tests brittle or resilient to refactoring?
- What test cases are missing?
- Feedback — Generate a prioritized, categorized report with specific code examples and concrete improvements. Recognize strong patterns and good decisions explicitly.
Output Format
# Code Review: [Feature/File Name]
## Summary
One-paragraph assessment: what the PR does, whether it is ready to merge, needs minor fixes, or needs rework.
## Findings
### Critical (must fix before merge)
- **[CRT-1] Title** — file:line — description, why it matters, suggested fix with code example
### Major (should fix before merge)
- **[MAJ-1] Title** — file:line — description, why it matters, suggested fix
### Minor (fix when convenient)
- **[MIN-1] Title** — file:line — description, suggestion
### Positive (things done well)
- **[POS-1] Title** — file:line — what was done well and why it matters
## Questions
Clarifying questions about non-obvious design choices before blocking on them.
## Suggested Tests
- Test case 1
- Test case 2
Frameworks & Best Practices
Severity Definitions
| Severity |
Definition |
Action |
| Critical |
Security vulnerability, data loss risk, crash in production, broken core functionality |
Block merge |
| Major |
Significant bug, performance regression, missing error handling on critical path, architectural violation |
Should fix before merge |
| Minor |
Style issue, naming improvement, minor optimization, documentation gap |
Fix when convenient |
| Positive |
Well-written code, good pattern usage, thoughtful error handling |
Acknowledge and reinforce |
Review Principles
- Always ground feedback in specifics. Every finding must reference a file, line, and include a concrete improvement — not just "this could be better."
- Recognize good work explicitly. Call out strong patterns, clean abstractions, and thoughtful error handling. Reviews that only flag problems are demoralizing and incomplete.
- Acknowledge author reasoning. For non-obvious choices, assume the author had a reason. Ask before overriding. Phrase as "I see you chose X — was that because of Y? If so, consider Z as an alternative."
- Do not block on style when automated tooling handles it. Linting and formatting are the job of CI, not reviewers. Focus on logic, architecture, and correctness.
- Treat test review with equal weight. Tests are not an afterthought. Missing tests for critical paths is a major finding, not a minor one.
OWASP Top 10 Quick Checks
- Injection — Are user inputs parameterized? Check SQL, NoSQL, OS command, LDAP
- Broken Auth — Sessions secure? Tokens rotated? Passwords hashed (bcrypt/argon2)?
- Sensitive Data Exposure — Secrets in env vars (not code)? PII encrypted at rest?
- XXE — XML parsing disabled or configured to reject external entities?
- Broken Access Control — Every endpoint checks authorization, not just authentication?
- Misconfiguration — Debug modes off? CORS restrictive? Security headers set?
- XSS — Outputs encoded? No
dangerouslySetInnerHTML / v-html with user data?
- Insecure Deserialization — Serialized objects from untrusted sources validated?
- Vulnerable Components — Dependencies up to date? Any known CVEs?
- Insufficient Logging — Auth failures, access violations, and errors logged?
N+1 Query Detection
- Looping over a collection and making a DB call per item
- ORM lazy loading inside a loop (e.g.,
user.posts in a for user in users loop)
- GraphQL resolvers fetching related data per parent without DataLoader
- Fix: Eager loading, batch queries, or DataLoader pattern
Language-Agnostic Red Flags
- Functions longer than 40 lines or more than 3 levels of nesting
- Boolean params that change behavior (use separate functions)
- Catch blocks that swallow exceptions silently
- Hardcoded values that should be configuration
- Missing input validation on public API boundaries
Related Skills
security-review — chain for a deep-dive security audit when critical security findings surface
architecture-design — chain when code review reveals structural problems that need architectural rethinking
Examples
Example prompt: "Review this Express route handler for creating users."
Good output snippet:
# Code Review: POST /api/users Handler
## Summary
The handler creates users but has a critical SQL injection vulnerability and missing
input validation. Needs fixes before merge. Clean async/await usage is a positive.
## Findings
### Critical
- **[CRT-1] SQL Injection** — routes/users.js:14 — Email interpolated
directly into SQL string. Use parameterized queries:
`db.query('INSERT INTO users (email) VALUES ($1)', [email])`
### Major
- **[MAJ-1] No input validation** — routes/users.js:12 — Email from
`req.body` used with no validation. Add zod/joi schema validation.
- **[MAJ-2] Missing error handling** — routes/users.js:18 — DB errors
propagate as 500 with stack trace. Wrap in try/catch, return generic error.
### Positive
- **[POS-1] Clean async/await** — routes/users.js:11 — Easy to follow,
no callback nesting.
## Questions
- Is there a validation middleware already in the project that should be reused here?
1---2name: code-review3description: When the user asks for a code review, shares code for feedback, or says "review this", "check my code", "what's wrong with this". Also activate when reviewing a pull request or diff.4---5
6# Code Review
7
8## When to Use
9- The user shares code (file, snippet, or diff) and asks for feedback
10- They paste a pull request or want to know if code is production-ready
11- Pre-merge quality gate or bug hunting
12- Reviewing architectural decisions in a PR
13
14## Context Required
15From `startup-context`: tech stack, product stage, team size. Also need from the user:
16- The code or diff to review
17- What the code is supposed to do (PR purpose or feature context)
18- Any specific concerns (performance, security, correctness)
19- Language and framework if not obvious from the code
20
21## Workflow
22Follow a structured five-step methodology. Each step must be completed before moving to the next.
23
241. **Context** — Understand and summarize the PR's purpose before any analysis. Recap the intent back to the user in 1-2 sentences. If unclear, ask before proceeding. Never start reviewing without understanding what the code is trying to accomplish.
252. **Structure** — Evaluate architectural decisions and design patterns:
26 - Does the code belong in the right module/layer?
27 - Are abstractions appropriate (not too many, not too few)?
28 - Does this change align with the existing codebase patterns?
29 - For non-obvious design choices, acknowledge the author's reasoning before proposing alternatives.
303. **Details** — Assess code quality across multiple dimensions:
31 - **Correctness:** Logic errors, off-by-one bugs, null/undefined handling, race conditions, edge cases
32 - **Security:** OWASP Top 10 baseline — injection, broken auth, data exposure, XSS, access control, misconfig, insecure deserialization, vulnerable components
33 - **Performance:** N+1 queries, unnecessary re-renders, O(n^2) on large datasets, missing caching, memory leaks
34 - **Naming and clarity:** Do names communicate intent? Are functions focused on a single responsibility?
354. **Tests** — Validate test coverage with equal rigor as code review:
36 - Are behavioral assertions present (not just implementation testing)?
37 - Are edge cases and error paths covered?
38 - Are tests brittle or resilient to refactoring?
39 - What test cases are missing?
405. **Feedback** — Generate a prioritized, categorized report with specific code examples and concrete improvements. Recognize strong patterns and good decisions explicitly.
41
42## Output Format
43
44```markdown
45# Code Review: [Feature/File Name]
46
47## Summary
48One-paragraph assessment: what the PR does, whether it is ready to merge, needs minor fixes, or needs rework.
49
50## Findings
51
52### Critical (must fix before merge)
53- **[CRT-1] Title** — file:line — description, why it matters, suggested fix with code example
54
55### Major (should fix before merge)
56- **[MAJ-1] Title** — file:line — description, why it matters, suggested fix
57
58### Minor (fix when convenient)
59- **[MIN-1] Title** — file:line — description, suggestion
60
61### Positive (things done well)
62- **[POS-1] Title** — file:line — what was done well and why it matters
63
64## Questions
65Clarifying questions about non-obvious design choices before blocking on them.
66
67## Suggested Tests
68- Test case 1
69- Test case 2
70```
71
72## Frameworks & Best Practices
73
74### Severity Definitions
75| Severity | Definition | Action |
76|----------|-----------|--------|
77| **Critical** | Security vulnerability, data loss risk, crash in production, broken core functionality | Block merge |
78| **Major** | Significant bug, performance regression, missing error handling on critical path, architectural violation | Should fix before merge |
79| **Minor** | Style issue, naming improvement, minor optimization, documentation gap | Fix when convenient |
80| **Positive** | Well-written code, good pattern usage, thoughtful error handling | Acknowledge and reinforce |
81
82### Review Principles
83- **Always ground feedback in specifics.** Every finding must reference a file, line, and include a concrete improvement — not just "this could be better."
84- **Recognize good work explicitly.** Call out strong patterns, clean abstractions, and thoughtful error handling. Reviews that only flag problems are demoralizing and incomplete.
85- **Acknowledge author reasoning.** For non-obvious choices, assume the author had a reason. Ask before overriding. Phrase as "I see you chose X — was that because of Y? If so, consider Z as an alternative."
86- **Do not block on style when automated tooling handles it.** Linting and formatting are the job of CI, not reviewers. Focus on logic, architecture, and correctness.
87- **Treat test review with equal weight.** Tests are not an afterthought. Missing tests for critical paths is a major finding, not a minor one.
88
89### OWASP Top 10 Quick Checks
901. **Injection** — Are user inputs parameterized? Check SQL, NoSQL, OS command, LDAP
912. **Broken Auth** — Sessions secure? Tokens rotated? Passwords hashed (bcrypt/argon2)?
923. **Sensitive Data Exposure** — Secrets in env vars (not code)? PII encrypted at rest?
934. **XXE** — XML parsing disabled or configured to reject external entities?
945. **Broken Access Control** — Every endpoint checks authorization, not just authentication?
956. **Misconfiguration** — Debug modes off? CORS restrictive? Security headers set?
967. **XSS** — Outputs encoded? No `dangerouslySetInnerHTML` / `v-html` with user data?
978. **Insecure Deserialization** — Serialized objects from untrusted sources validated?
989. **Vulnerable Components** — Dependencies up to date? Any known CVEs?
9910. **Insufficient Logging** — Auth failures, access violations, and errors logged?
100
101### N+1 Query Detection
102- Looping over a collection and making a DB call per item
103- ORM lazy loading inside a loop (e.g., `user.posts` in a `for user in users` loop)
104- GraphQL resolvers fetching related data per parent without DataLoader
105- **Fix:** Eager loading, batch queries, or DataLoader pattern
106
107### Language-Agnostic Red Flags
108- Functions longer than 40 lines or more than 3 levels of nesting
109- Boolean params that change behavior (use separate functions)
110- Catch blocks that swallow exceptions silently
111- Hardcoded values that should be configuration
112- Missing input validation on public API boundaries
113
114## Related Skills
115- `security-review` — chain for a deep-dive security audit when critical security findings surface
116- `architecture-design` — chain when code review reveals structural problems that need architectural rethinking
117
118## Examples
119
120**Example prompt:** "Review this Express route handler for creating users."
121
122**Good output snippet:**
123```
124# Code Review: POST /api/users Handler
125
126## Summary
127The handler creates users but has a critical SQL injection vulnerability and missing
128input validation. Needs fixes before merge. Clean async/await usage is a positive.
129
130## Findings
131### Critical
132- **[CRT-1] SQL Injection** — routes/users.js:14 — Email interpolated
133 directly into SQL string. Use parameterized queries:
134 `db.query('INSERT INTO users (email) VALUES ($1)', [email])`
135
136### Major
137- **[MAJ-1] No input validation** — routes/users.js:12 — Email from
138 `req.body` used with no validation. Add zod/joi schema validation.
139- **[MAJ-2] Missing error handling** — routes/users.js:18 — DB errors
140 propagate as 500 with stack trace. Wrap in try/catch, return generic error.
141
142### Positive
143- **[POS-1] Clean async/await** — routes/users.js:11 — Easy to follow,
144 no callback nesting.
145
146## Questions
147- Is there a validation middleware already in the project that should be reused here?
148```