Collect every failing signal up front, then review the diff in full anyway:
Signal
How to read it
Merge conflict with base
gh pr view --json mergeable,mergeStateStatus or git merge-tree
Failing CI checks
gh pr checks or the platform equivalent
Lint / typecheck failure
the project's own commands
Each failing signal becomes a blocker finding. None of them ends the run.
A review that aborts on the first red signal spends the whole cycle repeating what
the tracker already displayed, while the finding that would have told the author
something new never gets written. One invocation produces the most complete picture
of the change that it can.
Automated Diff Analysis
Before starting manual review, run the diff analyzer script to get a structured risk assessment:
python3 ${CLAUDE_SKILL_DIR}/scripts/diff-analyzer.py [base_branch]
# Default base branch: main
# Example: python3 ${CLAUDE_SKILL_DIR}/scripts/diff-analyzer.py develop
The script outputs JSON with:
files: each changed file with additions, deletions, category (security/test/config/migration/infra/docs/logic), and risk level
risk_score: overall assessment (high/medium/low)
hotspots: top 5 files by additions
secrets_scan: potential secret leaks detected in added lines
test_coverage_estimate: whether test files accompany logic changes (good/partial/none)
parallel_review_recommended: boolean flag
If the script reports parallel_review_recommended: true, use the Parallel Review (Agent Teams) mode below.
Parallel Review (Agent Teams)
For significant PRs or large changesets, create a parallel review team:
Create an agent team to review [target]:
- Teammate 1 (security-auditor): "Review for security vulnerabilities, auth issues,
injection risks, secret leaks. Report with severity ratings." Use Opus.
- Teammate 2 (performance-optimizer): "Check for N+1 queries, memory leaks,
unnecessary allocations, caching opportunities. Report with impact ratings." Use Opus.
- Teammate 3 (test-engineer): "Validate test coverage, edge cases, mock quality,
missing assertions. Report coverage gaps." Use Opus.
Each reviewer should report findings independently. Do NOT modify files.
After all reviewers complete:
Synthesize findings into unified Code Review Report
Prioritize by severity (blocker > major > minor > nit)
Issue verdict per the verdict rule below — not by impression
When to use: PRs with >5 files changed, cross-module changes, security-sensitive code.
READ-ONLY: No teammate should modify files during review.
Cross-scope replay: can an identifier from one tenant/user/org be replayed in another?
Fails closed wherever the path affects security, money, or data retention
API / Contract Changes
Backward compatibility preserved (no silent breaking changes)
API versioning updated if contract changed
Schema validation on request/response
Client validation uses the authoritative input contract, including operation groups/defaults, finite bounds, nested paths and documented Unicode units; read reference/input-validation.md from the security-patterns skill located through the current client's installed catalog
Shared backend/client fixtures and generation drift checks cover changed rules; unsupported/server-only checks are explicit, and local refusals do not masquerade as HTTP responses
Error responses follow project convention
Statuses and messages distinguish input/state refusals from infrastructure failures; original causes remain available in authorized diagnostics
Error filtering preserves machine codes, field paths, JSON object/list types, locale and recovery headers; background-job error fields are covered too
Retry advice reflects known persisted/provider state and does not invite blind replay of an uncertain mutation
Wire-level contracts checked, not just code signatures: HTTP routes, webhook payloads, event/queue schemas
Concurrency / Async
Shared mutable state protected (locks, atomics, channels)
No fire-and-forget promises without error handling
Database transactions scoped correctly (no long-held locks)
Race condition risk assessed for concurrent access paths
Migrations / Schema Changes
Migration is reversible (has rollback path)
No table locks on large tables during peak hours
Data backfill handles NULL/missing values
Indexes added for new query patterns
Performance
No N+1 queries
Appropriate caching
No memory leaks
Optimized loops
Frontend & UI Craft (Anti-Slop Gates)
No gradient text headlines (background-clip: text) or saturated purple/blue hero washes
No cliché 3-column card grids with icon-above-title tiles, card-in-card nesting, or side-stripe cards
Interactive elements implement all 8 states (default, hover, focus-visible, active, disabled, loading, error, success)
Input fields maintain constant 1px border-width across all states (zero layout shift) and reserve 2px transparent outline
Mobile responsive: overflow-x: clip on html and body; no buttons/links wrapping to 2 lines; image grid tracks use minmax(0, 1fr)
Typography: headings are roman (font-style: normal, no italic emphasis in headers); max 3 font families (2+1 rule)
Content honesty: no invented metrics ("+47% conversion"), fake testimonials, or placeholder stock logos
No fake re-drawn browser/OS chrome; no emoji used as load-bearing icons
Testing
Tests for new code
Edge cases covered
Mocks appropriate
Severity & Verdict
Tier
Meaning
Merge impact
blocker
Causes damage: data loss, security hole, money, corruption
Blocks merge, no exceptions
major
Real defect that will bite in production
Blocks merge unless waived in writing
minor
Should be fixed, not worth blocking on
Does not block
nit
Polish, taste, style
Does not block
Verdict rule — apply it mechanically, do not negotiate with yourself:
any blocker → REQUEST_CHANGES
any major without a documented waiver (who waived it, why, what the follow-up is) → REQUEST_CHANGES
only minor / nit → APPROVE
the change cannot be classified from the diff → NEEDS_DISCUSSION, and state what would resolve it
Severity describes impact, confidence describes certainty — they are independent
axes. A finding with confidence < 6 is reported at the tier its evidence supports
and is never promoted to blocker on suspicion alone.
Output Format
## Code Review Report
### Summary
- **Files Changed**: [count]
- **Lines Added**: [+count]
- **Lines Removed**: [-count]
- **Issues Found**: [count]
- **Overall Confidence**: [1-10] — how confident the reviewer is in the assessment
### Findings
#### Blocker
- **[file:line]**: [issue]
- Severity: blocker | Confidence: [1-10]
- Evidence: [specific code reference and reasoning]
- Suggested fix: [code]
#### Major
- **[file:line]**: [issue]
- Severity: major | Confidence: [1-10]
- Evidence: [specific code reference and reasoning]
- Suggested fix: [code]
#### Minor
- **[file:line]**: [issue]
- Severity: minor | Confidence: [1-10]
- Evidence: [line number + reasoning]
#### Nit
- **[file:line]**: [suggestion]
- Severity: nit | Confidence: [1-10]
### Confidence Guide
| Score | Meaning |
|-------|---------|
| 9-10 | Certain — verified via code, tests, or documentation |
| 7-8 | High — strong evidence, minor assumptions |
| 5-6 | Medium — plausible issue, needs author confirmation |
| 3-4 | Low — speculative, based on patterns not proof |
| 1-2 | Guess — flag for discussion, don't block on this |
### Positive Notes
- [What's good about the code]
### Verdict
[APPROVE / REQUEST_CHANGES / NEEDS_DISCUSSION]
State which clause of the verdict rule produced it, e.g.
"REQUEST_CHANGES — 1 blocker (auth.ts:88)" or
"APPROVE — 2 minor, 1 nit, no blocker or major".
Waived majors must name the waiver and the follow-up.
Common Rationalizations
Excuse
Why It's Wrong
"Small change, quick scan is enough"
Small changes introduce subtle bugs — apply consistent review regardless of size
"Tests pass, so the code is correct"
Tests validate specific scenarios, not all behaviors — verify missing coverage
"It's just a refactor, no need for deep review"
Refactors change invariants — verify behavior preservation, not just compilation
"The author is senior, they know what they're doing"
Seniority doesn't prevent mistakes — review the code, not the person
"We're in a hurry, ship it"
Rushed reviews create tech debt that costs 10x more to fix later
Self-Evaluation (LLM-as-Judge)
After completing the review, perform a self-evaluation pass:
Check for Blind Spots
Did I verify, or assume? — For each finding, confirm you read the actual code (not inferred from context)
Did I miss the inverse? — If you flagged X as a problem, did you check if NOT doing X is also a problem elsewhere?
Did I anchor on the first issue? — Review whether early findings biased you toward similar patterns, missing different issue classes
Did I check the unhappy path? — Error handling, edge cases, failure modes — not just the golden path
Did I flag uncertainty? — Findings with confidence < 6 should be clearly marked as "needs author input"
Calibrate Confidence
If all findings are confidence 7+, you may be overconfident — re-examine the weakest finding
If any finding lacks a file:line reference, downgrade it or remove it
If you found zero issues, state what you specifically checked (not "looks good")
READ-ONLY
This skill only analyzes. It does NOT modify any files.
Related Skills
Issues found? → /debug to trace root causes
Missing tests? → /tdd to add test-first coverage
Security findings? → /cve-scan for dependency vulnerabilities
Architecture concerns? → /analyze for deeper code quality metrics
1---2name: review3description: Reviews code for quality, security, correctness. Triggers: code review, quality review, security review, review PR, review branch.4---56# Code Review78$ARGUMENTS910Reviews code changes for quality and issues.1112## Changed files context1314- Changes: !`git diff --stat main...HEAD 2>/dev/null || git diff --cached --stat 2>/dev/null || echo "no changes detected"`1516## Signal Collection (never stop at the first red)1718Collect every failing signal up front, then review the diff in full **anyway**:1920| Signal | How to read it |21|--------|----------------|22| Merge conflict with base | `gh pr view --json mergeable,mergeStateStatus` or `git merge-tree` |23| Failing CI checks | `gh pr checks` or the platform equivalent |24| Lint / typecheck failure | the project's own commands |2526Each failing signal becomes a `blocker` finding. **None of them ends the run.**2728A review that aborts on the first red signal spends the whole cycle repeating what29the tracker already displayed, while the finding that would have told the author30something new never gets written. One invocation produces the most complete picture31of the change that it can.3233## Automated Diff Analysis3435Before starting manual review, run the diff analyzer script to get a structured risk assessment:3637```bash38python3 ${CLAUDE_SKILL_DIR}/scripts/diff-analyzer.py [base_branch]39# Default base branch: main40# Example: python3 ${CLAUDE_SKILL_DIR}/scripts/diff-analyzer.py develop41```4243The script outputs JSON with:44- **files**: each changed file with additions, deletions, category (security/test/config/migration/infra/docs/logic), and risk level45- **risk_score**: overall assessment (high/medium/low)46- **hotspots**: top 5 files by additions47- **secrets_scan**: potential secret leaks detected in added lines48- **test_coverage_estimate**: whether test files accompany logic changes (good/partial/none)49- **parallel_review_recommended**: boolean flag5051If the script reports `parallel_review_recommended: true`, use the Parallel Review (Agent Teams) mode below.5253---5455## Parallel Review (Agent Teams)5657For significant PRs or large changesets, create a parallel review team:5859```60Create an agent team to review [target]:61- Teammate 1 (security-auditor): "Review for security vulnerabilities, auth issues,62 injection risks, secret leaks. Report with severity ratings." Use Opus.63- Teammate 2 (performance-optimizer): "Check for N+1 queries, memory leaks,64 unnecessary allocations, caching opportunities. Report with impact ratings." Use Opus.65- Teammate 3 (test-engineer): "Validate test coverage, edge cases, mock quality,66 missing assertions. Report coverage gaps." Use Opus.67Each reviewer should report findings independently. Do NOT modify files.68```6970After all reviewers complete:711. Synthesize findings into unified Code Review Report722. Prioritize by severity (blocker > major > minor > nit)733. Issue verdict per the verdict rule below — not by impression7475> **When to use**: PRs with >5 files changed, cross-module changes, security-sensitive code.76> **READ-ONLY**: No teammate should modify files during review.7778---7980## Sequential Review (Default)81821. **Reads** changed files832. **Analyzes** for issues843. **Checks** best practices854. **Reports** findings8687## Review Scope8889| Target | What's Reviewed |90|--------|-----------------|91| (none) | Staged changes |92| `branch` | Branch vs main |93| `pr` | Pull request changes |94| `file.ts` | Specific file |9596## Review Checklist9798### Code Quality99- [ ] Clear naming100- [ ] Proper error handling101- [ ] No code duplication102- [ ] Appropriate abstractions103104### Security (OWASP Top 10)105- [ ] A01: Proper auth/authorization on all endpoints106- [ ] A02: No weak crypto, HTTPS for external comms107- [ ] A03: Input validation, parameterized queries, output encoding (XSS)108- [ ] A04: Threat model assumptions documented for new features109- [ ] A05: No debug mode, default credentials, or verbose errors in prod config110- [ ] A06: Dependencies checked for known CVEs111- [ ] A07: No hardcoded secrets, session management correct112- [ ] A08: Integrity checks on deserialized data, CI/CD pipeline safety113- [ ] A09: Security-relevant events logged (without PII)114- [ ] A10: External URL handling validates scheme/host (SSRF prevention)115- [ ] Cross-scope replay: can an identifier from one tenant/user/org be replayed in another?116- [ ] Fails closed wherever the path affects security, money, or data retention117118### API / Contract Changes119- [ ] Backward compatibility preserved (no silent breaking changes)120- [ ] API versioning updated if contract changed121- [ ] Schema validation on request/response122- [ ] Client validation uses the authoritative input contract, including operation groups/defaults, finite bounds, nested paths and documented Unicode units; read `reference/input-validation.md` from the `security-patterns` skill located through the current client's installed catalog123- [ ] Shared backend/client fixtures and generation drift checks cover changed rules; unsupported/server-only checks are explicit, and local refusals do not masquerade as HTTP responses124- [ ] Error responses follow project convention125- [ ] Statuses and messages distinguish input/state refusals from infrastructure failures; original causes remain available in authorized diagnostics126- [ ] Error filtering preserves machine codes, field paths, JSON object/list types, locale and recovery headers; background-job error fields are covered too127- [ ] Retry advice reflects known persisted/provider state and does not invite blind replay of an uncertain mutation128- [ ] Wire-level contracts checked, not just code signatures: HTTP routes, webhook payloads, event/queue schemas129130### Concurrency / Async131- [ ] Shared mutable state protected (locks, atomics, channels)132- [ ] No fire-and-forget promises without error handling133- [ ] Database transactions scoped correctly (no long-held locks)134- [ ] Race condition risk assessed for concurrent access paths135136### Migrations / Schema Changes137- [ ] Migration is reversible (has rollback path)138- [ ] No table locks on large tables during peak hours139- [ ] Data backfill handles NULL/missing values140- [ ] Indexes added for new query patterns141142### Performance143- [ ] No N+1 queries144- [ ] Appropriate caching145- [ ] No memory leaks146- [ ] Optimized loops147148### Frontend & UI Craft (Anti-Slop Gates)149- [ ] No gradient text headlines (`background-clip: text`) or saturated purple/blue hero washes150- [ ] No cliché 3-column card grids with icon-above-title tiles, card-in-card nesting, or side-stripe cards151- [ ] Interactive elements implement all 8 states (default, hover, focus-visible, active, disabled, loading, error, success)152- [ ] Input fields maintain constant 1px `border-width` across all states (zero layout shift) and reserve 2px transparent outline153- [ ] Mobile responsive: `overflow-x: clip` on `html` and `body`; no buttons/links wrapping to 2 lines; image grid tracks use `minmax(0, 1fr)`154- [ ] Typography: headings are roman (`font-style: normal`, no italic emphasis in headers); max 3 font families (2+1 rule)155- [ ] Content honesty: no invented metrics ("+47% conversion"), fake testimonials, or placeholder stock logos156- [ ] No fake re-drawn browser/OS chrome; no emoji used as load-bearing icons157158### Testing159- [ ] Tests for new code160- [ ] Edge cases covered161- [ ] Mocks appropriate162163## Severity & Verdict164165| Tier | Meaning | Merge impact |166|------|---------|--------------|167| `blocker` | Causes damage: data loss, security hole, money, corruption | Blocks merge, no exceptions |168| `major` | Real defect that will bite in production | Blocks merge unless waived in writing |169| `minor` | Should be fixed, not worth blocking on | Does not block |170| `nit` | Polish, taste, style | Does not block |171172**Verdict rule** — apply it mechanically, do not negotiate with yourself:173174- any `blocker` → `REQUEST_CHANGES`175- any `major` without a documented waiver (who waived it, why, what the follow-up is) → `REQUEST_CHANGES`176- only `minor` / `nit` → `APPROVE`177- the change cannot be classified from the diff → `NEEDS_DISCUSSION`, and state what would resolve it178179Severity describes impact, confidence describes certainty — they are independent180axes. A finding with confidence < 6 is reported at the tier its evidence supports181and is never promoted to `blocker` on suspicion alone.182183## Output Format184185```markdown186## Code Review Report187188### Summary189- **Files Changed**: [count]190- **Lines Added**: [+count]191- **Lines Removed**: [-count]192- **Issues Found**: [count]193- **Overall Confidence**: [1-10] — how confident the reviewer is in the assessment194195### Findings196197#### Blocker198- **[file:line]**: [issue]199 - Severity: blocker | Confidence: [1-10]200 - Evidence: [specific code reference and reasoning]201 - Suggested fix: [code]202203#### Major204- **[file:line]**: [issue]205 - Severity: major | Confidence: [1-10]206 - Evidence: [specific code reference and reasoning]207 - Suggested fix: [code]208209#### Minor210- **[file:line]**: [issue]211 - Severity: minor | Confidence: [1-10]212 - Evidence: [line number + reasoning]213214#### Nit215- **[file:line]**: [suggestion]216 - Severity: nit | Confidence: [1-10]217218### Confidence Guide219220| Score | Meaning |221|-------|---------|222| 9-10 | Certain — verified via code, tests, or documentation |223| 7-8 | High — strong evidence, minor assumptions |224| 5-6 | Medium — plausible issue, needs author confirmation |225| 3-4 | Low — speculative, based on patterns not proof |226| 1-2 | Guess — flag for discussion, don't block on this |227228### Positive Notes229- [What's good about the code]230231### Verdict232[APPROVE / REQUEST_CHANGES / NEEDS_DISCUSSION]233234State which clause of the verdict rule produced it, e.g.235"REQUEST_CHANGES — 1 blocker (auth.ts:88)" or236"APPROVE — 2 minor, 1 nit, no blocker or major".237Waived majors must name the waiver and the follow-up.238```239240## Common Rationalizations241242| Excuse | Why It's Wrong |243|--------|----------------|244| "Small change, quick scan is enough" | Small changes introduce subtle bugs — apply consistent review regardless of size |245| "Tests pass, so the code is correct" | Tests validate specific scenarios, not all behaviors — verify missing coverage |246| "It's just a refactor, no need for deep review" | Refactors change invariants — verify behavior preservation, not just compilation |247| "The author is senior, they know what they're doing" | Seniority doesn't prevent mistakes — review the code, not the person |248| "We're in a hurry, ship it" | Rushed reviews create tech debt that costs 10x more to fix later |249250## Self-Evaluation (LLM-as-Judge)251252After completing the review, perform a self-evaluation pass:253254### Check for Blind Spots2551. **Did I verify, or assume?** — For each finding, confirm you read the actual code (not inferred from context)2562. **Did I miss the inverse?** — If you flagged X as a problem, did you check if NOT doing X is also a problem elsewhere?2573. **Did I anchor on the first issue?** — Review whether early findings biased you toward similar patterns, missing different issue classes2584. **Did I check the unhappy path?** — Error handling, edge cases, failure modes — not just the golden path2595. **Did I flag uncertainty?** — Findings with confidence < 6 should be clearly marked as "needs author input"260261### Calibrate Confidence262- If all findings are confidence 7+, you may be overconfident — re-examine the weakest finding263- If any finding lacks a file:line reference, downgrade it or remove it264- If you found zero issues, state what you specifically checked (not "looks good")265266## READ-ONLY267268This skill only analyzes. It does NOT modify any files.269270## Related Skills271- Issues found? → `/debug` to trace root causes272- Missing tests? → `/tdd` to add test-first coverage273- Security findings? → `/cve-scan` for dependency vulnerabilities274- Architecture concerns? → `/analyze` for deeper code quality metrics
Run npx skillmds@latest add softspark/review in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
Reviews code for quality, security, correctness. Triggers: code review, quality review, security review, review PR, review branch. It is listed under Security on SkillMD.
This skill has not completed SkillMD's automated safety review yet. Capability flags: executes scripts, reads secrets. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
softspark (@softspark) published this skill. Their other Agent Skills are listed on their SkillMD profile.