Review Changes
Review code changes in a feature branch and identify issues before merging.
Workflow
1. Determine Review Target
Remote PR: If user provides PR number or URL (e.g., "review PR #123", "review https://github.com/org/repo/pull/123"):
- Checkout the PR:
gh pr checkout <PR_NUMBER>
- Read PR context:
gh pr view <PR_NUMBER> --json title,body,comments
- Use the PR description and comments as additional context for the review
Local Changes: If no PR specified, review current branch against default branch (continue to step 2)
1.5 Load Repository Guidelines
Search for repository-specific coding guidelines. These take precedence over built-in guidelines.
Discovery order (highest to lowest priority):
CLAUDE.md, .claude/CLAUDE.md
CODE_GUIDELINES.md, .github/CODE_GUIDELINES.md, docs/CODE_GUIDELINES.md
STYLE_GUIDE.md, .github/STYLE_GUIDE.md, docs/STYLE_GUIDE.md
CONTRIBUTING.md, .github/CONTRIBUTING.md, docs/CONTRIBUTING.md
Extract review-relevant content (coding standards, error handling, testing, security, naming conventions). Skip non-review content (issue templates, code of conduct). User guidelines take precedence over built-in guidelines and are additive. When reviewing a remote PR, load guidelines from the remote repository.
2. Detect Branches
# Get current branch
git branch --show-current
# Detect default branch (try remote HEAD, fall back to main)
git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@' || echo "main"
3. Get Changed Files
# Assess scope first
git diff --stat <default-branch>...HEAD
# Get full diff
git diff <default-branch>...HEAD
Performance guardrails:
- Skip lock files,
.min.js, .min.css, generated files, compiled output
- If >30 changed files, prioritize source over tests/config; summarize skipped files
- If a single file has >500 lines changed, summarize rather than line-by-line review
- If total diff >3000 lines, select the ~20 most important files and summarize the rest
4. Analyze Changes
Use the diff as the primary input. Apply guidelines holistically across the diff rather than file-by-file. Only read full files when surrounding context is needed to understand a change.
Review process:
- Identify applicable guidelines: repository-specific (from step 1.5), general (below), and language-specific (from reference files)
- Check for critical issues first — report before scanning for minor ones
- For each issue found, record: guideline violated, file and line number, problem description, fix suggestion
- Skip inapplicable guidelines (no database operations → skip Database & Persistence)
5. Check Test Coverage
For each new or modified file containing business logic:
- Check if corresponding test file exists
- If tests exist, verify new code paths have coverage
- Flag missing tests for critical paths
6. Format Output
Present findings grouped by severity, ordered Critical → Major → Minor.
## Branch Review: `feature/xyz` → `main`
**Repository guidelines loaded:**
- `.github/CONTRIBUTING.md` - coding standards, testing requirements
*(These take precedence over built-in rules where they conflict)*
### 🔴 Critical (X issues)
**1. [Brief title]**
- **File**: `path/to/file.ts:42`
- **Problem**: Clear description of what's wrong
- **Fix**: Specific solution
### 🟠 Major (X issues)
**1. [Brief title]** `[repo]`
- **File**: `path/to/file.ts:87`
- **Problem**: Description
- **Fix**: Solution
### 🟡 Minor (X issues)
**1. [Brief title]**
- **File**: `path/to/file.ts:123`
- **Problem**: Description
- **Fix**: Solution
---
**Summary**: X critical, Y major, Z minor issues found.
[Ready to merge / Needs fixes before merge]
If no issues found in a category, omit that section. End with clear merge recommendation. Issues marked [repo] were flagged based on repository-specific guidelines. If no repository guidelines were loaded, omit the "Repository guidelines loaded" section.
Feedback tone: Be constructive — explain why a change is needed. Provide actionable suggestions. Assume positive intent. For approvals, acknowledge the specific value of the contribution.
General Guidelines
These apply to every review regardless of language.
API & Breaking Changes
- Removed or renamed public functions/methods without deprecation period
- Changed function signatures (new required parameters, changed return types)
- Modified response shapes in API endpoints (removed fields, changed types)
- Changed default values that alter existing behavior
- Database schema changes without migration scripts
Authentication & Authorization (Critical)
- Missing auth checks on new endpoints or routes
- Downgraded permissions (admin-only → public)
- Hardcoded credentials or API keys
- JWT/session issues: missing expiry, weak secrets, improper validation
- CORS misconfigurations: overly permissive origins (
* in production)
Database & Persistence
- Missing transactions for multi-step atomic operations
- N+1 query patterns: fetching related data in loops instead of joins/eager loading
- Missing indexes on frequently queried columns
- Unbounded queries:
SELECT * without LIMIT on large tables
- SQL injection: string concatenation in queries instead of parameterized queries
Concurrency (Critical for data corruption)
- Shared mutable state accessed without synchronization
- Missing locks/mutexes when modifying shared resources
- Check-then-act patterns without atomicity (TOCTOU)
- Deadlock potential: acquiring multiple locks in inconsistent order
Async Code
- After any
await, verify assumptions are still valid — state may have changed
- Flag when code returns success without verifying the expected outcome of an async operation
External API Handling
- Missing timeouts on HTTP requests
- No retry logic for transient failures
- Missing circuit breakers for repeatedly failing services
- Not distinguishing between 4xx and 5xx errors
- Missing rate limiting awareness (no backoff on 429)
Edge Cases & Boundaries
- Code assumes arrays/lists are non-empty
- Missing null/undefined checks on optional values
- Off-by-one errors in loops, incorrect range checks
- Type coercion issues leading to unexpected behavior
- Unicode/encoding issues: assuming ASCII, incorrect string length
Defensive Coding
- Using external input (APIs/users) without validation
- Not handling failure cases for operations that can fail
- Array access without verifying index is valid
- Code relying on undocumented behavior or ordering
Input Sanitization (Critical)
- Command injection: unsanitized input in shell commands — use argument arrays, not string interpolation
- Path traversal: user input in file paths escaping intended directories — resolve and validate paths
- XSS: user input rendered as HTML — escape or use safe APIs, validate URL protocols
- Log injection: unsanitized input forging log entries — use structured logging
- SQL injection: string concatenation in queries — use parameterized queries
Memory & Performance
- Unbounded collections (arrays/maps growing without limits)
- Memory leaks: event listeners not removed, closures holding references
- Large allocations in loops that could be reused
- Blocking synchronous I/O or CPU-heavy work on main thread
- Missing pagination: loading entire datasets
File System Operations
- Reading files without verifying they exist
- Writing files without ensuring parent directory exists
- Missing error handling on file operations
Logging & Observability
- Insufficient logging for important operations
- Excessive logging creating noise or performance issues
- Missing correlation IDs for cross-service tracing
- Critical: Logging sensitive data (PII, passwords, tokens)
- New features without observability hooks
Testing Quality
- Tests that don't assert anything meaningful
- Missing edge case coverage (only happy path)
- Flaky tests: race conditions, time dependencies, external dependencies
- Test pollution: shared state, missing cleanup
- Mocking too much: tests don't exercise real code paths
Accessibility
- Missing alt text on images
- Non-semantic HTML (divs for buttons, missing form labels)
- Interactive elements not reachable via keyboard
- Missing ARIA labels on icon-only buttons
- Color-only indicators
Code Style
- Prefer early returns over nested if statements — flat code is easier to read
Error Messages
- Error messages must be actionable, contextual, and specific
- Include identifiers (order IDs, user IDs) for debugging
- Don't expose stack traces or internal details to end users
- Include error codes for programmatic handling
Language-Specific Guidelines
Based on file extensions in the diff, load the relevant reference:
.ts, .js, .mjs, .cjs → Read references/typescript.md
.tsx, .jsx → Read references/react.md (also load typescript.md)
.py → Read references/python.md
.go → Read references/go.md
.rs → Read references/rust.md
.java, .kt → Read references/java-kotlin.md
Only load references for languages present in the changed files.
Severity Definitions
- Critical — Block the merge. Broken code, security vulnerabilities, data leaks, runtime failures that will crash production.
- Major — Should fix. Unhandled async, missing error handling, resource leaks, race conditions, missing validation.
- Minor — Nice to fix. Code clarity, consistency, performance, dead code, duplication, unresolved TODOs.
Converted and distributed by TomeVault — claim your Tome and manage your conversions.
1---2name: review-changes-23description: Review code changes in a feature branch before merging. Use when asked to review a branch, review changes, check a PR, or audit code before merge. Compares the current branch against the default branch (main/master) and categorizes issues by severity (Critical, Major, Minor) with actionable solutions. Use when this capability is needed.4---56# Review Changes78Review code changes in a feature branch and identify issues before merging.910## Workflow1112### 1. Determine Review Target1314- **Remote PR**: If user provides PR number or URL (e.g., "review PR #123", "review https://github.com/org/repo/pull/123"):15 1. Checkout the PR: `gh pr checkout <PR_NUMBER>`16 2. Read PR context: `gh pr view <PR_NUMBER> --json title,body,comments`17 3. Use the PR description and comments as additional context for the review1819- **Local Changes**: If no PR specified, review current branch against default branch (continue to step 2)2021### 1.5 Load Repository Guidelines2223Search for repository-specific coding guidelines. These take precedence over built-in guidelines.2425**Discovery order** (highest to lowest priority):261. `CLAUDE.md`, `.claude/CLAUDE.md`272. `CODE_GUIDELINES.md`, `.github/CODE_GUIDELINES.md`, `docs/CODE_GUIDELINES.md`283. `STYLE_GUIDE.md`, `.github/STYLE_GUIDE.md`, `docs/STYLE_GUIDE.md`294. `CONTRIBUTING.md`, `.github/CONTRIBUTING.md`, `docs/CONTRIBUTING.md`3031Extract review-relevant content (coding standards, error handling, testing, security, naming conventions). Skip non-review content (issue templates, code of conduct). User guidelines take precedence over built-in guidelines and are additive. When reviewing a remote PR, load guidelines from the remote repository.3233### 2. Detect Branches3435```bash36# Get current branch37git branch --show-current3839# Detect default branch (try remote HEAD, fall back to main)40git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@' || echo "main"41```4243### 3. Get Changed Files4445```bash46# Assess scope first47git diff --stat <default-branch>...HEAD4849# Get full diff50git diff <default-branch>...HEAD51```5253**Performance guardrails:**541. Skip lock files, `.min.js`, `.min.css`, generated files, compiled output552. If >30 changed files, prioritize source over tests/config; summarize skipped files563. If a single file has >500 lines changed, summarize rather than line-by-line review574. If total diff >3000 lines, select the ~20 most important files and summarize the rest5859### 4. Analyze Changes6061Use the diff as the primary input. Apply guidelines holistically across the diff rather than file-by-file. Only read full files when surrounding context is needed to understand a change.6263**Review process:**641. Identify applicable guidelines: repository-specific (from step 1.5), general (below), and language-specific (from reference files)652. Check for critical issues first — report before scanning for minor ones663. For each issue found, record: guideline violated, file and line number, problem description, fix suggestion674. Skip inapplicable guidelines (no database operations → skip Database & Persistence)6869### 5. Check Test Coverage7071For each new or modified file containing business logic:72- Check if corresponding test file exists73- If tests exist, verify new code paths have coverage74- Flag missing tests for critical paths7576### 6. Format Output7778Present findings grouped by severity, ordered Critical → Major → Minor.7980```81## Branch Review: `feature/xyz` → `main`8283**Repository guidelines loaded:**84- `.github/CONTRIBUTING.md` - coding standards, testing requirements8586*(These take precedence over built-in rules where they conflict)*8788### 🔴 Critical (X issues)8990**1. [Brief title]**91- **File**: `path/to/file.ts:42`92- **Problem**: Clear description of what's wrong93- **Fix**: Specific solution9495### 🟠 Major (X issues)9697**1. [Brief title]** `[repo]`98- **File**: `path/to/file.ts:87`99- **Problem**: Description100- **Fix**: Solution101102### 🟡 Minor (X issues)103104**1. [Brief title]**105- **File**: `path/to/file.ts:123`106- **Problem**: Description107- **Fix**: Solution108109---110**Summary**: X critical, Y major, Z minor issues found.111[Ready to merge / Needs fixes before merge]112```113114If no issues found in a category, omit that section. End with clear merge recommendation. Issues marked `[repo]` were flagged based on repository-specific guidelines. If no repository guidelines were loaded, omit the "Repository guidelines loaded" section.115116**Feedback tone:** Be constructive — explain *why* a change is needed. Provide actionable suggestions. Assume positive intent. For approvals, acknowledge the specific value of the contribution.117118---119120## General Guidelines121122These apply to every review regardless of language.123124#### API & Breaking Changes125126- Removed or renamed public functions/methods without deprecation period127- Changed function signatures (new required parameters, changed return types)128- Modified response shapes in API endpoints (removed fields, changed types)129- Changed default values that alter existing behavior130- Database schema changes without migration scripts131132#### Authentication & Authorization (Critical)133134- Missing auth checks on new endpoints or routes135- Downgraded permissions (admin-only → public)136- Hardcoded credentials or API keys137- JWT/session issues: missing expiry, weak secrets, improper validation138- CORS misconfigurations: overly permissive origins (`*` in production)139140#### Database & Persistence141142- Missing transactions for multi-step atomic operations143- N+1 query patterns: fetching related data in loops instead of joins/eager loading144- Missing indexes on frequently queried columns145- Unbounded queries: `SELECT *` without `LIMIT` on large tables146- SQL injection: string concatenation in queries instead of parameterized queries147148#### Concurrency (Critical for data corruption)149150- Shared mutable state accessed without synchronization151- Missing locks/mutexes when modifying shared resources152- Check-then-act patterns without atomicity (TOCTOU)153- Deadlock potential: acquiring multiple locks in inconsistent order154155#### Async Code156157- After any `await`, verify assumptions are still valid — state may have changed158- Flag when code returns success without verifying the expected outcome of an async operation159160#### External API Handling161162- Missing timeouts on HTTP requests163- No retry logic for transient failures164- Missing circuit breakers for repeatedly failing services165- Not distinguishing between 4xx and 5xx errors166- Missing rate limiting awareness (no backoff on 429)167168#### Edge Cases & Boundaries169170- Code assumes arrays/lists are non-empty171- Missing null/undefined checks on optional values172- Off-by-one errors in loops, incorrect range checks173- Type coercion issues leading to unexpected behavior174- Unicode/encoding issues: assuming ASCII, incorrect string length175176#### Defensive Coding177178- Using external input (APIs/users) without validation179- Not handling failure cases for operations that can fail180- Array access without verifying index is valid181- Code relying on undocumented behavior or ordering182183#### Input Sanitization (Critical)184185- **Command injection**: unsanitized input in shell commands — use argument arrays, not string interpolation186- **Path traversal**: user input in file paths escaping intended directories — resolve and validate paths187- **XSS**: user input rendered as HTML — escape or use safe APIs, validate URL protocols188- **Log injection**: unsanitized input forging log entries — use structured logging189- **SQL injection**: string concatenation in queries — use parameterized queries190191#### Memory & Performance192193- Unbounded collections (arrays/maps growing without limits)194- Memory leaks: event listeners not removed, closures holding references195- Large allocations in loops that could be reused196- Blocking synchronous I/O or CPU-heavy work on main thread197- Missing pagination: loading entire datasets198199#### File System Operations200201- Reading files without verifying they exist202- Writing files without ensuring parent directory exists203- Missing error handling on file operations204205#### Logging & Observability206207- Insufficient logging for important operations208- Excessive logging creating noise or performance issues209- Missing correlation IDs for cross-service tracing210- **Critical**: Logging sensitive data (PII, passwords, tokens)211- New features without observability hooks212213#### Testing Quality214215- Tests that don't assert anything meaningful216- Missing edge case coverage (only happy path)217- Flaky tests: race conditions, time dependencies, external dependencies218- Test pollution: shared state, missing cleanup219- Mocking too much: tests don't exercise real code paths220221#### Accessibility222223- Missing alt text on images224- Non-semantic HTML (divs for buttons, missing form labels)225- Interactive elements not reachable via keyboard226- Missing ARIA labels on icon-only buttons227- Color-only indicators228229#### Code Style230231- Prefer early returns over nested if statements — flat code is easier to read232233#### Error Messages234235- Error messages must be actionable, contextual, and specific236- Include identifiers (order IDs, user IDs) for debugging237- Don't expose stack traces or internal details to end users238- Include error codes for programmatic handling239240---241242## Language-Specific Guidelines243244Based on file extensions in the diff, load the relevant reference:245246- `.ts`, `.js`, `.mjs`, `.cjs` → Read [references/typescript.md](references/typescript.md)247- `.tsx`, `.jsx` → Read [references/react.md](references/react.md) (also load typescript.md)248- `.py` → Read [references/python.md](references/python.md)249- `.go` → Read [references/go.md](references/go.md)250- `.rs` → Read [references/rust.md](references/rust.md)251- `.java`, `.kt` → Read [references/java-kotlin.md](references/java-kotlin.md)252253Only load references for languages present in the changed files.254255---256257## Severity Definitions258259- **Critical** — Block the merge. Broken code, security vulnerabilities, data leaks, runtime failures that will crash production.260- **Major** — Should fix. Unhandled async, missing error handling, resource leaks, race conditions, missing validation.261- **Minor** — Nice to fix. Code clarity, consistency, performance, dead code, duplication, unresolved TODOs.262263---264> Converted and distributed by [TomeVault](https://tomevault.io/claim/artmann) — claim your Tome and manage your conversions.265<!-- tomevault:4.0:skill_md:2026-04-13 -->