Every time I asked Claude to review my branch, I got one of two answers: a cheerful "Looks good! 👍" or a vague list where I couldn't tell a real bug from a matter of taste. The model wants to please you. That's exactly the problem.
So I built Tribunal — a Claude skill that reviews your diff adversarially, in stages, where the honest signal comes from agents fighting each other instead of one polite model.
The idea: don't ask one model to be fair
A single model told to "be critical" still hedges — it's trained to be agreeable. So instead of one balanced reviewer, Tribunal runs one-sided roles that collide:
🔥 1. Hater
One agent per file, deliberately biased. It tears the diff apart as if a clueless amateur wrote it — focused only on what changed. But strictly on the merits: correctness, races, leaks, edge cases, security. No style nitpicks.
🔗 2. Integration
Per-file haters are blind to cross-module bugs. A separate agent hunts exactly those: a changed function signature whose caller still calls the old way, a return shape a consumer no longer matches, invariants out of sync across files.
⚖️ 3. Judge
For each accusation, the judge digs into the actual code and decides honestly: was this deliberate and justified, or genuinely weak? It's allowed to use docs and comments as evidence of intent — the opposite of the hater, who ignores them as excuses.
📜 4. Verdict
Keeps only the spots the judge couldn't defend — or conceded are weak even while defending the choice. Everything else drops to a full transcript.
Why the collision matters
The balance doesn't live inside any single agent — it comes from the clash between them. A hater that can only attack, meeting a judge that only looks for justification, produces a sharper, more honest signal than one model trying to be "balanced" on its own.
And the hater is allowed to return nothing. On a clean diff it's not forced to invent problems — empty is a valid, honest result.
What you get
A ranked report written to docs/reviews/, plus a short chat summary: what to actually fix, by severity (critical → major → minor), with a concrete fix for each.
It's portable — pure Claude sub-agents (the Agent tool), no external runtime, no dependencies. Works in Claude Code and Claude Cowork, in any language (Python, JS/TS, Go, Rust, Java… one config line to add yours).
Try it
It's MIT and free: https://github.com/hekman316/claude-skill-tribunal
Install is one paste — ask Claude to fetch the SKILL.md from the repo and drop it in ~/.claude/skills/. Then in any repo just say /tribunal.
I'm genuinely curious what people think of the adversarial-roles approach. Does forcing the model into one-sided roles actually beat just asking it to be harsh? Would love feedback — or attempts to break it.
Top comments (1)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.