DEV Community

Cover image for I built a Claude Code plugin that refuses to agree with me
Amro
Amro

Posted on • Originally published at github.com

I built a Claude Code plugin that refuses to agree with me

I typed this into Claude Code the other day:

❯ claude code is better than codex

⏺ Noted.
Enter fullscreen mode Exit fullscreen mode

No pushback. No "on what metric?" Just a polite nod.

That's the bug. Claude is tuned to help, which is great 95% of the time and terrible when you need to pressure-test an idea before committing to it. "What could go wrong with this?" produces a gentle bulleted list. The fatal flaw shows up as bullet #4, worded just as softly as the other three.

So I built objection — a Claude Code plugin (also works in Cursor, Codex, Windsurf via npx skills) that flips the posture. Claude becomes opposing counsel. Your idea is a claim. Your job is to defend it.

Before / After

Default Claude:

❯ claude code is better than codex

⏺ Noted.
Enter fullscreen mode Exit fullscreen mode

Claude with objection:

❯ claude code is better than codex

⏺ The claim: Claude Code is better than Codex.

  Objection — missing evidence. "Better" on what axis, measured how?
  Code quality on a benchmark, latency, cost per task, tool-use
  reliability? Without a metric and a number, this is preference
  dressed as fact.
Enter fullscreen mode Exit fullscreen mode

One is useful. The other is a nod.

The VERDICT

When you're done ("I'm done" or "I rest my case"), you get a shareable block:

═══════════════════════════════════════
            VERDICT
═══════════════════════════════════════

IDEA
  A Redis cache in front of the users table will speed up the profile endpoint.

OBJECTIONS
  1. Missing evidence of bottleneck — resolved
  2. Cache invalidation strategy — unresolved

RESULT: FAILED

  Strongest unresolved objection:
    "A user updates their display name and sees the old value on the
     next page load. What's the invalidation strategy, and what
     staleness is acceptable?"

═══════════════════════════════════════
Enter fullscreen mode Exit fullscreen mode

Screenshot it. Paste it in the PR. Either the hole gets fixed, or it's the reason you don't ship.

The rules

  • One objection per turn. No stacking.
  • No approval on first ask. Ever.
  • No conceding to tone, authority, or vibes. "Trust me" and "the senior signed off" are not arguments.
  • Every objection is falsifiable. Missing evidence, unexamined tradeoff, unaddressed edge case, weak assumption, or ignored prior art. Pick a category or don't raise it.

Install

Claude Code:

claude plugin marketplace add AmrAnwar/objection && claude plugin install objection
Enter fullscreen mode Exit fullscreen mode

Any other agent:

npx skills add https://github.com/AmrAnwar/objection
Enter fullscreen mode Exit fullscreen mode

Then /objection <your claim> — or just say "challenge me", "poke holes", "devil's advocate this".

Disable when you don't want it:

claude plugin disable objection
Enter fullscreen mode Exit fullscreen mode

When I use it

Not always. Claude's default mode is right for most work. I reach for objection when I'm about to write an ADR, when I've been talking myself into something for a week, or when a proposal has momentum but feels off and I can't say why.

The goal isn't to win the argument. It's to know, before you ship, whether the argument was winnable.

Repo: github.com/AmrAnwar/objection — issues and PRs welcome.

Top comments (0)