.claude/skills/llm-council/SKILL.md
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. Supports collaboration templates, idle watchdog, inter-agent messaging, worktree isolation, and multi-turn sessions. No server required.
npx skillsauth add oimiragieo/agent-studio llm-councilInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Dispatch the user's prompt to all available omega CLIs in parallel:
# 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
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]
\d+\.\s*Response [A-Z]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.
Skill({ skill: 'llm-council' })
# Then in agent: run full council protocol above
# Stage 1 only -- parallel dispatch, collect responses, skip ranking
# Use when speed matters more than rigorous evaluation
| 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 |
| Code | Meaning | | ---- | --------------------------------------------------------------- | | 0 | Council completed successfully (at least 2 models responded) | | 1 | Council failed (fewer than 2 models available or all timed out) |
| 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 |
Templates constrain each model's focus during council sessions, producing higher-quality synthesis than sending the same generic prompt to all models. Without a --template flag, the council operates in its default mode (all models receive the same prompt).
| Field | Value | | ------------- | ------------------------------------------------------------------------------------ | | Agents | 2-3 (minimum 2) | | Focus | Each agent reviews from their model's strengths (correctness, security, performance) | | Synthesis | Chairman merges non-overlapping findings, deduplicates shared findings |
Roles:
roles:
- name: correctness-reviewer
focus: 'Review for logic errors, edge cases, off-by-one bugs, and correctness'
- name: performance-reviewer
focus: 'Review for performance bottlenecks, algorithmic complexity, and scalability'
- name: security-reviewer
focus: 'Review for security vulnerabilities, injection vectors, and data exposure'
synthesis_strategy: 'merge-by-category'
When to use: Code reviews, PR reviews, audit passes where multiple review dimensions matter.
| Field | Value | | ------------- | ------------------------------------------------------------------------ | | Agents | 2-4 (minimum 2) | | Focus | Plan, execute, verify staged workflow with sequential handoff | | Synthesis | Sequential -- architect output feeds implementer, verifier checks result |
Roles:
roles:
- name: architect
focus: 'Design the approach, define interfaces, data flow, and module boundaries'
- name: implementer
focus: "Write the implementation following the architect's design exactly"
- name: verifier
focus: 'Verify the implementation matches the design and passes acceptance criteria'
synthesis_strategy: 'sequential'
When to use: Feature implementation where design and coding benefit from separation of concerns.
| Field | Value | | ------------- | ------------------------------------------------------------------------- | | Agents | 2-3 (minimum 2) | | Focus | Independent investigation of the same topic, then cross-compare findings | | Synthesis | Side-by-side comparison matrix highlighting contradictions and agreements |
Roles:
roles:
- name: researcher-a
focus: 'Research the topic independently, cite sources, provide evidence-backed findings'
- name: researcher-b
focus: 'Research the same topic independently from a different angle, cite sources'
synthesis_strategy: 'compare-and-converge'
When to use: Technology evaluation, best-practice research, exploring solution spaces.
| Field | Value | | ------------- | ------------------------------------------------------------------------- | | Agents | 2-3 (minimum 2) | | Focus | Each agent independently diagnoses the same bug and proposes a fix | | Synthesis | Convergence analysis -- if 2+ agents agree on root cause, high confidence |
Roles:
roles:
- name: diagnostician-a
focus: 'Independently reproduce and diagnose the bug, propose root cause and fix'
- name: diagnostician-b
focus: 'Independently reproduce and diagnose the bug, propose root cause and fix'
synthesis_strategy: 'convergence'
When to use: Hard-to-diagnose bugs where independent analysis reduces bias.
# Invoke with template
Skill({ skill: 'llm-council', args: '--template review' })
Skill({ skill: 'llm-council', args: '--template implementation' })
Skill({ skill: 'llm-council', args: '--template research' })
Skill({ skill: 'llm-council', args: '--template debug' })
When a --template is specified:
synthesis_strategy to guide synthesis:
merge-by-category: Merge findings by review category, deduplicatesequential: Present outputs in role order, highlight handoff pointscompare-and-converge: Build side-by-side comparison matrixconvergence: Report agreement/disagreement on root cause, confidence scorePer-model idle monitoring with two-tier thresholds to detect hung or stalled models during council sessions.
| Tier | Threshold | Action | | ----------------- | ------------------------ | --------------------------------------------- | | Idle Warning | 90 seconds of no output | Log warning, optionally send nudge prompt | | Stall Timeout | 180 seconds of no output | Terminate model process, exclude from results |
watchdog:
idle_warning_seconds: 90
stall_timeout_seconds: 180
nudge_prompt: 'Please continue with your analysis.'
action_on_stall: 'exclude' # exclude | retry | fail
| Env Var | Default | Purpose |
| ----------------------------- | ------- | --------------------------------- |
| LLM_COUNCIL_IDLE_WARNING_S | 90 | Seconds before idle warning |
| LLM_COUNCIL_STALL_TIMEOUT_S | 180 | Seconds before stall auto-exclude |
During parallel dispatch, each backgrounded model process is monitored independently:
idle_warning_seconds, log a warningstall_timeout_seconds, kill the process and set stall_timeout: true in council metadata{
"watchdog": {
"gemini": { "status": "completed", "duration_s": 45 },
"codex": { "status": "stall_timeout", "duration_s": 180, "excluded": true },
"claude": { "status": "completed", "duration_s": 62 }
}
}
The watchdog is additive to the existing --timeout-ms global timeout. --timeout-ms remains the hard ceiling for the entire council session. The watchdog provides per-model granularity within that ceiling.
Optional JSONL message file protocol that enables council members to share partial outputs during deliberation.
By default, council models work in complete isolation during Stage 1. The message bus enables optional partial-output sharing, useful for long deliberations where early findings from one model can inform others.
Enable with --enable-messaging flag. Without this flag, no message directory is created and the council operates in default isolated mode.
Location: .claude/context/tmp/council-<session-id>/messages.jsonl
Message Schema:
{
"id": "msg-001",
"session_id": "council-2026-03-21-abc123",
"from": "gemini",
"to": "team",
"type": "partial_output",
"content": "Partial finding: JWT implementation has XSS risk in refresh flow",
"timestamp": "2026-03-21T10:30:00Z"
}
Message Types:
| Type | Purpose | When Sent |
| ---------------- | --------------------------------------------- | ------------------------------------------------- |
| partial_output | Share an intermediate finding or observation | During Stage 1, when a model has a partial result |
| question | Ask the team a clarifying question | During Stage 1, when a model needs input |
| agreement | Signal agreement with another model's finding | During Stage 2, after reading peer outputs |
| disagreement | Signal disagreement with reasoning | During Stage 2, after reading peer outputs |
messages.jsonl during Stage 1 executionmessages.jsonl between Stage 1 and Stage 2 for informed reviewThe session directory (.claude/context/tmp/council-<session-id>/) is deleted after the council completes, including the messages file.
Optional per-agent git worktree isolation for council sessions where agents modify code.
Worktree isolation is relevant only for templates that modify code:
| Template | Worktree Applicable? | Reason | | -------------- | -------------------- | ----------------------------------- | | Review | No | Read-only analysis | | Implementation | Yes | Agents write code that may conflict | | Research | No | Read-only research | | Debug | Yes | Agents may apply experimental fixes |
Enable with --use-worktrees flag. Only takes effect when combined with --template implementation or --template debug.
Create: For each participating agent, create a worktree:
git worktree add .claude/context/tmp/council-<session-id>/<agent-name> -b council/<session-id>/<agent-name>
Execute: Each agent operates within its isolated worktree directory. File modifications do not conflict across agents.
Merge: After council completes, the chairman reviews diffs from each worktree branch and merges non-conflicting changes back to the source branch.
Cleanup: Remove worktrees and branches:
git worktree remove .claude/context/tmp/council-<session-id>/<agent-name>
git branch -D council/<session-id>/<agent-name>
When worktrees have overlapping changes to the same files:
Worktree isolation follows existing agent-studio worktree safety rules. On Windows, ensure paths stay under the OS path length limit. Reference .claude/rules/ for worktree safety patterns.
Persistent session state that allows council deliberations to span multiple turns with user feedback between rounds.
By default, each council invocation is one-shot. Multi-turn sessions enable iterative refinement: the user reviews the synthesis, provides feedback, and the council continues deliberation with the additional context.
--multi-turn: Create a resumable session (generates a session ID)--resume SESSION_ID: Continue a previous session with new user inputLocation: .claude/context/tmp/council-<session-id>/session.json
Schema:
{
"session_id": "council-2026-03-21-abc123",
"status": "active",
"turn_count": 2,
"max_turns": 5,
"original_prompt": "Review this auth implementation",
"template": "review",
"models": ["gemini", "codex", "claude"],
"turns": [
{
"turn": 1,
"stage_1_responses": { "gemini": "...", "codex": "...", "claude": "..." },
"stage_2_rankings": { "aggregate": ["gemini", "claude", "codex"] },
"stage_3_synthesis": "...",
"user_feedback": "Focus more on the JWT refresh flow"
}
],
"created_at": "2026-03-21T10:00:00Z",
"last_active": "2026-03-21T10:15:00Z"
}
When --resume SESSION_ID is used:
Load session.json from the session directory
Verify session is not expired (24-hour TTL from last_active)
Include previous turns' synthesis and user feedback in the next Stage 1 prompt:
Previous council synthesis: [Stage 3 output from last turn]
User feedback: [feedback text]
Continue the analysis with this additional context.
Models receive full conversation history for context continuity
Increment turn_count and update last_active
| Env Var | Default | Purpose |
| ----------------------- | ------- | ----------------------------------------------- |
| LLM_COUNCIL_MAX_TURNS | 5 | Maximum turns per session before forced closure |
Sessions older than 24 hours are considered expired. Attempting to --resume an expired session returns an error with the session's last synthesis as context.
Session directories are cleaned up when:
max_turns--resume after final turn)tools
Comprehensive biosignal processing toolkit for analyzing physiological data including ECG, EEG, EDA, RSP, PPG, EMG, and EOG signals. Use this skill when processing cardiovascular signals, brain activity, electrodermal responses, respiratory patterns, muscle activity, or eye movements. Applicable for heart rate variability analysis, event-related potentials, complexity measures, autonomic nervous system assessment, psychophysiology research, and multi-modal physiological signal integration.
tools
Comprehensive toolkit for creating, analyzing, and visualizing complex networks and graphs in Python. Use when working with network/graph data structures, analyzing relationships between entities, computing graph algorithms (shortest paths, centrality, clustering), detecting communities, generating synthetic networks, or visualizing network topologies. Applicable to social networks, biological networks, transportation systems, citation networks, and any domain involving pairwise relationships.
data-ai
Molecular featurization for ML (100+ featurizers). ECFP, MACCS, descriptors, pretrained models (ChemBERTa), convert SMILES to features, for QSAR and molecular ML.
development
Run Python code in the cloud with serverless containers, GPUs, and autoscaling. Use when deploying ML models, running batch processing jobs, scheduling compute-intensive tasks, or serving APIs that require GPU acceleration or dynamic scaling.