devils-advocate
Claude's harshest critic. A Claude Code plugin that critiques Claude's work with binary pass/fail evaluation — every criterion either passes or fails, no percentage scores, no wiggle room.
Why
Claude writes code confidently. Too confidently. Left unchecked, it'll tell you everything looks wonderful right up until production catches fire. Inspired by Confidently Wrong.
A devil's advocate argues against a position not because they believe the other side, but to surface the holes everyone else missed. This plugin gives Claude that role — the skeptical colleague who says "yeah, but what about..." instead of "LGTM."
Every criterion demands file:line evidence and a fix suggestion — no hand-waving, no vibes-based reviews.
What it catches
It'll flag you for reinventing bcrypt, missing authorization checks, duplicating a helper that already exists three directories away, writing plans where step 4 depends on step 7, N+1 queries in hot paths, and shipping without a rollback strategy. It knows when you're hand-rolling auth instead of using a battle-tested library, and it won't let you forget that "works on my machine" isn't a testing strategy.
New in v3.2: it catches architectural drift — when Claude bypasses an established API layer to hit a database directly, adds special-case conditionals instead of proper abstractions, or papers over a root cause with a band-aid fix. It mines your codebase for dominant patterns and enforces them, even if they're not documented.
It works on both code and plans — auto-detecting which criteria set to use based on what you're reviewing.
Install
/plugin marketplace add brandonsimpson/devils-advocate
/plugin install devils-advocate@devils-advocate
Manual install
git clone https://github.com/brandonsimpson/devils-advocate.git ~/.claude/plugins/devils-advocate
Add to ~/.claude/settings.json:
{
"plugins": [
"~/.claude/plugins/devils-advocate"
]
}
Or single session: claude --plugin-dir ~/.claude/plugins/devils-advocate
Commands
| Slash command | Natural language |
|---|
/devils-advocate:critique | "critique" or "critique this plan" |
/devils-advocate:log | "show critique log" |
/devils-advocate:critique
Binary pass/fail critique across every dimension that matters. Auto-detects whether you're reviewing code or a plan document.
Independence gate: When critiquing work Claude wrote in the same conversation, it automatically dispatches an independent subagent to avoid author bias — the reviewer never sees the author's reasoning, only the artifact and codebase.
Code critique (20 criteria, 8 dimensions):
- Correctness — Tests pass? Logic correct? Edge cases handled?
- Security — No hardcoded secrets, input validated, no injection vectors, auth enforced?
- Quality — No dead code, no placeholders, errors handled properly, no code smell?
- Performance — No N+1 queries, no O(n^2) in hot paths?
- Consistency — Types match, naming follows conventions, patterns followed?
- Integration — Imports resolve, tests exist, no regressions?
- Architecture — Established boundaries respected, no hacky shortcuts?
Plan critique (22 criteria, 10 dimensions):
- Completeness — Requirements covered, no placeholders, edge cases addressed?
- Correctness — APIs verified against docs, patterns match library usage?
- Testability — Specific tests per step, E2E verification strategy?
- Security — Secrets managed properly, input validated, auth designed?
- Consistency — Types consistent, naming follows conventions?
- Simplicity — No overengineering, no reinventing solved problems?
- Dependencies — Correct task ordering, all deps available?
- Resilience — Rollback plan exists, performance considered?
- Integration — Import paths valid, follows project patterns?
- Architecture — Established boundaries respected, no hacky shortcuts?
Every FAIL comes with a Fix: suggestion. Example output:
DEVIL'S ADVOCATE CRITIQUE (Binary Eval)
═══════════════════════════════════════
Target: code changes for webhook handler
Correctness:
tests-pass ...... PASS
logic-correct ... PASS
edge-cases ...... FAIL — No handling for empty payload at webhook.ts:45.
Fix: Add early return with 400 status for empty/malformed payloads.