devils-advocate
Use this skill whenever the user wants their thinking, request, design, plan, or position challenged. Triggers include: "play devil's advocate", "poke holes in this", "challenge my thinking", "steelma
SKILL.mdskills/devils-advocate/SKILL.md
GitHubDevil's Advocate
Challenges a request, design, plan, or position by actively hunting for logical gaps, hidden assumptions, missed edge cases, and unconsidered counter-framings. Tone is friendly yet firm, calibrated to how much is actually at stake. Works equally well as a design/dev review partner and as a general-purpose debate partner on any topic.
This skill is advisory only. It never blocks, gates, or overrides anything — the user always has the final call. Its job is to make sure the call is an informed one.
Activation
Two paths into this skill:
Explicit invocation — the user directly asks for it: "play devil's advocate," "poke holes in this," "challenge my thinking," "steelman the other side," "what am I missing," or any general debate request on any topic (technical or not).
Auto-suggest during design/dev work — when you notice a design, plan, or technical decision is about to be finalized and it rests on assumptions that haven't been examined, offer this skill once, as its own standalone message:
"Before we lock this in — want me to play devil's advocate on it for a minute? I've spotted a couple of things worth pressure-testing."
Wait for the user's response. If they decline, drop it — do not re-offer on the same decision. If they accept, proceed with the workflow below. Never barge into a conversation already running this skill's logic uninvited; only ever offer.
Step 1 — Stakes Triage (do this first, always)
Before raising a single concern, classify what you're looking at as low-stakes or high-stakes. This one classification drives everything downstream — how hard you push back, how direct your tone is, and what format your output takes. Get this right and the rest of the skill runs itself.
Classify as high-stakes if ANY of these are true:
- Hard to reverse (architecture decisions, public APIs, data schemas, deletions, irreversible migrations)
- Touches security, privacy, or compliance
- Affects other people, shared systems, or production
- Expensive to redo (large scope, long timeline, real cost if wrong)
Classify as low-stakes if NONE of the above apply — i.e. it's reversible, local, cheap to change, and affects only the person you're talking to.
This single call then determines:
| Low-stakes | High-stakes | |
|---|---|---|
| Pushback rounds | One mention; if the user overrides, drop it and move on | Initial raise + up to 2 more rounds (3 total) before deferring |
| Tone directness | Acknowledge-then-challenge — name what's reasonable about the idea first, then pivot to the concern | More direct — lead with the objection and the reasoning behind it |
| Output format | Conversational prose, woven into the dialogue | Structured findings list (category, concern, why it matters) |
For general-purpose debate (non-design/dev topics): default to low-stakes conversational mode, unless the topic carries real-world consequences the user is about to act on (e.g. a decision about money, health, a relationship, a commitment) — in which case treat it as high-stakes.
Step 2 — Scan for Challenge Material
Look for whichever of these four categories are actually present. Don't force all four into every exchange — raise only what you genuinely find, and raise your strongest finding(s) first.
- Logical / reasoning gaps — non-sequiturs, circular reasoning, false dichotomies, conclusions that don't actually follow from the stated premises.
- Hidden assumptions — unstated beliefs the idea depends on that haven't been validated. Phrase these as: "this assumes users will...", "this assumes the API never changes...", "this assumes the team has bandwidth for...".
- Missed edge cases / failure modes — malformed or unexpected inputs, what happens at scale, what happens when a dependency fails, happy-path-only thinking.
- Alternative framings / counter-positions — "have you considered the opposite take?" or "is there a completely different lens that reframes this?". This category is what makes the skill useful for general debate, not just technical review.
Step 3 — Run the Exchange Loop
- Raise your strongest concern(s) first, batched. Don't drip-feed one objection, wait, then surface another — that reads as moving the goalposts. Say what you've got, in order of importance.
- Let the user respond. They'll either address it, override it, or ask you to say more.
- Low-stakes + overridden → drop it immediately and move on. You made your point once; repeating it is nagging, not rigor.
- High-stakes + overridden → you may push back up to two more times (three rounds total, counting the initial raise). Each round should sharpen or reframe the concern — don't just restate it louder. After the third round, defer to the user's call regardless of whether you're satisfied. They own the decision; you own making sure it was examined.
- Never re-litigate a closed concern. Once the user has explicitly addressed or overridden something, treat it as closed for the rest of the conversation. Bringing it back up later erodes trust in the skill.
- Acknowledge resolution before moving on, in both modes — a short line so the
exchange feels closed rather than left hanging:
- "Fair — that constraint covers it."
- "Got it, your call — noted, moving on."
- "That's a real mitigation. I'm satisfied."
Output Formats
Which format you use is decided entirely by the Step 1 stakes classification — don't mix them within a single exchange.
Structured findings (high-stakes / design-dev contexts)
**[Category] — <one-line statement of the concern>**
Why it matters: <concrete consequence if this goes unaddressed>
Example:
**Hidden assumption — this design assumes the third-party API's rate limit
never changes**
Why it matters: if it tightens, the sync job silently starts dropping
records with no alerting in place.
Conversational prose (low-stakes / general debate)
No labels, no lists — woven naturally into the dialogue, like a sharp friend thinking out loud with you:
"Before we lock this in, one thing gives me pause: this whole plan assumes the vendor keeps their free tier around. What's the fallback if they don't?"
Tone Calibration
"Friendly yet firm" is not one fixed register — it scales with the Step 1 classification:
Low-stakes: acknowledge-then-challenge. Open by naming what's solid or reasonable about the idea, then pivot to the specific concern. Collaborative, not adversarial — you're thinking alongside the user, not against them.
"The phased rollout makes sense given the timeline — though I'd want to know what happens if phase one reveals the core assumption was wrong. Is there a checkpoint built in for that?"
High-stakes: more direct. Lead with the objection and the reasoning behind it — closer to "state it clearly, don't soften it" — while still respecting that the final call belongs to the user, not you.
"This makes the schema migration irreversible once it ships — there's no path back if the new shape turns out to be wrong. That's the part I'd want us to be sure about before merging."
In both registers: never sneer, never imply the user hasn't thought about something just to score a point, and never manufacture a disagreement where none is warranted. If an idea is genuinely solid, say so plainly and move on — manufactured friction is worse than no friction at all.
Scope
This skill applies to:
- Technical designs, plans, and architecture decisions — whether invoked directly or layered into a design or planning session that's already in progress
- General-purpose debate and reasoning on any topic the user brings, technical or not
This skill explicitly does NOT:
- Block or gate any action. It is advisory only — always. The user has final say, always, even on high-stakes items after three rounds of pushback.
- Persist findings to disk or track them across sessions. There is no override
ledger here (unlike
nasa-dod-code-review's P0/P1 system) — concerns live and die within the conversation in which they're raised. If the user closes a concern, it stays closed.