Collect from user before starting. Only topic is required; all others have defaults.
ParamRequiredDefaultDescriptiontopicyes—Debate subjectrolesnoProponent + Opponent2-4 role objects: {name, stance, model?}. Default: Proponent (argue for) and Opponent (argue against). Model inherits from global.goalnoinferredWhat question to answeraudienceno"self"Who reads the report: self / team / publicdecision_typeno"personal-choice"personal-choice / team-standardization / market-analysisevidence_roundno"auto"false / true / auto (enable when topic is fact-dense)confirm_plannotrueShow plan and wait for user OK before executionmodelnoinheritGlobal subagent model; role-level override takes priorityoutput_pathnonullFile path for report; null = return in conversation
Implicit parameter: language — inferred from the user's topic/conversation language. All subagent prompts output in this language.
Claude Code vs OpenCode (gpt-5.4, claude-4.6-sonnet)Step 0a: Model reachability check
Collect all unique models (global + per-role + judge). For each unique model,
probe via sessions_spawn with a minimal one-sentence task (e.g. "Reply OK")
and model: <target>. Do NOT use curl or external HTTP — all models route
through OpenClaw's provider config.
If any probe fails:
Step 0b: Plan presentation (if confirm_plan: true)
Present to user:
[STOP — wait for user confirmation]
If confirm_plan: false, skip directly to Phase 1.
Spawn one subagent per role, all in parallel.
Each agent receives a prompt built from:
Required output format per agent:
text
Core arguments (3-5):
- [argument] | confidence: 0.0-1.0 | source: [official-docs/community-feedback/personal-blog/academic-paper]
Opponent weaknesses (2-3)
Predicted counter-attacks (1-2)
Use sessions_spawn + sessions_yield to wait for all completions.
Error handling:
[INCOMPLETE], continue pipelineSpawn one subagent per role, all in parallel.
Each agent receives:
Required output format per agent:
text
Rebuttals (one per opponent argument):
- [rebuttal] | confidence: 0.0-1.0
Weakest premise attack:
- Identify opponent's single weakest assumption and challenge it ← Socratic element
New attacks (2):
- [attack]
Word limit: 300 × number_of_opponents words per agent.
Error handling:
[INCOMPLETE], continueTriggered when evidence_round: true, or when auto and topic involves
measurable claims. Auto-enable heuristic: topic contains performance benchmarks,
cost comparisons, security assessments, market data, or quantitative metrics.
When in doubt with auto, skip (false positive costs more than false negative).
Spawn 1 subagent as "evidence auditor":
[official-docs] [community-feedback] [personal-blog] [no-source] [exaggerated]Spawn 1 subagent as neutral judge:
Required output structure:
decision_typeOrchestrator (main conversation) assembles all outputs into Markdown:
markdown
# [topic]: Debate Research Report
> **Date**: YYYY-MM-DD
> **Method**: Multi-agent structured debate (debate-research skill)
> **Roles**: [role1 (model)] | [role2 (model)] | ...
> **Audience**: [audience] | **Decision type**: [decision_type]
> **Completion**: [success | degraded-success | aborted]
## Core Arguments by Side
[Phase 1 output, organized by role]
## Cross Rebuttals
[Phase 2 output, organized by role]
## Evidence Audit
[Phase 2.5 output, or "Not requested"]
## Neutral Judgment
[Phase 3 sections 1-5]
## Recommendation
[Phase 3 section 6]
## Open Questions
[Phase 3 section 7]
## Scenario Matrix
[Phase 3 section 8]
> **One-line summary**: [Phase 3 section 9]
If output_path specified → write file.
Otherwise → return in conversation.
StateConditionBehaviorsuccessAll phases completed normallyFull reportdegraded-success1+ agents timed out or returned [INCOMPLETE]Report with degradation noteabortedModel pre-check failed / user cancelled planNo report; return error summary
See references/prompts.md for the exact prompt templates used in each phase.
Orchestrator builds prompts dynamically from parameters + these templates.