Multi-agent council plugin for OpenCode — structured debate for hard questions across any domain.
The council runs 4 specialist perspectives (Researcher, Logician, Creative, Critic) in parallel across structured debate rounds, then a Synthesizer produces the final answer. Works for ethics, strategy, policy, science, design — any question where a single perspective is likely to miss something important.
Good for: complex decisions with genuine trade-offs, ambiguous ethical or strategic questions, policy analysis, design choices where reasonable people disagree, any question where you suspect a single model's first answer is incomplete.
Not for: simple factual lookups ("what is the capital of France?"), closed-ended questions with a single verifiable answer. Research shows debate-style critique can decrease accuracy on factual retrieval tasks — the council is a reasoning tool, not a search engine (Du et al., 2023; Valmeekam et al., 2023).
Add to opencode.json in your project root:
{
"plugin": ["@roderickoxen/opencode-council"]
}Or globally in ~/.config/opencode/opencode.json. OpenCode installs it automatically at startup using Bun.
Three ways to invoke the council:
Slash command (from any agent):
/council Should we migrate our monolith to microservices?
Tool call — the model invokes the council tool automatically when it determines a question warrants multi-perspective debate.
TUI — select the council agent (purple) in the agent picker and type your question directly.
Override per-member models in opencode.json. The council uses your default model for all members unless you specify otherwise.
{
"agent": {
"council-researcher": { "model": "openai/gpt-4o" },
"council-logician": { "model": "anthropic/claude-sonnet-4-6" },
"council-creative": { "model": "google/gemini-pro" },
"council-critic": { "model": "anthropic/claude-sonnet-4-6" },
"council-synthesizer": { "model": "anthropic/claude-opus-4-6" }
}
}| Setting | How to set | Default |
|---|---|---|
| Per-member model | agent.council-<role>.model in opencode.json |
Your default model |
| Max debate rounds | maxRounds arg to the council tool |
3 |
| Consensus rule | consensusMode arg ("unanimous" or "majority") |
"unanimous" |
| Debug transcript | debug: true arg to the council tool |
false |
| Role | Agent name | Mandate | Acceptance bar |
|---|---|---|---|
| Researcher | council-researcher |
Provide accurate, evidence-based analysis. Distinguish what is empirically known from what is assumed or speculated. Cite concrete evidence, historical analogues, or documented precedents. | Reject claims that lack verifiable evidence, falsifiable criteria, or a way to confirm the promised outcome. Flag unverified assumptions explicitly. |
| Logician | council-logician |
Provide rigorous logical analysis, identify edge cases, check internal consistency, and evaluate whether conclusions actually follow from the premises. Surface the sharpest counterexample. | Reject arguments that contain logical fallacies, ignore stated constraints, paper over edge cases, or whose conclusions do not follow from their premises. |
| Creative | council-creative |
Challenge the dominant framing. Offer alternative problem definitions, unconventional approaches, and surface second-order effects and human impact that the other perspectives may overlook. | Reject solutions that are technically correct but ignore human factors, assume the current problem framing is the only valid one, or fail to account for second-order consequences. |
| Critic | council-critic |
Identify weaknesses, risks, and blind spots. Play devil's advocate. Accept a proposal only when you genuinely cannot find a credible objection — not when it merely sounds reasonable. | Reject arguments that paper over risks, overstate confidence, lack a credible failure model, or rely on assumptions that have not been stress-tested. |
| Synthesizer | council-synthesizer |
Produces the final answer — not a voting member | — |
| Entry point | council |
Routes questions to the council tool | Primary agent |
- Opening: all 4 members state initial positions in parallel
- Rounds (up to 3, configurable):
- Rotating proposer drafts a resolution
- All 4 members vote independently against their acceptance bar
- If not unanimous (or majority, if configured): members respond to objections and the next round begins
- Early stop: consensus reached when all votes are "accept"
- Synthesis: the Synthesizer produces the final answer covering the council's best answer, points of genuine agreement, unresolved tensions, and the most important open question
Roughly 5–10× more tokens than a single model call for approximately 15–20% better reasoning on hard questions (Du et al., arXiv:2305.14325). Members run in parallel so wall-clock time is roughly 2–3× a single call.
Use deliberately. The council is not a replacement for a good prompt — it is a tool for questions where that is not enough.
git clone https://github.com/RoderickOxen/opencode-council.git
cd opencode-council
bun install
bun run test # 77 tests
bun run build # produces dist/MIT — see LICENSE