---
name: llm-council
description: Orchestrate multi-LLM parallel debate and synthesis. Dispatches prompts to available omega CLI wrappers in parallel, collects independent responses, runs anonymized peer review ranking, and synthesizes via a chairman model. No server required.
version: 1.0.0
model: sonnet
invoked_by: both
user_invocable: true
tools: [Bash, Read, Write]
args: '"PROMPT" [--models MODEL1,MODEL2,...] [--chairman MODEL] [--skip-review] [--timeout-ms N]'
best_practices:
- Always check available CLIs before dispatching (run verify-setup.mjs for each)
- Use at least 3 models for meaningful peer review rankings
- Set --timeout-ms per model to prevent one slow model from blocking the council
- Anonymize responses before peer review to prevent model identity bias
- Store council results in .claude/context/tmp/ for downstream consumption
error_handling: graceful
streaming: not_supported
verified: true
lastVerifiedAt: 2026-02-22T00:00:00.000Z
---
# LLM Council Skill
Multi-LLM deliberation orchestrator. Implements a 3-stage council process:
Stage 1 (parallel independent responses) -> Stage 2 (anonymized peer review with ranking) ->
Stage 3 (chairman synthesis). Uses omega CLI wrapper skills for model invocation.
No server required -- pure Bash-level orchestration.
- Parallel dispatch to multiple LLM CLIs (Gemini, Codex, Cursor, Claude)
- Dynamic availability detection (only dispatches to available CLIs)
- 3-stage council protocol:
- Stage 1: Independent parallel responses
- Stage 2: Anonymized peer review with FINAL RANKING
- Stage 3: Chairman synthesis of all inputs
- Anonymized labeling (Response A, B, C...) to prevent model identity bias
- Configurable chairman model (default: current Claude session)
- Per-model timeout enforcement
- Graceful degradation (skips unavailable models)
- Structured output with all 3 stages preserved
## Council Protocol
### Stage 1: Independent Responses
Dispatch the user's prompt to all available omega CLIs in parallel:
```bash
# Check availability
node .claude/skills/omega-gemini-cli/scripts/verify-setup.mjs && HAS_GEMINI=1
node .claude/skills/omega-codex-cli/scripts/verify-setup.mjs && HAS_CODEX=1
node .claude/skills/omega-claude-cli/scripts/verify-setup.mjs && HAS_CLAUDE_CLI=1
node .claude/skills/omega-cursor-cli/scripts/verify-setup.mjs && HAS_CURSOR=1
# Parallel dispatch to available CLIs
TMPDIR=$(mktemp -d)
[ "$HAS_GEMINI" = "1" ] && node .claude/skills/omega-gemini-cli/scripts/ask-gemini.mjs "$PROMPT" --timeout-ms 120000 > "$TMPDIR/gemini.txt" 2>"$TMPDIR/gemini.err" &
[ "$HAS_CODEX" = "1" ] && node .claude/skills/omega-codex-cli/scripts/ask-codex.mjs "$PROMPT" --timeout-ms 120000 > "$TMPDIR/codex.txt" 2>"$TMPDIR/codex.err" &
[ "$HAS_CLAUDE_CLI" = "1" ] && node .claude/skills/omega-claude-cli/scripts/ask-claude.mjs "$PROMPT" --timeout-ms 120000 > "$TMPDIR/claude.txt" 2>"$TMPDIR/claude.err" &
[ "$HAS_CURSOR" = "1" ] && node .claude/skills/omega-cursor-cli/scripts/ask-cursor.mjs "$PROMPT" --yolo --trust --timeout-ms 120000 > "$TMPDIR/cursor.txt" 2>"$TMPDIR/cursor.err" &
wait
```
### Stage 2: Anonymized Peer Review
1. Collect all successful Stage 1 responses
2. Assign anonymous labels: Response A, Response B, Response C, ...
3. Maintain label_to_model mapping (e.g., A=gemini, B=codex, C=claude)
4. Send all anonymized responses back to each available model with:
```
You are reviewing responses to this question: "$PROMPT"
Response A:
[content]
Response B:
[content]
Response C:
[content]
Evaluate each response for accuracy, completeness, and reasoning quality.
Then provide your FINAL RANKING (best to worst):
1. Response [X]
2. Response [Y]
3. Response [Z]
```
1. Parse FINAL RANKING from each reviewer's output using regex: `\d+\.\s*Response [A-Z]`
2. Compute aggregate ranking (average position across all reviewers)
### Stage 3: Chairman Synthesis
Send to chairman model (default: current Claude session or ask-claude.mjs):
```
You are the Chairman synthesizing a multi-model council discussion.
Original question: "$PROMPT"
Stage 1 Responses (with de-anonymized model names):
[Model]: [Response]
...
Stage 2 Peer Review Rankings:
Aggregate ranking: [best to worst with scores]
Synthesize the best insights from all responses into a single comprehensive answer.
Highlight areas of consensus and dissent. Provide the strongest possible answer.
```
## Usage
### Full council (all available models)
```bash
Skill({ skill: 'llm-council' })
# Then in agent: run full council protocol above
```
### Quick consultation (skip peer review)
```bash
# Stage 1 only -- parallel dispatch, collect responses, skip ranking
# Use when speed matters more than rigorous evaluation
```
## When to Use
- High-stakes architectural decisions requiring multiple perspectives
- Code review where diverse model viewpoints reduce blind spots
- Plan critique and validation
- Resolving disagreements about implementation approach
- Cross-validation of security analysis
- When the user explicitly requests "council", "multiple perspectives", or "cross-validate"
## Iron Laws
1. ALWAYS check CLI availability before dispatch -- never assume a model is present
2. ALWAYS anonymize responses before peer review -- model identity bias is real
3. NEVER skip Stage 2 for high-stakes decisions -- the peer review is the core innovation
4. ALWAYS preserve all 3 stages in output for transparency
5. ALWAYS set per-model timeout to prevent one slow model from blocking the council
## Anti-Patterns
| Anti-Pattern | Why Bad | Correct Approach |
| -------------------------------------- | ------------------------------------ | --------------------------------------- |
| Dispatching to unavailable CLIs | Silent failure, missing responses | Run verify-setup.mjs first |
| Showing model names during peer review | Introduces identity bias | Use anonymous labels (Response A, B, C) |
| Using only 2 models for council | Peer review meaningless with 2 | Require minimum 3 for ranking value |
| Ignoring failed model responses | May miss degradation | Log failures, include in metadata |
| Running council for simple questions | Massive overhead for trivial queries | Reserve for high-stakes decisions |
## Exit Codes
| Code | Meaning |
| ---- | --------------------------------------------------------------- |
| 0 | Council completed successfully (at least 2 models responded) |
| 1 | Council failed (fewer than 2 models available or all timed out) |
## Configuration
| Env Var | Default | Purpose |
| ------------------------ | ----------------- | ---------------------------------------------- |
| `LLM_COUNCIL_TIMEOUT_MS` | 120000 | Per-model timeout for Stage 1 and Stage 2 |
| `LLM_COUNCIL_MIN_MODELS` | 2 | Minimum models required for council to proceed |
| `LLM_COUNCIL_CHAIRMAN` | (current session) | Chairman model for Stage 3 synthesis |
## Integration Notes
- This skill does NOT require the llm-council-master FastAPI server
- Uses omega wrapper scripts directly via Bash backgrounding for parallelism
- Anonymized peer review is preserved from llm-council-master's design (its core innovation)
- Chairman synthesis can use the current Claude session (no additional CLI call needed)
- Temporary files stored in system temp dir, cleaned up after council completes
- Minimum 2 available models required for council to proceed