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---56# Code Review78## When to Use9- The user shares code (file, snippet, or diff) and asks for feedback10- They paste a pull request or want to know if code is production-ready11- Pre-merge quality gate or bug hunting12- Reviewing architectural decisions in a PR1314## Context Required15From `startup-context`: tech stack, product stage, team size. Also need from the user:16- The code or diff to review17- 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 code2021## Workflow22Follow a structured five-step methodology. Each step must be completed before moving to the next.23241. **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 cases32 - **Security:** OWASP Top 10 baseline — injection, broken auth, data exposure, XSS, access control, misconfig, insecure deserialization, vulnerable components33 - **Performance:** N+1 queries, unnecessary re-renders, O(n^2) on large datasets, missing caching, memory leaks34 - **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.4142## Output Format4344```markdown45# Code Review: [Feature/File Name]4647## Summary48One-paragraph assessment: what the PR does, whether it is ready to merge, needs minor fixes, or needs rework.4950## Findings5152### Critical (must fix before merge)53- **[CRT-1] Title** — file:line — description, why it matters, suggested fix with code example5455### Major (should fix before merge)56- **[MAJ-1] Title** — file:line — description, why it matters, suggested fix5758### Minor (fix when convenient)59- **[MIN-1] Title** — file:line — description, suggestion6061### Positive (things done well)62- **[POS-1] Title** — file:line — what was done well and why it matters6364## Questions65Clarifying questions about non-obvious design choices before blocking on them.6667## Suggested Tests68- Test case 169- Test case 270```7172## Frameworks & Best Practices7374### Severity Definitions75| 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 |8182### Review Principles83- **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.8889### OWASP Top 10 Quick Checks901. **Injection** — Are user inputs parameterized? Check SQL, NoSQL, OS command, LDAP912. **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?100101### N+1 Query Detection102- Looping over a collection and making a DB call per item103- 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 DataLoader105- **Fix:** Eager loading, batch queries, or DataLoader pattern106107### Language-Agnostic Red Flags108- Functions longer than 40 lines or more than 3 levels of nesting109- Boolean params that change behavior (use separate functions)110- Catch blocks that swallow exceptions silently111- Hardcoded values that should be configuration112- Missing input validation on public API boundaries113114## Related Skills115- `security-review` — chain for a deep-dive security audit when critical security findings surface116- `architecture-design` — chain when code review reveals structural problems that need architectural rethinking117118## Examples119120**Example prompt:** "Review this Express route handler for creating users."121122**Good output snippet:**123```124# Code Review: POST /api/users Handler125126## Summary127The handler creates users but has a critical SQL injection vulnerability and missing128input validation. Needs fixes before merge. Clean async/await usage is a positive.129130## Findings131### Critical132- **[CRT-1] SQL Injection** — routes/users.js:14 — Email interpolated133 directly into SQL string. Use parameterized queries:134 `db.query('INSERT INTO users (email) VALUES ($1)', [email])`135136### Major137- **[MAJ-1] No input validation** — routes/users.js:12 — Email from138 `req.body` used with no validation. Add zod/joi schema validation.139- **[MAJ-2] Missing error handling** — routes/users.js:18 — DB errors140 propagate as 500 with stack trace. Wrap in try/catch, return generic error.141142### Positive143- **[POS-1] Clean async/await** — routes/users.js:11 — Easy to follow,144 no callback nesting.145146## Questions147- Is there a validation middleware already in the project that should be reused here?148```