| 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. |
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:
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.
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:
uv run ~/.claude/skills/brutal/scripts/critique.py \
--idea-file /tmp/brutal-idea.txt \
--persona PERSONA \
[--self-critique]
Claude CLI mode:
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:
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