Code review Claude Code untuk tim
Bangun review PR berbasis risiko dengan Claude Code, CI gate, CODEOWNERS, dan prompt berbasis bukti.
Claude Code paling berguna untuk code review ketika dipakai sebagai alur kerja yang berulang, bukan sekadar opini tambahan. Perannya adalah merapikan PR, menandai area berisiko, mengajukan pertanyaan yang tepat, dan membantu reviewer manusia fokus pada arsitektur, maksud produk, serta keputusan ownership.
Untuk tim, alur praktisnya adalah PR template, aturan review di CLAUDE.md, diff-size gate, GitHub Actions, CODEOWNERS, dan prompt yang mewajibkan bukti. Rujukan resmi yang perlu dibuka: Claude Code common workflows, dokumen pull request GitHub, CODEOWNERS, GitHub Actions workflow syntax, dan OWASP Code Review Guide.
Sistem review
Review berbasis risiko berarti tidak semua baris diperiksa dengan bobot yang sama. Autentikasi, otorisasi, billing, migrasi data, performa, dan celah test harus diberi perhatian lebih. Diff scope adalah area yang benar-benar berubah dalam PR. CI gate adalah pemeriksaan otomatis yang memberi peringatan atau memblokir. Hallucinated finding adalah komentar AI yang terdengar masuk akal tetapi tidak punya bukti di diff.
flowchart LR
A["PR template"] --> B["Diff size gate"]
B --> C["Claude Code review"]
C --> D["Code owner review"]
D --> E["CI tests and merge"]
C --> F["Questions before fixes"]
Aturan utamanya: Claude Code tidak boleh diam-diam menulis ulang kode saat review. Jika maksud bisnis, kontrak data, atau aturan izin belum jelas, ia harus bertanya.
Use case nyata
Pertama, perubahan autentikasi dan otorisasi. Untuk login, session, role, admin, dan API key, minta Claude Code memeriksa authorization yang hilang, privilege escalation, kebocoran secret, dan audit log yang tidak ada. Keputusan aturan bisnis tetap milik reviewer manusia. Untuk keamanan yang lebih dalam, baca audit keamanan dengan Claude Code.
Kedua, perubahan sensitif performa. Search, list, cache, image processing, dan batch job dapat menyembunyikan query N+1, render berulang, cache key yang salah, dan payload besar. Komentar yang baik harus menjelaskan ukuran input yang bermasalah dan cara mengukurnya.
Ketiga, test dan migrasi data. Schema, migration, seed, validation, dan backfill perlu memeriksa rollback, data lama, nullable field, unique constraint, dan perilaku saat gagal. Claude Code bisa menyiapkan daftar missing test dan edge case sebelum owner data menilai.
Keempat, PR yang terlalu besar. Setelah diff melewati 800 sampai 1000 baris, kualitas review biasanya turun. CI bisa memberi peringatan atau memblokir, sementara Claude Code memberi saran pemecahan berdasarkan behavior, migration, UI, dan test.
PR template
Buat .github/pull_request_template.md.
## Change summary
- What changed:
- Why it changed:
- User-visible impact:
## Risk review
- [ ] Security impact checked
- [ ] Performance impact checked
- [ ] Test coverage added or explained
- [ ] Data migration or rollback plan checked
- [ ] No secrets, tokens, or personal data included
## Claude Code review request
Please review this PR by diff scope only.
Focus on:
- Security: auth, authorization, injection, secret leakage
- Performance: N+1 queries, cache keys, unnecessary work
- Tests: missing unit, integration, and migration tests
- Data: schema changes, rollback, backfill safety
For each finding, include:
- file and line
- why it matters
- evidence from the diff
- suggested fix or question for the author
Frasa diff scope only penting supaya Claude Code tidak memberi saran generik untuk seluruh repo. Review harus berbasis bukti dari PR ini.
Aturan CLAUDE.md
Masukkan aturan tim ke CLAUDE.md. File ini menjadi memori proyek untuk Claude Code. Untuk struktur yang lebih luas, baca praktik terbaik CLAUDE.md.
## Code review rules
Review only the current diff unless the user asks for wider context.
Severity:
- Must fix: security bug, data loss, broken build, failed test, migration risk
- Should fix: likely production bug, missing important test, measurable performance issue
- Nice to have: naming, small cleanup, optional refactor
Evidence rule:
- Every finding must cite a file and line.
- If the evidence is uncertain, ask a question instead of asserting a bug.
- Do not invent dependencies, routes, database columns, or team policies.
Security checks:
- Authentication and authorization
- SQL or command injection
- XSS and unsafe HTML
- Secret leakage
- Missing audit log for privileged actions
Data checks:
- Migration rollback path
- Backfill failure behavior
- Existing nullable and unique constraints
- PII handling and retention
Aturan bukti mengurangi false positive. Jika tidak ada file, line, dan alasan, perlakukan sebagai pertanyaan.
Script diff gate
Simpan sebagai scripts/review-diff-gate.mjs.
#!/usr/bin/env node
import { execSync } from "node:child_process";
const baseRef = process.env.BASE_REF || "origin/main";
const maxFiles = Number(process.env.MAX_REVIEW_FILES || 25);
const maxLines = Number(process.env.MAX_REVIEW_LINES || 800);
function git(command) {
return execSync(command, { encoding: "utf8" }).trim();
}
const files = git(`git diff --name-only ${baseRef}...HEAD`)
.split(/\r?\n/)
.filter(Boolean);
const numstat = git(`git diff --numstat ${baseRef}...HEAD`);
const changedLines = numstat
.split(/\r?\n/)
.filter(Boolean)
.reduce((total, line) => {
const [added, deleted] = line.split(/\s+/);
return total + (Number(added) || 0) + (Number(deleted) || 0);
}, 0);
const riskyPatterns = [
/^src\/auth\//,
/^src\/billing\//,
/^db\/migrations\//,
/^infra\//,
/^\.github\/workflows\//,
];
const riskyFiles = files.filter((file) =>
riskyPatterns.some((pattern) => pattern.test(file))
);
let failed = false;
if (files.length > maxFiles) {
console.error(`Too many files changed: ${files.length} > ${maxFiles}`);
failed = true;
}
if (changedLines > maxLines) {
console.error(`Too many changed lines: ${changedLines} > ${maxLines}`);
failed = true;
}
if (riskyFiles.length > 0) {
console.log("Risk-sensitive files changed:");
for (const file of riskyFiles) console.log(`- ${file}`);
}
if (failed) {
console.error("Split the PR or add a reviewer-approved exception.");
process.exit(1);
}
console.log(`Review gate passed: ${files.length} files, ${changedLines} lines.`);
Jalankan lokal:
BASE_REF=origin/main MAX_REVIEW_FILES=25 MAX_REVIEW_LINES=800 node scripts/review-diff-gate.mjs
GitHub Actions dan CODEOWNERS
Tambahkan .github/workflows/review-gate.yml.
name: review-gate
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
diff-gate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-node@v4
with:
node-version: "22"
- name: Run diff size gate
env:
BASE_REF: origin/${{ github.base_ref }}
MAX_REVIEW_FILES: "25"
MAX_REVIEW_LINES: "800"
run: node scripts/review-diff-gate.mjs
Rutekan area berisiko dengan CODEOWNERS.
# .github/CODEOWNERS
/src/auth/ @example-org/security
/src/billing/ @example-org/payments
/db/migrations/ @example-org/backend-leads
/.github/workflows/ @example-org/platform
/infra/ @example-org/platform
Jangan jadikan output AI sebagai blocker merge pertama. Stabilkan lint, typecheck, test, dan ukuran diff dulu. Lanjutkan dengan panduan CI/CD dan kualitas pull request.
Prompt review
Review the current PR diff against main.
Rules:
1. Stay inside the diff scope unless a referenced file is required.
2. Do not rewrite code silently.
3. For each finding, include file, line, severity, evidence, and suggested action.
4. If business intent or data contract is unclear, ask a question instead of guessing.
5. Ignore style-only preferences unless they break CLAUDE.md or project conventions.
Focus areas:
- Security: auth, authorization, injection, XSS, secrets, audit logs
- Performance: N+1 queries, cache invalidation, repeated rendering, large payloads
- Tests: missing coverage for changed behavior, migrations, and edge cases
- Data migration: rollback, backfill, nullable fields, unique constraints
- CI and ownership: required checks, CODEOWNERS, risky paths
Output:
## Must fix
## Should fix
## Questions
## No issue found in
Jebakan dan catatan verifikasi
Jebakan pertama adalah meminta Claude Code meninjau dan memperbaiki semuanya sekaligus. Diff membesar sebelum temuan disetujui. Lakukan review dulu, pilih fix oleh manusia, lalu jalankan test.
Jebakan kedua adalah menerima temuan tanpa bukti. Jika Claude Code tidak bisa menunjukkan file, line, dan perilaku yang berubah, masukkan ke pertanyaan.
Jebakan ketiga adalah meremehkan migration. Test hijau tidak membuktikan data produksi aman. Cek NULL lama, duplikat, lock, rollback, dan retry backfill.
Saya memverifikasi contoh ini sebagai alur repo minimal: script hanya butuh Git dan Node 22, Action menjalankan script yang sama, dan template membuat Claude Code tetap berbasis evidence dari diff. Untuk rollout tim, mulai satu minggu dalam mode warning, sesuaikan threshold, lalu wajibkan check yang sudah stabil. Langkah berikutnya: gunakan checklist review gate sebelum commit.
PDF gratis: cheatsheet Claude Code
Masukkan email dan unduh satu halaman berisi command, kebiasaan review, dan workflow aman.
Kami menjaga datamu dan tidak mengirim spam.
Tentang penulis
Masa
Engineer yang berfokus pada workflow Claude Code praktis dan adopsi tim.
Artikel terkait
Permission safety ladder Claude Code: perluas akses tanpa kehilangan kontrol
Naik dari read-only ke edit terbatas, command bukti, dan cek deploy dengan kontrol yang jelas.
Claude Code Small PR Proof Pack: perubahan kecil yang mudah direview
Paket bukti untuk PR Claude Code: diff, check, URL publik, jalur CTA, dan rollback.
Review gate Claude Code sebelum commit: diff, test, URL publik, dan CTA
Cara memakai Claude Code sebelum commit: diff scope, build, URL publik, link Gumroad, CTA konsultasi, missing test, dan file tidak terkait.