Skip to content
Development
Command

/cross-critique

Adversarial multi-angle critique. All three auditors fire in parallel (codex=technical, gemini=strategic, claude=ux). Counter-args ranked by rebuttal survival score, not raw severity. Usage: /cross-critique [--with <id> | list | compare] <target>

From plugin
ijfw
20522 skills37 agents22 commands1 MCP
Install
$ npx -y skills add FerroxLabs/ijfw --agent claude-code

How it fires

How this command gets triggered: by you, by Claude, or both.

  • Fires itselfClaude auto-loads it when your prompt matches the work.
  • You can call itInvoke it directly when you want it.
  • Slash command/cross-critique

Context preview

What this command does when you run it.

Adversarial multi-angle critique. All three auditors fire in parallel (codex=technical, gemini=strategic, claude=ux). Counter-args ranked by rebuttal survival score, not raw severity. Usage: /cross-critique [--with <id> | list | compare] <target>

Command definition

cross-critique.md
description: "Adversarial multi-angle critique. All three auditors fire in parallel (codex=technical, gemini=strategic, claude=ux). Counter-args ranked by rebuttal survival score, not raw severity. Usage: /cross-critique [--with <id> | list | compare] <target>"
allowed-tools: ["Read", "Write", "Bash", "Grep"]

Stress-test any target against three adversarial perspectives simultaneously. Solves "a single reviewer's blind spots." Unlike cross-audit (which reviews for correctness/security/ops/maint), cross-critique hunts for the hardest counter-arguments to your position -- then ranks them by how likely each argument is to survive a rebuttal. High-survival counter-args are the ones worth acting on first.

Subcommands

| Form | Behavior | |------|----------| | `/cross-critique` | **Zero-arg auto-pick.** Detect target from git state (staged → unstaged → last commit). Fire all three angles in parallel. | | `/cross-critique <target>` | Named target, same parallel fan-out. | | `/cross-critique --with <id> [target]` | Override one auditor slot: `codex`, `gemini`, `opencode`, `aider`, `copilot`, `claude`. Target optional. | | `/cross-critique list` | Show roster with self marker. No requests generated. | | `/cross-critique compare` | Read all response files, score by rebuttal survival, render ranked table, archive. |

Smart target auto-detection (bare `/cross-critique`)

When invoked without a target, run this detection cascade and use the first non-empty result:

1. **Staged changes** -- `git diff --cached --name-only` 2. **Unstaged changes** -- `git diff --name-only` 3. **Last commit** -- `git diff HEAD~1 --name-only` 4. If all empty: print the roster and ask "what would you like critiqued?"

Report which step succeeded:

Cross-critique target auto-detected: 1 staged file(s)
  claude/commands/cross-critique.md
(Override with /cross-critique <path> or /cross-critique --with <id> <path>.)

If >5 files, group in request body but list all paths. If a single file >2000 lines, use the diff hunks rather than the full file.

The natural-language phrase **"challenge this from every angle"** / **"adversarial critique"** fires the intent router (`mcp-server/src/intent-router.js`), which nudges Claude to invoke `/cross-critique` automatically -- same auto-detect flow runs.

Default flow -- Donahoe Trident (don't make me think)

Caller holds one perspective (UX/adoption lens). Two external auditors cover the other two angles (technical and strategic) independently, in parallel, so no reviewer anchors on another's findings. All three streams merge into a single ranked table.

When invoked, do this in order:

1. **Probe roster.** Call `pickAuditors({ count: 2, env: process.env })` from `audit-roster.js`. Returns `{ picks, missing, note }`.

2. **Show a TODO surface** in chat:

   Cross-critique plan
     [ ] Step A.1: Generate requests (codex=technical, gemini=strategic, claude=ux)
     [ ] Step A.2: Fire all three in background (parallel)
     [ ] Wave A (caller leg): Collect in-session specialist findings
     [ ] Wait for all completions
     [ ] Step B.1: Score by rebuttal survival
     [ ] Step B.2: Render ranked counter-arg table
     [ ] Step B.3: Archive all requests + responses + merge

3. **Ask the user once** which combo to run:

   Auditors detected and ready: codex, gemini.
   Run cross-critique:
     [A] codex only (technical angle)
     [B] gemini only (strategic angle)
     [C] Both + claude ux -- recommended (Donahoe Trident)
     [D] Cancel / pick custom

   Default: [C] All three -- press enter to confirm.

Default suggestion: **C (All three)** when >=2 external auditors installed.

4. **If only one external auditor installed:**

> "Only `<id>` is installed locally. The full Trident covers technical, > strategic, and UX angles in one pass -- install one more auditor > (opencode, aider, etc.) to unlock complete angle coverage."

Then offer to run the partial two-angle flow (external + claude ux).

5. **Fire all three in background** simultaneously (see Parallel fan-out section).

6. **Collect caller's in-session findings** (see Caller perspective section).

7. **Score, merge, and render** ranked table (see Compare section).

8. **Archive** all files to `.ijfw/cross-audit/archive/<ts>-critique/`.

Auditor picking

node --input-type=module -e "import('./mcp-server/src/audit-roster.js').then(m => console.log(m.formatRoster()))"

Default pick order (first non-self): `codex → gemini → opencode → aider → copilot → claude`.

Critique role assignment is mode-aware via `assignRoles('critique', roster, self)` in `cross-dispatcher.js`:

  • `codex` → `technical` angle (implementation weaknesses, edge cases, failure modes)
  • `gemini` → `strategic` angle (market, adoption, sustainability, risk)
  • `claude` (fresh session via `claude -p`) → `ux` angle (cognitive load, onboarding, discoverability)
  • Caller's own perspective is collected in-session and merged at the end -- the

caller does NOT occupy one of the three external slots.

---

Wave A -- Parallel fan-out -- all three angles at once

Step A.1 -- Generate requests via the dispatcher

Run one node call per auditor:

node --input-type=module -e "
import('./mcp-server/src/cross-dispatcher.js').then(m =>
  process.stdout.write(m.buildRequest('critique', '<target>', 'codex', 'technical'))
)" > .ijfw/cross-audit/request-critique-codex.md
node --input-type=module -e "
import('./mcp-server/src/cross-dispatcher.js').then(m =>
  process.stdout.write(m.buildRequest('critique', '<target>', 'gemini', 'strategic'))
)" > .ijfw/cross-audit/request-critique-gemini.md
node --input-type=module -e "
import('./mcp-server/src/cross-dispatcher.js').then(m =>
  process.stdout.write(m.buildRequest('critique', '<target>', 'claude', 'ux'))
)" > .ijfw/cross-audit/request-critique-claude.md

> *

Read more
Ships withijfw

IJFW — It Just F*cking Works. Ferrox Labs' local-first infrastructure for AI coding agents: shared memory, smart routing, multi-AI cross-audits, disciplined workflow.

Get the whole plugin