adversarial-pair
Run a review as two isolated voices, cooperative and adversarial, then reconcile.
Skill by vancourse
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/vancourse-adversarial-pair
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/adversarial-pair
What's inside
- Skill name
adversarial-pair- Description
- Run a review as two isolated voices, cooperative and adversarial, then reconcile. Used by `rails review` on seam and concurrency diffs.
- License
- MIT
- Instructions
- 190 lines in SKILL.md · view on GitHub
Files (1)
- SKILL.md
SKILL.md (first lines)
# Adversarial Pair
The canonical "two-voice review" dispatch mechanic. Promotes the cooperative + adversarial pattern from prose-buried-in-CLAUDE.md (and inline sections in `rails:design-feature` / `rails:design-review`) into a **first-class skill** every phase-routed review can point to.
## The failure it prevents
A review run in the **same session as authoring** has its attack voice contaminated by the just-spent author voice. The reviewer is unconsciously protecting the design they just built — congratulating it, missing the very holes the author already half-rationalized. The cheap inline counter-passes that ship with `rails:design-feature` are the *one-agent* version of this problem; they catch the easy stuff and miss the load-bearing weaknesses.
The fix is **two cognitively-independent passes that cannot infect each other** — different agents, different framings, different worktrees, same input artifact. Reconcile their findings cold.
## When to invoke
Fire after a **non-trivial** change is authored, before it's frozen / merged / shipped:
| Phase | Pair runs | Review skill the pair invokes |
|---|---|---|
| Design freeze | After `rails:design-feature` | `rails:design-review` |
| Plan freeze | After `rails:impl-plan` | `rails:impl-plan-review` |
| Threat-modeling | When feature touches auth / payment / multi-tenant / admin / crypto | `rails:threat-model` |
| Pre-PR | After implementation, before opening PR | `rails:ai-pre-review-checklist` + language review (`rails:python-review` / `rails:typescript-review`) |
**The review skill is the *input* to this dispatch mechanic — not a substitute for it.** `rails:design-review` describes what to look for; `rails:adversarial-pair` describes how to run it twice with opposite framings.
### Skip cases
Don't dispatch the pair (single agent / inline pass is enough) when:
- **Pure-docs change** — no production code touched, no risk surface.
- **Pure-fixture change** — unless the fixture is customer-data-leak-prone.
- **Tiny one-file fix** — single function, no new contract, no new caller.
- **Already-frozen artifact unchanged since last pair pass** — re-running on unchanged input is waste.
Skip cases are about cost. The pair burns roughly 2× the tokens of a single review and dispatches two worktree agents. If the change can't justify that, run the inline counter-pass and move on.
## How to dispatch
The dispatch is three steps: spawn two agents in parallel, wait for both, reconcile.
### Step 1 — Spawn both agents in parallel
Send a **single message with two `Task` tool calls** so they run concurrently. Each call uses `isolation: "worktree"` so the agents work on isolated copies of the repo and can't step on each other's notes / scratch files.
```javascript
Task({
description: "Cooperative review of <artifact>",
subagent_type: "general-purpose",
isolation: "worktree",
prompt: COOPERATIVE_PROMPT,
})
Task({
description: "Adversarial review of <artifact>",
subagent_type: "general-purpose",
isolation: "worktree",
prompt: ADVERSARIAL_PROMPT,
})
```
(Some Claude Code versions surface this as the `Agent` tool — the parameter shape is identical; the rest of the apex repo standardizes on `Task` per `commands/review-pr.md`.)
### Step 2 — Prompt templates (fill in `{REVIEW_SKILL}` and `{ARTIFACT_PATH}`)
**Cooperative prompt** — steelman the artifact:
```
You are in an isolated git worktree. Use relative paths; do NOT cd to
absolute paths.
Treat the `{REVIEW_SKILL}` skill as your PASS CHECKLIST and OUTPUT SCHEMA
ONLY: read its SKILL.md to learn (a) what passes / conditions / checks to
run, and (b) what output format to use. IGNORE any framing the skill
prescribes — whether it says "attack mode", "adversarial lens", "cold
pass", or anything else. THIS skill's framing (steelman / cooperative)
overrides the review skill's own framing. (Many apex review skills like
`rails:design-review` are explicitly adversarial — that doesn't apply
here; you are the cooperative half of the pair.)
Run every pass in **steelman mode**: find what works, what reuses well,
what's clean. For each pass condition, cite the strongest evidence in the
artifact (`{ARTIFACT_PATH}`) and code (`file:line`) that it's met.
Default to "defensible" unless the evidence forces "unresolved." Your
job is to find what this artifact gets RIGHT — not to invent praise.
Output: follow the `{REVIEW_SKILL}`'s own output schema if it specifies
one (e.g., `rails:ai-pre-review-checklist` produces a step-by-step
checklist; `rails:design-review` produces per-pass verdicts; etc.).
Otherwise emit per-pass findings (defensible / unresolved / can't-tell),
each with `file:line` citations. No prose summary.
```
**Adversarial prompt** — attack the artifact:
```
You are in an isolated git worktree. Use relative paths; do NOT cd to
absolute paths.
Treat the `{REVIEW_SKILL}` skill as your PASS CHECKLIST and OUTPUT SCHEMA
ONLY: read its SKILL.md to learn (a) what passes / conditions / checks to
run, and (b) what output format to use. IGNORE any framing the skill
prescribes — whether it says "steelman", "cooperative", "defensible", or
anything else. THIS skill's framing (attack / adversarial) overrides the
review skill's own framing. (For review skills whose default framing is
already adversarial — like `rails:design-review` — just use their passes
as-is in attack mode.)
Run every pass in **attack mode**: find what's wrong, missing, hand-waved,
or what the author got away with. For each pass condition, name the
specific thing that's unresolved — flow not covered, primitive duplicated
instead of extended, failure mode without user-visible behavior, invariant
quietly broken.
Default to "refuted" unless the evidence forces "defensible." Your job is
to find what this artifact gets WRONG — not to invent gotchas, but to
read the artifact and the code (`file:line`) like a senior engineer
trying to merge the smallest possible diff.
Output: follow the `{REVIEW_SKILL}`'s own output schema if it specifies
one (run the same passes, but in attack mode). Otherwise emit per-passFrom vancourse/apex, MIT.
More from vancourse/apex
- 0.587score
rails
vancourse
The rails loop and its commands - claim, intent, rails check, push, rails ship, walk, used.
SkillAFreshness: A★ 1Claude Code +9 - 0.581score
security-review
vancourse
Pre-PR security pass for auth, data access, external input, secrets and dependencies.
SkillAFreshness: A★ 1Claude Code +9 - 0.581score
typescript-review
vancourse
TypeScript/React review rules (types, hooks, state, tests, errors).
SkillAFreshness: A★ 1Claude Code +9 - 0.581score
postgres-review
vancourse
Postgres schema, RLS, indexing and SQL review rules.
SkillAFreshness: A★ 1Claude Code +9 - 0.581score
python-review
vancourse
Python review rules (types, SQL, async, tests, errors, security).
SkillAFreshness: A★ 1Claude Code +9 - 0.579score
fix
vancourse
Fix something broken - a defect, a red check, a wrong behaviour.
SkillAFreshness: A★ 1Claude Code +9 - 0.579score
release
vancourse
Start or close a release (a milestone whose done is the operator using it).
SkillAFreshness: A★ 1Claude Code +9 - 0.579score
retro
vancourse
Close a session by routing ONE finding to the strongest rung it reaches - a gate or test, else a hook, else prose, else dropped.
SkillAFreshness: A★ 1Claude Code +9 - 0.318score
design-review
vancourse
No description from the publisher yet.
SkillAFreshness: A★ 1Claude Code +9
Signals
- Stars
- 1
- Forks
- 1
- Open issues
- 9
- Last commit (this folder)
- Oct 6, 2026 (23 days ago)
- Last release
- Aug 13, 2026 (2 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/vancourse/apex
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from vancourse
- 0.587score
rails
vancourse
The rails loop and its commands - claim, intent, rails check, push, rails ship, walk, used.
SkillAFreshness: A★ 1Claude Code +9 - 0.581score
security-review
vancourse
Pre-PR security pass for auth, data access, external input, secrets and dependencies.
SkillAFreshness: A★ 1Claude Code +9 - 0.581score
typescript-review
vancourse
TypeScript/React review rules (types, hooks, state, tests, errors).
SkillAFreshness: A★ 1Claude Code +9 - 0.581score
postgres-review
vancourse
Postgres schema, RLS, indexing and SQL review rules.
SkillAFreshness: A★ 1Claude Code +9 - 0.581score
python-review
vancourse
Python review rules (types, SQL, async, tests, errors, security).
SkillAFreshness: A★ 1Claude Code +9 - 0.579score
fix
vancourse
Fix something broken - a defect, a red check, a wrong behaviour.
SkillAFreshness: A★ 1Claude Code +9
Cite this page
adversarial-pair skill. Agent Mart. https://agentmart.dev/skills/vancourse-adversarial-pair (last updated 2026-10-24)