---
name: brutal
description: Get brutally honest feedback on ideas, plans, code, or proposals from an external LLM. Triggers: "brutal feedback", "critique this", "tear this apart", "what's wrong with this idea", "red team this", or needs honest critical review of an idea or plan.
allowed-tools: Bash,Read,Agent,AskUserQuestion
---

# BRUTAL Feedback

Get brutally honest, structured critique of ideas, plans, code, or proposals by sending them to an external LLM (Grok via xAI by default) with adversarial personas and third-party framing.

## Prerequisites

- `uv` installed (dependencies are auto-installed via PEP 723 inline metadata)
- For external model mode: `XAI_API_KEY` environment variable set (or appropriate key for chosen provider)
- For Claude CLI mode: `claude` CLI installed and authenticated

## Critical Rule

ALL critique content MUST come from the external model via the script. If the script fails or returns no output, report the error to the user. NEVER generate critique content yourself — not as a fallback, not as a summary, not in any form.

## Workflow

### 1. Collect the idea

If `$ARGUMENTS` contains the idea, use it directly.

If `$ARGUMENTS` is empty or only contains a persona/modifier, ask:

```yaml
header: "Idea"
question: "Paste or describe the idea, plan, or proposal you want critiqued."
```

### 2. Determine mode

No question needed — detect from `$ARGUMENTS` **before** extracting the idea text. Only match these cues when they appear as standalone directives, not embedded inside the idea content:

- If user says "use claude", "claude cli", or passes a Claude model flag (e.g. `--model sonnet-4-6`) → **Claude CLI** mode. Use `critique-claude.py`.
- Otherwise → **External model** mode. Use `critique.py`.

Do NOT match partial words inside idea text (e.g. "my opus on distributed systems" is not a Claude model cue).

### 3. Select persona

ALWAYS ask for persona unless `$ARGUMENTS` contains an explicit persona cue from the table below. Do NOT infer persona from the skill name or tone of the idea.

```yaml
header: "Persona"
question: "Pick the feedback style."
multiSelect: false
options:
  - label: "Devil's Advocate"
    value: "devil"
    description: "Basic counterarguments, challenges assumptions"
  - label: "Red Team"
    value: "red-team"
    description: "Adversarial weakness hunting, thorough and methodical"
  - label: "Gordon Ramsay"
    value: "ramsay"
    description: "Surgical, no mercy, tears apart what's lazy"
```

Pass the selected `value` (not the label) as the `--persona` argument: `devil`, `red-team`, or `ramsay`.

Explicit cue detection (only these exact phrases skip the question):

| Persona | `--persona` value | Cues |
|---------|-------------------|------|
| Devil's Advocate | `devil` | "devil", "counterarguments" |
| Red Team | `red-team` | "red team", "attack" |
| Gordon Ramsay | `ramsay` | "ramsay", "tear apart" |

### 4. Gather context (optional)

If the idea references code, files, or domain-specific context, read relevant files and pass as `--context` to give the external model grounding.

### 5. Run the critique

Write the idea to a temp file, then run the appropriate script based on mode from step 2.

**External model mode:**

```bash
uv run ~/.claude/skills/brutal/scripts/critique.py \
  --idea-file /tmp/brutal-idea.txt \
  --persona PERSONA \
  [--self-critique]
```

**Claude CLI mode:**

```bash
uv run ~/.claude/skills/brutal/scripts/critique-claude.py \
  --idea-file /tmp/brutal-idea.txt \
  --persona PERSONA \
  [--model MODEL] \
  [--self-critique]
```

Pass `--model` only if the user specified a particular Claude model (e.g. `claude-sonnet-4-6`). If they just said "use claude", omit `--model` to use the default.

For both modes: write large context to a file and pass `--context-file /tmp/brutal-context.txt`. For short ideas, `--idea "TEXT"` and `--context "TEXT"` also work. Add `--self-critique` when the modifier is active.

The script outputs formatted markdown directly. Do NOT reformat, summarize, or rephrase any of it.

### 6. Present the output

Print the script's stdout verbatim. Do NOT add any text before, after, or around it.

## Alternative Providers

When the user specifies an exact model string (e.g. "use gpt-4o"), pass it as `--model PROVIDER/MODEL` verbatim. When the user gives only a provider name (e.g. "use openai"), use the default model from the table below. Add the required `--with` extra to the `uv run` command.

| Provider | Default `--model` value | `--with` extra | Env var | Notes |
|----------|-------------------------|----------------|---------|-------|
| xAI (default) | `xai/grok-4.20-0309-reasoning` | (built-in) | `XAI_API_KEY` | |
| OpenAI | `openai/gpt-5.4-2026-03-05` | (built-in) | `OPENAI_API_KEY` | |
| Anthropic | `anthropic/claude-opus-4-6` | `instructor[anthropic]` | `ANTHROPIC_API_KEY` | |
| Google | `google/gemini-3.1-pro-preview` | `instructor[google-genai]` | `GOOGLE_API_KEY` | |
| Ollama | `ollama/deepseek-reasoner` | (built-in) | — | Defaults to `http://localhost:11434/v1`. Set `BASE_URL` in `.env` to override |

Example with Anthropic:

```bash
uv run --with "instructor[anthropic]" ~/.claude/skills/brutal/scripts/critique.py \
  --model anthropic/claude-sonnet-4-20250514 \
  --idea-file /tmp/brutal-idea.txt \
  --persona PERSONA
```

## Behavioural Modifiers

| Behaviour | Cues | Default |
|-----------|------|---------|
| Claude CLI mode | "use claude", "claude cli", or a Claude model flag (e.g. `--model sonnet-4-6`) | Off (uses external model) |
| External model override | "use openai", "use gemini", "use ollama", "use grok-3" | xai/grok-4.20-0309-reasoning |
| Self-critique | "self-critique", "double check", "critique yourself" | Off |
| Include code context | references files or code in the idea | Auto-detect |

## Keywords

brutal feedback, honest review, critique, red team, devil's advocate, tear apart, roast, what's wrong, poke holes, claude cli
