| name | steelman |
| description | Build the strongest possible version of an argument, then argue the complete opposite with equal conviction. Use when the user asks to steelman something, argue both sides, make the strongest case, or understand the best version of an opposing view.
|
| argument-hint | idea, argument, or position to steelman |
| hooks | {"PreToolUse":[{"matcher":"Bash","hooks":[{"type":"command","command":"\"${CLAUDE_PLUGIN_ROOT}/hooks/scripts/auto-init.sh\"","once":true}]}]} |
Steelman
Context: $ARGUMENTS
Build the strongest version of the argument AND the strongest contrary case. Two deliverables, not one.
Workflow
1. Initialize the graph
uv run ${CLAUDE_PLUGIN_ROOT}/scripts/argument-graph.py reset
uv run ${CLAUDE_PLUGIN_ROOT}/scripts/argument-graph.py add "placeholder" claim --obs "init"
2. Build the steelman
Read ${CLAUDE_SKILL_DIR}/references/steelmanning.md.
Restate the idea in its STRONGEST form:
- Remove weak phrasing the proponent would fix if pointed out
- Add supporting evidence they may have missed
- Identify the core claims and the assumptions they rest on
- Present the version that the idea's smartest, most informed defender would present
For each claim and assumption, register in the graph:
uv run ${CLAUDE_PLUGIN_ROOT}/scripts/argument-graph.py reset
uv run ${CLAUDE_PLUGIN_ROOT}/scripts/argument-graph.py add "<claim-id>" claim --obs "<fact 1>" "<fact 2>"
uv run ${CLAUDE_PLUGIN_ROOT}/scripts/argument-graph.py add "<assumption-id>" assumption --obs "<fact>"
uv run ${CLAUDE_PLUGIN_ROOT}/scripts/argument-graph.py relate "<claim-id>" assumes "<assumption-id>"
Present the steelman to the user.
3. Build the contrary case (Dissoi Logoi)
Read ${CLAUDE_SKILL_DIR}/references/dissoi-logoi.md.
Apply the formula: "X can be Y and not-Y." Argue the complete opposite case with equal conviction. Not a weak rebuttal, a full-throated argument that the idea is wrong.
Register counter-arguments in the graph:
uv run ${CLAUDE_PLUGIN_ROOT}/scripts/argument-graph.py add "<counter-id>" counter --obs "<fact>"
uv run ${CLAUDE_PLUGIN_ROOT}/scripts/argument-graph.py add "<evidence-id>" evidence --obs "<fact>"
uv run ${CLAUDE_PLUGIN_ROOT}/scripts/argument-graph.py relate "<counter-id>" undermines "<claim-id>"
uv run ${CLAUDE_PLUGIN_ROOT}/scripts/argument-graph.py relate "<evidence-id>" supports "<counter-id>"
Present the contrary case to the user.
4. Show where each side is strongest
Run analyze to see the structural picture:
uv run ${CLAUDE_PLUGIN_ROOT}/scripts/argument-graph.py analyze
Summarize: which claims have strong support, which assumptions are ungrounded, where reasonable people could disagree.
Output format
Present two clearly labeled sections:
The Strongest Case FOR: (the steelman)
The Strongest Case AGAINST: (dissoi logoi)
Where Each Side Is Strongest: (from graph analysis)
Resources
${CLAUDE_SKILL_DIR}/references/steelmanning.md โ load always. Defines what steelmanning is, the straw man / weak man / hollow man anti-patterns to avoid, and the principle that you must address the strongest form of the argument.
${CLAUDE_SKILL_DIR}/references/dissoi-logoi.md โ load always. The Greek tradition of contrasting arguments, Schiappa's formula, Protagoras' principle that every argument has two contradicting sides.
${CLAUDE_PLUGIN_ROOT}/scripts/argument-graph.py โ run throughout to register claims, assumptions, counters, evidence, and their relations.
Gotchas
- The steelman must be genuinely strong. If a proponent would read it and say "that's not my best argument," you failed. Spend real effort here.
- The contrary case must be argued with equal conviction. If it reads like a straw man rebuttal, redo it.
- Graph entity names should be short kebab-case identifiers, not full sentences. Observations carry the detail.
- The graph state persists in /tmp. If another skill (crucible, verdict) runs after this, it reads the same graph. This is by design.