A Claude Code skill that makes multiple LLMs debate, critique each other anonymously, and synthesize a single superior answer.
SaferSkills independently audited conclave (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
DO NOT check or read `.env` or `.env.template` files. The script handles its own configuration automatically. API keys and model settings are already configured in the user's .env file, which the script finds on its own.
ALWAYS run the script first, then work with the JSON output.
# SKILL_DIR = directory containing this SKILL.md file
SKILL_DIR="$(dirname "$(realpath "$0")")" # or use the skill's known path
# Determine depth from user intent:
# "quick" / "fast" → --depth quick
# default / no modifier → --depth standard
# "deep" / "debate" / "critical" → --depth deep
python3 "${SKILL_DIR}/scripts/conclave.py" "<USER_PROMPT>" --depth <LEVEL> --raw
# Voting mode (point-based instead of ordinal ranking):
python3 "${SKILL_DIR}/scripts/conclave.py" "<USER_PROMPT>" --vote --raw
# Multi-round dialogue:
python3 "${SKILL_DIR}/scripts/conclave.py" "<USER_PROMPT>" --rounds 3 --raw
# Combined voting + dialogue:
python3 "${SKILL_DIR}/scripts/conclave.py" "<USER_PROMPT>" --vote --rounds 2 --raw
# Bias report:
python3 "${SKILL_DIR}/scripts/conclave.py" biasThe --raw flag outputs JSON. Always use `--raw`.
Run python3 <skill_dir>/scripts/conclave.py "<prompt>" --depth <level> --raw
The script will:
.env file next to the script — DO NOT manage this yourself)The JSON phase1_drafts array contains one entry per council member. Entries with "needs_claude_code": true are YOUR drafts to fill.
Example JSON structure:
{
"phase1_drafts": [
{"key": "claude", "needs_claude_code": true, "prompt": "..."},
{"key": "gemini", "content": "Gemini's response...", "elapsed": 3.2},
{"key": "gpt", "content": "GPT's response...", "elapsed": 2.8}
]
}For each needs_claude_code: true entry in phase1_drafts:
Write your OWN answer to the original prompt BEFORE reading the other models' responses. This preserves the independence of the council. Pretend you haven't seen Gemini's or GPT's answers yet.
If the JSON has "phase2_pending": true:
content to your response from Step 3/tmp/conclave_p1_$$.json (where $$ is PID or use mktemp), e.g.: TMPFILE=$(mktemp /tmp/conclave_p1_XXXXXX.json)python3 "${SKILL_DIR}/scripts/conclave.py" phase2 "$TMPFILE" --rawphase2_critiques and aggregate_rankingsrm -f "$TMPFILE"If phase2_pending is false or absent, skip this step.
In deep mode, phase2_critiques will also have needs_claude_code: true entries. Each includes a prompt field with anonymized responses ("Response A", "Response B").
Read them and provide your critique + ranking. End with:
{"ranking": ["A", "B", "C"]}Use only the single response letters, best first.
Quick mode: Present all drafts (including yours) side by side. Done.
Standard mode: Synthesize all Phase 1 drafts:
## 🏛️ Conclave Response
### Consensus
[Points where all models agree — high confidence]
### Key Insights
[Unique valuable contributions from individual models]
### Disagreements
[Where models diverged, and which position is stronger]
### Final Answer
[The best unified answer]Deep mode: Synthesize Phase 1 drafts + Phase 2 critiques + aggregate rankings:
## 🔥 Conclave Deep Debate
### The Debate
[Summary of challenges and concessions]
### Post-Debate Consensus
[Points that survived adversarial critique — very high confidence]
### Resolved Disagreements
[Issues the debate clarified]
### Aggregate Rankings
[Show the rankings from the JSON]
### Open Questions
[Legitimate remaining disagreements]
### Final Answer
[The best unified answer, informed by the full debate]Vote mode: Synthesize Phase 1 drafts + voting results:
## 🗳️ Conclave Quorum Vote
### Weighted Scores
[Points each model received from peers]
### Consensus Strength
[How strongly models agreed on the winner (0-100%)]
### Key Insights
[What the top-scored model got right]
### Disagreements
[Where voters diverged]
### Final Answer
[The best answer, informed by the quorum vote]Dialogue mode: Synthesize across rounds:
## 💬 Conclave Dialogue (N rounds)
### Evolution
[How positions changed across rounds]
### Convergence
[Points where models converged, and in which round]
### Remaining Disagreements
[Issues that persisted through all rounds]
### Final Answer
[The best answer after multi-round refinement]| Trigger | Depth | Phases | Best for |
|---|---|---|---|
/conclave quick ... | quick | 1 | Factual questions, sanity checks |
/conclave ... | standard | 1 + 3 | Analysis, code review, recommendations |
/conclave deep ... | deep | 1 + 2 + 3 | Architecture, security, critical decisions |
/conclave vote ... | vote | 1 + vote | Comparative evaluation, ranking alternatives |
/conclave ... --rounds N | any + dialogue | 1 + 2 + dialogue | Iterative refinement, consensus building |
# Core modes
conclave.py "<prompt>" --depth quick|standard|deep # Standard depth levels
conclave.py "<prompt>" --vote # Quorum voting mode
conclave.py "<prompt>" --rounds N # Multi-round dialogue
conclave.py "<prompt>" --vote --rounds N # Combined vote + dialogue
# Utilities
conclave.py doctor # Health check all models
conclave.py leaderboard # EMA-based model scores
conclave.py sessions # List saved sessions
conclave.py bias # Bias & impartiality report
conclave.py phase2 <file> --raw # Run Phase 2 from saved Phase 1
# Options
--raw JSON output only
--quiet / -q Suppress stderr progress
--estimate Cost estimate (supports --vote, --rounds)
--members k1,k2 Filter council members
--session ID Multi-turn session (new/last/<id>)
--system "..." System prompt for all models# Provider keys
ANTHROPIC_API_KEY=...
GOOGLE_GEMINI_API_KEY=...
OPENAI_API_KEY=...
XAI_API_KEY=...
OPENROUTER_API_KEY=...
# Model configuration (per member)
CONCLAVE_MEMBER_<KEY>_MODEL=...
CONCLAVE_MEMBER_<KEY>_PROVIDER=...
CONCLAVE_MEMBER_<KEY>_LABEL=...
CONCLAVE_MEMBER_<KEY>_ICON=...
CONCLAVE_MEMBER_<KEY>_LOCAL=true|false
CONCLAVE_MEMBER_<KEY>_FALLBACK_MODEL=...
# Defaults
CONCLAVE_TEMPERATURE=0.7
CONCLAVE_MAX_TOKENS=2048
CONCLAVE_TIMEOUT=120
CONCLAVE_MAX_RETRIES=3
CONCLAVE_PROVIDER_MODE=direct|openrouter
CONCLAVE_ANONYMIZE=true
CONCLAVE_SCORING_EMA_ALPHA=0.3
CONCLAVE_SESSION_TOKEN_BUDGET=20000
# Dialogue settings
CONCLAVE_MAX_ROUNDS=3 # Hard cap for --rounds
CONCLAVE_CONVERGENCE_THRESHOLD=0.85 # Early termination threshold
# Bias tracking
CONCLAVE_BIAS_TRACKING=true|false # Enable/disable bias data collectionscripts/conclave/
├── __init__.py # Public API exports
├── cli.py # CLI entry point (argparse, pretty printing)
├── config.py # .env loading, member discovery
├── cost.py # Cost estimation (supports vote/rounds)
├── orchestrator.py # Main run_conclave, phases, voting, dialogue integration
├── providers.py # HTTP callers (Anthropic, Google, OpenAI, xAI, OpenRouter)
├── progress.py # Real-time stderr progress
├── ranking.py # Ranking extraction (JSON + regex), aggregation
├── scoring.py # EMA-based model scoring, leaderboard
├── sessions.py # Multi-turn session persistence
├── voting.py # Quorum voting (point distribution, aggregation)
├── dialogue.py # Multi-round dialogue (convergence detection)
└── bias.py # Bias tracking & impartiality metrics
tests/
├── conftest.py
├── test_orchestrator.py
├── test_providers.py
├── test_ranking.py
├── test_scoring.py
├── test_sessions.py
├── test_voting.py
├── test_dialogue.py
└── test_bias.py<this_skill_dir>/scripts/conclave.pypython3 <skill_dir>/scripts/conclave.py doctor to checkAPI keys are stored in ~/.config/conclave/.env — never in the skill directory. The script loads them automatically from there. This prevents LLM agents from accidentally reading secrets when scanning skill files.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.