code-review-patterns
Skill30 starsChanged 52 days agoMITView on GitHub
Code review checklist, what to look for, how to give feedback, PR review flow. Use when reviewing a pull request, or when preparing code for review.
In this repository30 other files it gives its agents.
- AGENTS.mdAGENTS.md
- claude/CLAUDE.mdCLAUDE.md
- llms.txtllms.txt
- api-design-patternsSkill
- auth-patternsSkill
- backend-dev-guidelinesSkill
- brainstormingSkill
- deployment-guideSkill
- docker-patternsSkill
- docx-officialSkill
- frontend-designSkill
- github-actionsSkill
- git-workflowSkill
- nestjs-patternsSkill
- nextjs-app-routerSkill
- pdf-officialSkill
- pptx-officialSkill
- prisma-workflowSkill
- prompt-engineeringSkill
- react-best-practicesSkill
- security-checklistSkill
- skill-creatorSkill
- software-architectureSkill
- systematic-debuggingSkill
- tailwind-patternsSkill
- test-driven-developmentSkill
- typescript-patternsSkill
- webapp-testingSkill
- web-design-guidelinesSkill
- xlsx-officialSkill
The file
We split this skill into the rules it gives an agent
8 rules. About 0 are common, 8 are distinctive, and 0 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈8
Distinctive · estimate
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 71
Use prefixes to signal severity:
- Distinctive: line 203
Never write vague comments like "This could be better" — always explain how
- Distinctive: line 204
Never block a PR for style issues that should be caught by the linter
- Distinctive: line 205
Never make the author feel attacked — critique the code, not the person
- Distinctive: line 206
Never approve without reading — a rubber-stamp approval provides false confidence
- Distinctive: line 207
Never let PRs sit unreviewed for more than 24 hours — slow reviews demoralize teams
- Distinctive: line 208
Never request changes without explaining what change is needed
- Distinctive: line 209
Never re-review already-addressed comments — trust the author and move forward
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Code Review Patterns
The Goal of Code Review
Code review is NOT about finding mistakes to win arguments. It is about:
- Correctness — Does the code do what it's supposed to do?
- Safety — Are there security or data integrity risks?
- Clarity — Will the next developer understand this in 6 months?
- Consistency — Does this follow the established patterns in the codebase?
What to Look For — Priority Order
P0 — Block (must fix before merge)
□ Security vulnerability (SQL injection, XSS, auth bypass, hardcoded secrets)
□ Data loss risk (wrong delete scope, missing transaction, no backup)
□ Correctness bug (wrong logic, off-by-one, race condition)
□ Broken tests or test coverage dropped below 80%
□ Deployment risk (migration without rollback, breaking API change)P1 — Should Fix
□ Missing error handling (silent catch, swallowed exception)
□ N+1 query problem
□ Function over 50 lines (extract responsibility)
□ File over 800 lines (extract module)
□ Nesting depth > 4 (use early returns)
□ Missing input validation on public endpoints
□ console.log / debug statements left in
□ TODO comments without tracking issueP2 — Consider Fixing
□ Naming: unclear variable/function names
□ Missing comments on non-obvious logic
□ Magic numbers (use named constants)
□ Duplicate code (extract utility)
□ Missing type annotationsP3 — Optional / Style
□ Formatting inconsistency (should be caught by linter/prettier)
□ Minor naming preferences
□ Ordering of exportsHow to Write Review Comments
Be specific and constructive
# Bad comment
"This is wrong."
# Good comment
"This will fail when `user` is null (e.g., when the token is valid but
the user account was deleted). Consider throwing `UnauthorizedException`
here rather than proceeding: `if (!user) throw new UnauthorizedException()`"Distinguish opinion from requirement
Use prefixes to signal severity:
[BLOCK] — Must fix before merge (security, correctness)
[SHOULD] — Strong recommendation, technical debt if skipped
[NIT] — Minor, only fix if easy — don't hold up the PR
[IDEA] — Thought worth considering, not a request
[QUESTION]— Genuine question, not criticismExamples by category
// [BLOCK] SQL injection risk — user input is directly interpolated
// Change to: db.query('SELECT * FROM users WHERE email = $1', [email])
const result = await db.query(`SELECT * FROM users WHERE email = '${email}'`)
// [SHOULD] Missing await — this returns a Promise<void>, not void.
// The function returns before the email is sent.
emailService.send(user.email, 'Welcome!')
// [NIT] Could simplify with optional chaining:
// return user?.profile?.avatar ?? null
if (user && user.profile && user.profile.avatar) {
return user.profile.avatar
}
return null
// [IDEA] Consider using a discriminated union here instead of nullable
// fields — it makes the state machine explicit at compile time.
// [QUESTION] Is this intentionally public? Seems like an admin-only action.
@Get('all-users')
findAllUsers() { ... }PR Checklist for the Author
Before requesting review:
□ Self-review the diff — read your own code as if reviewing someone else's
□ All tests pass (npm test / pnpm test)
□ No lint errors (npm run lint)
□ Type check passes (npm run type-check)
□ No debug statements or commented-out code
□ PR description explains WHY, not just WHAT
□ Related issues linked
□ Screenshots for UI changes
□ Breaking changes documented
□ Migration scripts tested locallyPR Description Template
## What
[One paragraph: what does this change do?]
## Why
[Why is this change needed? Link to issue if applicable.]
## How
[Brief explanation of the approach taken.]
## Testing
- [ ] Unit tests added/updated
- [ ] Integration tests pass
- [ ] Tested locally against real data
## Screenshots
[For UI changes — before/after]
## Breaking Changes
[List any breaking API changes, DB schema changes, or env var changes]Reviewing Large PRs
For PRs with 500+ lines changed:
1. Read the PR description first — understand the intent
2. Start with tests — they document expected behavior
3. Read the new interfaces/types — they reveal the design
4. Read the service/business logic — the core of the change
5. Read the controllers/handlers — boundary validation
6. Check the migrations last — easy to miss side effectsCommon Code Smells to Flag
The God Object
// Bad: UsersService does everything
class UsersService {
createUser() {}
sendEmail() {}
generateReport() {}
processPayment() {}
updateInventory() {}
}
// Flag it: "This service has too many responsibilities.
// Consider extracting EmailService, ReportService, PaymentService."Boolean Traps
// Bad: what do the booleans mean?
createUser(name, email, true, false, true)
// Flag it: "[SHOULD] These boolean arguments are opaque.
// Consider an options object: createUser(name, email, { isAdmin: true, sendWelcome: false, isVerified: true })"Premature Optimization
// Flag with [IDEA]:
// "This optimization adds complexity. Do we have a measured performance
// problem here? If not, let's keep the simple version and optimize when needed."Approval Criteria
| Finding | Action |
| Any P0 | Block — request changes |
| P1 items | Comment with [SHOULD], can approve with conditions |
| Only P2/P3 | Approve — note as optional suggestions |
| No issues | Approve immediately — don't delay |
Forbidden Patterns
- Never write vague comments like "This could be better" — always explain how
- Never block a PR for style issues that should be caught by the linter
- Never make the author feel attacked — critique the code, not the person
- Never approve without reading — a rubber-stamp approval provides false confidence
- Never let PRs sit unreviewed for more than 24 hours — slow reviews demoralize teams
- Never request changes without explaining what change is needed
- Never re-review already-addressed comments — trust the author and move forward
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

