Code Review Skill
Systematic code review patterns covering security, performance, accessibility, quality, and testing across languages and frameworks.
Security Review
Critical Checks:
-
Authentication tokens validated; authorization on sensitive ops
-
Session management secure (httpOnly, secure, sameSite)
-
No hardcoded credentials/API keys
-
Proper RBAC implementation
-
JWT tokens with proper algorithms (not 'none')
-
Password hashing: bcrypt/argon2 (not MD5/SHA1)
Input Validation:
-
User inputs sanitized
-
SQL injection prevention (parameterized queries)
-
XSS prevention (escaping/sanitization)
-
CSRF tokens on state-changing ops
-
File upload validation (type, size, content)
-
JSON/XML size limits
-
URL validation for redirects
Data Protection:
-
Sensitive data encrypted at rest
-
TLS/HTTPS for transit
-
No sensitive data in logs
-
PII handling regulation-compliant
-
Secure random (crypto.randomBytes)
-
Secrets in env vars or secret managers
-
Encrypted database connections
OWASP Top 10: No injection, broken auth, data exposure, XXE, broken access control, misconfiguration, XSS, insecure deserialization, vulnerable components, insufficient logging
Performance Review
Database & Queries:
-
N+1 queries identified and fixed
-
Proper indexing on WHERE/JOIN columns
-
Query result sets limited (pagination)
-
Connection pooling implemented
-
Expensive queries cached
-
Batch operations instead of loops
Frontend Performance:
-
Code splitting for large bundles
-
Lazy loading routes/components
-
Images optimized and lazy loaded
-
CSS/JS minified and compressed
-
Memoization for expensive computations
-
Virtual scrolling for long lists
API & Network:
-
API responses paginated
-
GraphQL queries optimized (no over-fetching)
-
Response compression (gzip/brotli)
-
CDN for static assets
-
HTTP/2 or HTTP/3
-
Proper caching headers
-
Rate limiting implemented
Memory Management:
-
Event listeners removed
-
No memory leaks (closures, timers)
-
Large objects disposed
-
File streams closed
-
WeakMap/WeakSet for caching
Accessibility Review (WCAG 2.1 AA)
Semantic HTML:
-
Proper heading hierarchy (h1, h2, h3)
-
Semantic elements (nav, main, article, aside)
-
Form labels properly associated
-
Button vs link used correctly
-
Tables with proper headers
Keyboard Navigation:
-
All interactive elements accessible
-
Logical tab order
-
Focus indicators visible
-
No keyboard traps
-
Skip links for navigation
Screen Reader Support:
-
All images have alt text
-
ARIA labels where needed
-
Live regions for dynamic content
-
Hidden content marked properly
Color & Contrast:
-
Text contrast >= 4.5:1 (normal)
-
Text contrast >= 3:1 (large)
-
Info not conveyed by color alone
Forms:
-
Error messages associated with fields
-
Required fields clearly marked
-
Validation accessible
-
Autocomplete attributes set
Code Quality Standards
Readability:
-
Descriptive variable/function names
-
Functions < 50 lines
-
Consistent naming (camelCase, PascalCase)
-
No magic numbers
-
Proper indentation
Maintainability:
-
DRY principle followed
-
SOLID principles applied
-
Low coupling, high cohesion
-
Proper separation of concerns
-
Configuration externalized
-
Feature flags for gradual rollout
Error Handling:
-
All errors caught and handled
-
User-friendly messages
-
Errors logged with context
-
Graceful degradation
-
Retry logic for transient failures
-
Circuit breakers for external services
Comments:
-
Complex logic explained
-
Why, not what (code self-explanatory)
-
TODO/FIXME with issue tracking
-
JSDoc/TSDoc for public APIs
-
No commented-out code
Testing Requirements
Unit Tests:
-
All business logic tested
-
Edge cases covered
-
Error conditions tested
-
Mocks for external dependencies
-
Test coverage >= 80%
-
Deterministic tests (no flaky)
Integration Tests:
-
API endpoints tested
-
Database operations tested
-
External integrations tested
-
Auth flows tested
E2E Tests:
-
Critical user flows covered
-
Happy paths tested
-
Error scenarios tested
Test Quality:
-
Readable and maintainable
-
AAA pattern (Arrange, Act, Assert)
-
Meaningful descriptions
-
No interdependencies
-
Fast execution (< 10s unit tests)
Language-Specific Patterns
TypeScript/JavaScript
Type Safety:
-
No any types (use unknown if needed)
-
Strict mode enabled
-
Union types over enums
-
Proper generic constraints
-
Type guards for narrowing
Modern Patterns:
-
Destructuring and defaults
-
Optional chaining (?.) and nullish coalescing (??)
-
Async/await over promise chains
-
Arrow functions for callbacks
React Components
Best Practices:
-
Functional components with hooks
-
Props properly typed
-
Minimal, localized state
-
Effect dependencies correct
-
No inline function definitions
-
Keys correct in lists
-
useCallback/useMemo for optimization
Node.js
Server Setup:
-
Error handling middleware
-
Request validation
-
Rate limiting
-
Helmet for security headers
-
CORS configured
-
Graceful shutdown handling
Python
Best Practices:
-
Type hints on functions
-
PEP 8 compliance
-
Context managers for resources
-
List comprehensions over loops
-
Dataclasses for data structures
SQL
Best Practices:
-
Parameterized queries only
-
Indexes on WHERE/JOIN columns
-
LIMIT on large queries
-
Transactions for consistency
-
Specify columns (no SELECT *)
Review Process
File Change Analysis:
-
High risk: auth, migrations, security config, payments, encryption
-
Medium risk: business logic, API, queries, integrations
-
Low risk: UI, tests, docs
Impact Assessment:
-
Blast radius of change
-
Backward compatibility
-
Database migrations needed
-
User impact
-
Performance implications
-
Security implications
Approval Criteria:
-
No critical security issues
-
Tests passing
-
Code coverage maintained/improved
-
Documentation updated
-
No performance regressions
-
Accessibility requirements met
-
Code follows style guide
-
Changes backward compatible (or migration plan exists)
Request Changes for:
-
Critical security vulnerabilities
-
Failing tests
-
Missing test coverage
-
Breaking changes without migration
-
Performance regressions
-
Accessibility violations
Common Issues Reference
Security: Hardcoded secrets, SQL injection, missing auth, weak random generation, PII in logs, missing CSRF
Performance: N+1 queries, missing indexes, unnecessary re-renders, large bundles, sync blocking ops, memory leaks
Code Smells: Functions > 50 lines, nesting > 3 levels, duplication, magic numbers, poor naming, god objects
Missing Error Handling: Unhandled rejections, missing try/catch, no input validation, silent failures, generic messages
Incomplete Tests: Missing edge cases, no error tests, flaky tests, no integration tests, no accessibility tests
Review Workflow
-
Initial Scan (2 min): PR description, file changes, high-risk files
-
Deep Dive (15-30 min): Review each file, apply checklists, note issues
-
Testing Verification (5 min): Check coverage, test quality
-
Documentation Check (3 min): Updated docs, breaking changes
-
Feedback Generation (5 min): Organize by severity, code suggestions
-
Decision (1 min): Approve, request changes, or comment
Tools Integration
Automated Checks:
-
ESLint/Prettier: Code style
-
SonarQube: Quality metrics
-
Snyk/Dependabot: Security vulnerabilities
-
Jest/Vitest: Test coverage
-
Lighthouse: Performance/accessibility
-
TypeScript: Type safety
Manual Review Focus:
-
Business logic correctness
-
Architecture decisions
-
Security implications
-
UX impact
-
Maintainability
Best Practices Summary
-
Security first
-
Performance matters
-
Accessibility is non-negotiable
-
Quality over speed
-
Constructive feedback
-
Continuous improvement