Code review
A workshop of personal Claude Code skills — design, build, and writing craft
npx -y skills add muzalee/claude-atelier --skill code-reviewAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
3 things to look at
- 12 days oldThe repository was created 12 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Technical code review for correctness, security, tests, error handling, and style. Distinct from design-review (which is visual/aesthetic). Use when user says "review this code", "check my PR", "code review", "check for issues", or after implementing a feature.
SKILL.md
6.1 KB, as published. Nobody here has run it
Review recently changed code for correctness, safety, and clarity. Not a style pass — a technical read that flags what could break, what's missing, and what's over-engineered.
Example prompts
- "Code review the changes on this branch"
- "Review the new backend code"
- "Check my PR before I open it"
- "Look for bugs in what I just wrote"
Scope
Reviews changed code only by default (uncommitted + last-N commits since branch diverged from main). If the user asks for a "full review" of a file or folder, review everything they name — but flag if the review is going to run long and offer to focus on the diff instead.
Process
-
Find the diff. In order of preference:
- Uncommitted changes:
git status --short+git diff+git diff --cached - Branch diff:
git diff <main-or-master>...HEAD - Specific files/folder: whatever the user named
If there are no changes and no target, ask what to review.
- Uncommitted changes:
-
Read the changed files in full (not just the diff hunks). Context matters — a 3-line change in a security-sensitive function needs the whole function.
-
Run the checklist (skip categories that don't apply):
Correctness
- Edge cases: empty input, null, undefined, zero, negative, huge input, unicode
- Off-by-one, boundary conditions
- Async: unhandled promise rejections, missing
await, race conditions - State mutation that leaks across requests / callers
- Wrong return types vs. what callers expect
Security
- User input reaching a sink without validation (SQL, shell, filesystem, HTML)
- Secrets in code, logs, or error messages
- Auth check missing on a protected route
- Authorization: does the caller have permission for this specific resource, not just the endpoint
- Timing attacks on comparisons (passwords, tokens)
- PII in logs
Error handling
- Silent catches (
catch {}orcatch (e) { /* ignore */ }) - Errors that get thrown but never caught upstream
- Fallback values that hide real failures (e.g.
.catch(() => [])) - Missing cleanup on error (open file handles, DB connections, timers)
Tests
- New public behavior with no test
- Tests that assert on implementation detail, not observable behavior
- Mocks of the system under test (should mock only at boundaries)
- Skipped or
.only-marked tests left in
Data & DB
- N+1 queries introduced
- Missing index on a new frequently-queried column
- Migration that isn't reversible / would break on prod data
- Transaction boundaries around multi-step writes
API contract
- Breaking change to a request/response shape without version bump
- New required field on an existing endpoint
- Response shape that leaks internals (DB column names, stack traces)
Clarity
- Function doing more than one thing (>1 reason to change)
- Naming that misleads (e.g.
getUserthat also mutates) - Duplication of logic that already exists elsewhere in the codebase
- Over-abstraction: interfaces / factories for something with one caller
Style consistency
- Matches surrounding code (formatting, patterns, naming)
- Comments follow
keep-it-simple— no comments explaining what the code obviously does
-
Categorize findings by severity. Skip categories with nothing to say.
- 🔴 Must fix — bugs, security issues, breaking changes. Blocks merge.
- 🟡 Should fix — missing tests, unclear code, subtle correctness risk. Address before merge if cheap; note as follow-up if expensive.
- 🟢 Consider — style, minor polish, non-blocking suggestions.
-
For each finding, name:
- File:line
- One-line description of the issue
- Why it matters (one sentence, not a paragraph)
- Suggested fix — either the exact change, or "options: A vs B" if it's a judgment call
Output shape
Short markdown, no template ceremony:
## Code review: <branch or files>
**Scanned**: X files changed, Y lines added, Z removed.
### 🔴 Must fix
- `src/auth/session.ts:42` — session token compared with `===`, allows timing attack. Use `crypto.timingSafeEqual`.
- `src/routes/users.ts:87` — new required `email` field on existing endpoint breaks existing clients.
### 🟡 Should fix
- `src/services/orders.ts:120` — happy-path only test. Add: rejected payment case.
- `src/db/migrations/0042.sql` — index missing on `orders.user_id`; the new query on line 145 will scan.
### 🟢 Consider
- `src/utils/format.ts:15` — duplicates `formatCurrency` already in `src/lib/money.ts`. Reuse?
### What's good
- Error handling in the payment retry logic is careful; timeouts and idempotency keys are correct.
Always include a "What's good" section if there's something worth noting. A review that only lists problems is unbalanced.
Rules
- Facts, not vibes. Every finding cites a file:line. "This feels off" is not a finding — either name the concrete issue or drop it.
- One issue per bullet. If a bullet needs "and," split it.
- Don't rewrite the code. Point at the issue and suggest a direction, don't paste a whole replacement unless the fix is <5 lines.
- Respect the review scope. Don't drift into unrelated files unless a change in scope pulls them in.
- Say when you're not sure. "Might be a race condition — depends on whether X can be called concurrently. Can you confirm?" beats a confident wrong finding.
- Follow
keep-it-simple— the review itself should be terse. No preamble, no summary of what a code review is.
When to stop and ask
- The diff is huge (>500 lines changed across many files). Offer to review in slices.
- The change touches security-critical code (auth, crypto, payments) and the reviewer isn't sure of the invariant. Ask before flagging.
- The user asked for review but the diff is empty. Ask which branch or files.
Gives 1 of the 12 instructions most code review skills give
Counted across 610 of the 674 authors here whose files we hold, read 2026-08-06
- push back with technical reasoning if wrongin 60 of 610, across 24 files
- ask for clarification on unclear itemsin 51 of 610, across 16 files
- fix critical issues immediatelyin 45 of 610, across 29 files
- implement one item at a timein 45 of 610, across 11 files
- group findings by severityhere, and in 44 of 610, across 43 files
- verify feedback against the codebasein 42 of 610, across 8 files
- dispatch a code reviewer subagentin 39 of 610, across 23 files
- fix important issues before proceedingin 37 of 610, across 22 files
- test each fix individuallyin 35 of 610, across 7 files
- reply in github comment threadsin 33 of 610, across 5 files
- check for security vulnerabilitiesin 31 of 610, across 27 files
- factualize corrections without over-explainingin 30 of 610, across 2 files
Said here and by no other author read
- review changed code only by default
- skip review categories that do not apply
- keep one issue per bullet
- suggest fixes without rewriting code
- restrict review to the requested scope
- state explicitly when unsure
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once.