open-conclave
v0.1.0
Published
Multi-agent debate orchestrator plugin for OpenCode — Captain + parallel sub-agents + dynamic debate rounds + early stopping
Readme
open-conclave
Multi-agent debate orchestrator plugin for OpenCode. Runs parallel sub-agents (Harper, Benjamin, Lucas), moderates debate rounds with a Captain, and applies early stopping when consensus is reached.
How it works
- You select the Conclave agent tab in OpenCode and ask a question
- Three sub-agents run in parallel — each from their own perspective:
- Harper — Research & Facts
- Benjamin — Logic, Math & Code
- Lucas — Creative & Alternative Perspectives
- The Captain critiques all responses and scores consensus
- Debate continues for up to 3 rounds; stops early when consensus ≥ 0.83
- The Captain synthesizes a final answer from the full debate
Installation
Add open-conclave to the plugin array in ~/.config/opencode/opencode.json. OpenCode installs it automatically on next startup — no separate install command needed.
{
"plugin": ["open-conclave"]
}You can also pin a version or use a git URL:
{
"plugin": [
"[email protected]",
"open-conclave@git+https://github.com/martinzokov/open-conclave.git"
]
}Local / development
git clone https://github.com/martinzokov/open-conclave.git
cd open-conclave
bun install
bun run build
cp dist/index.js ~/.config/opencode/plugins/conclave.jsThen register by file path:
{
"plugin": ["/Users/you/.config/opencode/plugins/conclave.js"]
}Configuration
Conclave uses whichever model you have active in OpenCode as the default for all agents. You can override each agent individually in your OpenCode config:
{
"plugins": ["open-conclave"],
"agent": {
"conclave-captain": {
"model": "github-copilot/claude-sonnet-4.5"
},
"conclave-harper": {
"model": "github-copilot/gpt-4.1"
},
"conclave-benjamin": {
"model": "github-copilot/claude-sonnet-4.5"
},
"conclave-lucas": {
"model": "github-copilot/gpt-4.1"
}
}
}Any provider/model string that OpenCode supports works here (e.g. anthropic/claude-opus-4-6, openai/gpt-4o, github-copilot/claude-sonnet-4.5).
Default agent behaviour
Captain (conclave-captain)
Expert debate moderator and synthesizer. Handles three internal tasks:
- CRITIQUE — after each round, scores consensus (0.0–1.0), measures uncertainty improvement, and lists up to 2 open issues. Stops the debate early when consensus ≥ 0.83.
- SYNTHESIZE — produces the final answer from the full debate history. This is what the user sees.
The Captain's persona controls the language and tone of the final output.
Harper (conclave-harper)
Research & Facts — provides accurate, well-sourced factual analysis. Cites evidence where possible. Focuses on empirical data, historical context, verified claims, and source reliability.
Benjamin (conclave-benjamin)
Logic, Math & Code — provides rigorous logical analysis, mathematical reasoning, and technical evaluation. Focuses on formal correctness, algorithmic thinking, edge cases, and code quality.
Lucas (conclave-lucas)
Creative & Alternative Perspectives — challenges assumptions, offers creative solutions, and considers user experience. Focuses on unconventional approaches, human impact, design thinking, and unexplored angles.
Sub-agent response format
Each sub-agent always responds with a structured JSON object:
{
"agentName": "Harper",
"role": "Research & Facts",
"claims": [{ "text": "claim text", "confidence": 0.9 }],
"reasoning": "brief internal reasoning (≤40 words)",
"uncertainties": ["any unknowns or caveats"],
"answer": "direct answer to the query (100–150 words)"
}The format section of the system prompt is always preserved — persona overrides only replace the identity/role/focus section, so the JSON output is never broken by a custom persona.
Customising agent personas
Each agent has two parts to its system prompt:
- Persona — identity, role, and focus instructions (customisable via
persona) - Format — JSON schema requirements for sub-agents (always preserved)
Use the persona field in your opencode.json to replace the identity and focus of any agent. The JSON output format for sub-agents is never affected, so responses always parse correctly regardless of persona overrides.
The persona field applies to all five agents:
| Agent | Key | Role |
|---|---|---|
| Captain | conclave-captain | Moderator and final synthesizer |
| Harper | conclave-harper | Research & Facts |
| Benjamin | conclave-benjamin | Logic, Math & Code |
| Lucas | conclave-lucas | Creative & Alternative Perspectives |
How persona is applied: OpenCode stores persona in multiple config fields internally. The plugin intercepts the config hook and merges your persona string into the full system prompt (persona section + format section), updating all internal fields consistently. This means the persona works reliably regardless of OpenCode's internal config processing.
The final output language is controlled by the Captain's persona — set persona on conclave-captain to affect the synthesized answer. Setting it only on sub-agents changes how they reason internally but the Captain will synthesize in its default language.
{
"agent": {
"conclave-captain": {
"persona": "You are the Captain. You only respond in French."
},
"conclave-harper": {
"persona": "You are Harper, a financial analyst specialising in markets and macroeconomics.\n\nYour role: analyse economic trends, market data, and investment implications.\nFocus on: macroeconomic indicators, sector performance, risk factors, and data-driven forecasts.\nKeep \"reasoning\" under 40 words. Write a thorough \"answer\" — aim for 100–150 words."
},
"conclave-benjamin": {
"persona": "You are Benjamin, a security researcher and penetration tester.\n\nYour role: evaluate systems for vulnerabilities, attack surfaces, and defence weaknesses.\nFocus on: threat modelling, CVEs, exploit chains, and hardening recommendations.\nKeep \"reasoning\" under 40 words. Write a thorough \"answer\" — aim for 100–150 words."
},
"conclave-lucas": {
"persona": "You are Lucas, a climate scientist and sustainability strategist.\n\nYour role: consider environmental impact, long-term sustainability, and ecological trade-offs.\nFocus on: carbon footprint, resource consumption, systemic risks, and green alternatives.\nKeep \"reasoning\" under 40 words. Write a thorough \"answer\" — aim for 100–150 words."
}
}
}The default persona for each agent is used when no override is set.
Usage
TUI (interactive)
- Open OpenCode in your project directory
- Press Tab to select the Conclave agent
- Type your question and press Enter
The debate runs automatically and the final synthesized answer is returned.
CLI (non-interactive)
opencode run --agent conclave -m github-copilot/claude-sonnet-4.5 "What is the best database for read-heavy workloads?"Slash command (from any agent)
/conclave What are the tradeoffs between microservices and a monolith?Tool options
When calling the conclave tool directly, three optional arguments are available:
| Argument | Type | Default | Description |
| ----------- | ------- | -------- | -------------------------------------------------- |
| query | string | required | The question or task to deliberate on |
| maxRounds | number | 3 | Max debate rounds (1–10) |
| debug | boolean | false | Return full debate transcript alongside the answer |
Debug mode example:
/conclave --debug Should we rewrite this service in Rust?Debugging
To see per-step timing during a run:
opencode run --agent conclave -m github-copilot/claude-sonnet-4.5 --print-logs "Your question" 2>&1 | grep '\[conclave\]'Output looks like:
[conclave] start model=github-copilot/claude-sonnet-4.5 maxRounds=3
[conclave] round 1 sub-agents start count=3
[conclave] round 1 conclave-harper done 12.1s
[conclave] round 1 conclave-benjamin done 14.3s
[conclave] round 1 conclave-lucas done 15.2s
[conclave] round 1 sub-agents done 15.2s
[conclave] round 1 critique done 6.8s
[conclave] round 1 stop=true consensus=0.91 reason=consensus_reached
[conclave] synthesize done 11.4s
[conclave] total 40.0s rounds=1Development
bun install # install dependencies
bun run build # build dist/index.js
bun test # run tests
bun run lint # lint
bun run lint:fix # fix lint issues
bun run format # format with PrettierTo test locally against a live OpenCode install:
bun run build && cp dist/index.js .opencode/plugins/conclave.js
opencode run --agent conclave -m <provider/model> --print-logs "test query"License
MIT — see LICENSE.
