Best for
- The question has genuine tradeoffs with no clear correct answer
- You want multi-perspective analysis to surface hidden assumptions
- A decision would benefit from adversarial collaboration
magnus919/agent-skills/agent-council/SKILL.md
Multi-agent structured debate system. Spawn a panel of expert agents to debate any question, with convergence-aware iteration and typed synthesis output. Run via `agent-council` CLI. Compatible with any AI agent harness that supports agentskills.io skills (Claude Code, Cursor, Hermes Agent, OpenHands, etc.).
Decision brief
Spawn a panel of expert agents to debate any question. The council runs a structured protocol — compose, premortem, position, cross-examination (iterative), synthesis — and produces a decision landscape with convergence diagnostics.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Declared | Source record | Install path and trigger |
| Cursor | Declared | Source record | Install path and trigger |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/magnus919/agent-skills --skill "agent-council"Inspect the Agent Skill "agent-council" from https://github.com/magnus919/agent-skills/blob/a4db8e7d4350816f02515bac12d91c8050db1e58/agent-council/SKILL.md at commit a4db8e7d4350816f02515bac12d91c8050db1e58. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
Review the “Quick Start” section in the pinned source before continuing.
pip install pydantic-ai pip install agent-council
Every synthesis output includes a post-debate verification scan. A separate LLM call reads the narrative synthesis and identifies any claims about verifiable external facts (domain availability, package namespace status, pricing, statistics) that the debate could not have verifi…
Invoke the council when any of these apply:
Review the “1. Install” section in the pinned source before continuing.
Permission review
The documentation asks the agent to run terminal commands or scripts.
python3 scripts/bootstrap.pyThe documentation asks the agent to create, modify, or delete local files.
| `--persona-file file.json` | Full control over agent identities, custom domains | Variable — depends on how you design them | Create a JSON file |The documentation asks the agent to run terminal commands or scripts.
python3 scripts/bootstrap.pyThe documentation asks the agent to create, modify, or delete local files.
You can set these as environment variables or create a `.env` file in the directory you run `agent-council` from:Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 89/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 34 | Source | Repository attention, not individual Skill quality |
| Compatibility | 2 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Spawn a panel of expert agents to debate any question. The council runs a structured protocol — compose, premortem, position, cross-examination (iterative), synthesis — and produces a decision landscape with convergence diagnostics.
Invoke the council when any of these apply:
Signal phrases: "Let's get multiple perspectives on this" / "Debate this: X" / "What would experts say about X" / "What are we missing?"
# One-time setup
pip install pydantic-ai
pip install agent-council
# Or install from this skill directory:
python3 scripts/bootstrap.py
export AGENT_COUNCIL_API_KEY="sk-..."
export AGENT_COUNCIL_MODEL="openai:gpt-5.6-luna"
agent-council "Should we use Postgres or SQLite for this service?"
agent-council [OPTIONS] <question>
Options:
--agents, -n {3,4,5,6,7} Number of agents (default: 5)
--mode, -m {quick,medium,deep} Debate depth (default: medium)
--profiles TEXT Comma-separated profile names from the hermes-profiles
library (e.g. "debugger,researcher,product-manager")
--persona-file PATH JSON file with custom agent personas
--json Output structured JSON instead of markdown
--verbose, -v Show phase-by-phase progress
--max-rounds INTEGER Max cross-examination rounds (default: 4)
--convergence FLOAT Convergence threshold (default: 0.10)
| Mode | Agents | Rounds | When to use |
|---|---|---|---|
quick | 3 | 1 cross-examine round | Low-stakes check, fast answer needed |
medium (default) | 5 | Eval-driven, up to 4 rounds | Standard decisions |
deep | 7 | Eval-driven, up to 4 rounds | High-stakes, hidden assumptions |
In a recursive source checkout, the council auto-selects relevant real professional profiles from the included hermes-profiles library. Each profile has a SOUL.md — an identity document with real methodology, values, and operating principles — rather than a fabricated persona. Pip and wheel installs do not bundle that library; use generated or user-supplied personas instead.
When no --profiles flag is given, the council scores each profile's description against your question using keyword overlap. The top N most relevant profiles are selected. This works best for focused, single-domain questions.
agent-council --profiles debugger,data-scientist,product-manager "What architecture should we choose?"
Comma-separated profile names. Available profiles include: ceo, cfo, cmo, coo, cpo, cto, curator, data-architect, data-engineer, data-scientist, debugger, editor, frontend-engineer, ml-engineer, orchestrator, product-manager, researcher, reviewer, security-engineer, site-reliability-engineer, technical-architect, technical-writer, ux-designer, verifier, wonderer, writer, and more.
Three ways to populate the council, with different tradeoffs:
| Method | Best for | Diversity | Setup |
|---|---|---|---|
--profiles (auto-select) | Single-domain questions with clear keywords | High — profiles have real SOUL.md methodology | Recursive source checkout required |
--profiles name1,name2 | Targeted debates where you know the stakeholders | Highest — you pick specific methodological voices | Recursive source checkout and profile names |
--persona-file file.json | Full control over agent identities, custom domains | Variable — depends on how you design them | Create a JSON file |
| Auto (no flag) | Default — uses profiles if available, falls back to generated | Good — varies with available profiles | No setup for generated personas; recursive source checkout for real profiles |
For most cases, let it auto-select or use --profiles with 3-5 names. Only use --persona-file when you need specific invented expertise that doesn't map to any existing profile.
If the profile library is unavailable or you want full control, use --persona-file to supply your own persona definitions. If neither --profiles nor --persona-file is provided, the council auto-selects profiles from the library; if the library is missing, it falls back to LLM-generated personas.
Compose ──► Premortem ──► Position ──► Cross-examine ──► [eval] ──► Synthesis
(1) (parallel) (parallel) (iterative loop) ↑ (1)
┌── converged ──────┐
├── diminishing_ret │
eval ───────────┼── genuine_disagr──┼──► Synthesis
└── continue ───────┘
↓
Cross-examine (next round)
| Phase | What happens | Method |
|---|---|---|
| Compose | A single LLM call generates N expert personas tuned to the question | 1 call |
| Premortem | Each agent independently imagines how the decision already failed — bypasses positional commitment bias | N parallel calls |
| Position | Each agent forms an independent position, referencing their own premortem | N parallel calls |
| Cross-examine | Each agent reads all other positions and responds — concedes, disagrees, updates confidence | N parallel calls per round |
| Eval | Convergence detection: measures dispersion, argument novelty, concession rate. Decides whether to loop or stop | Algorithmic |
| Synthesis | Collates all phases into a structured decision landscape with LLM-generated narrative | 1 call |
The council doesn't use a fixed number of rounds. After each cross-examination round, it measures:
Stopping conditions:
| Condition | Meaning |
|---|---|
converged | Dispersion below threshold, confidence stable. Genuine agreement. |
diminishing_returns | No new arguments or concessions. Nothing more to surface. |
genuine_disagreement | Dispersion widened, positions hardened. Summary of irreducible tension. |
max_rounds | Hard cap reached. Inconclusive — principal must decide. |
If agent-council is not available on PATH, the invoking agent should run:
python3 scripts/bootstrap.py
This installs the package from the skill directory using the current Python's pip, falling back to pipx. No PyPI dependency for the bootstrap path — the package ships inside the skill directory.
If bootstrap fails: Run one of these manually:
pip install pydantic-ai
pip install agent-council
# Or from this directory:
python3 -m pip install -e /path/to/agent-council/
| Env var | Required | Default | Description |
|---|---|---|---|
AGENT_COUNCIL_API_KEY | Yes | — | API key for your LLM provider |
AGENT_COUNCIL_MODEL | No | openai:gpt-5.6-luna | Model string (provider/model) |
AGENT_COUNCIL_BASE_URL | No | Provider default | Custom API endpoint (OpenRouter, LiteLLM, etc.) |
You can set these as environment variables or create a .env file in the directory you run agent-council from:
# .env file
AGENT_COUNCIL_API_KEY=sk-...
AGENT_COUNCIL_MODEL=openai:gpt-5.6-luna
Environment variables take precedence over .env file values.
Model strings follow PydanticAI convention: openai:gpt-5.6-luna, anthropic:claude-sonnet-4-20250514, deepseek:deepseek-v4-flash, google:gemini-2.0-flash.
The synthesis report is a structured decision landscape. In markdown mode it includes:
Use --json for programmatic consumption. The JSON output follows this structure:
{
"question": "string",
"mode": "quick|medium|deep",
"num_agents": 3,
"rounds_completed": 2,
"stopped_reason": "converged|max_rounds|diminishing_returns|genuine_disagreement",
"confidence_history": [
{"round": 1, "mean_confidence": 0.74, "dispersion": 0.061, "new_arguments": 20, "concessions_made": 17}
],
"shared_risks": [{"description": "...", "severity": "low|medium|high", "phase_discovered": "premortem"}],
"shared_concerns": ["..."],
"disagreements": [{"topic": "...", "positions": {"agent_a": "position_a", "agent_b": "position_b"}}],
"assumptions_per_position": {"agent_name": ["assumption1", "assumption2"]},
"principal_path": "narrative text"
}
Every synthesis output includes a post-debate verification scan. A separate LLM call reads the narrative synthesis and identifies any claims about verifiable external facts (domain availability, package namespace status, pricing, statistics) that the debate could not have verified from its own reasoning. Flagged claims are appended as a ⚠️ Claims Not Verified section:
⚠️ Claims Not Verified
The following assertions in this synthesis could not be verified
by the council's own reasoning and should be checked before acting:
• "Dialekt passes all five checks..." — domain availability:
No evidence the council checked domain registries
This is not a rejection of the synthesis — it is a quality signal. Claims in this section should be treated as hypotheses to verify, not as facts.
The confidence dispersion table tells you whether the debate was productive:
| Pattern | Meaning | What to do |
|---|---|---|
| Mean confidence DROPPED, dispersion WIDENED | Council surfaced genuine doubt — healthy debate | Trust the shared concerns; investigate the newly surfaced risks |
| Mean confidence ROSE, dispersion NARROWED | Genuine convergence — agents convinced each other | The strongest signal; highest-confidence path forward |
| Mean confidence STABLE, dispersion NARROWED | Possible false consensus — agents agreed before debating | Probe the assumptions section for shared blind spots |
| Mean confidence ROSE, dispersion WIDENED | Polarization — agents became more entrenched | The question may be genuinely irresolvable by argument alone; look for an experimental path |
stopped_reason: converged | Dispersion fell below threshold | Good — run with the recommendation |
stopped_reason: max_rounds | Hit hard cap before converging | The debate was cut off; consider a second run with --max-rounds higher or --mode quick for faster convergence |
stopped_reason: diminishing_returns | No new arguments surfaced | The council exhausted what it could discover — make a call |
stopped_reason: genuine_disagreement | Positions hardened, dispersion widened | The council could not resolve the tension. The output is valuable precisely because it maps irreconcilable disagreement — read the disagreements section carefully |
| Symptom | Cause | Fix |
|---|---|---|
| Debate fails with "Exceeded maximum output retries" | Model couldn't produce valid structured output for a phase | Retry the debate. If persistent, try a different model or add --verbose to see which agent failed. |
| Debate runs for 5+ minutes with no output | DeepSeek or slow model with many agents | Use --mode quick --agents 3 for fast turnarounds, or use --verbose to see progress in real time. |
| All agents agree immediately with high confidence | False consensus — same model shares blind spots | Check the dispersion diagnostic. Try --profiles with diverse identities to force methodological diversity. |
| "Profile X not found" warning | Typo in profile name | Run agent-council --profiles list (or check the profiles list above) for valid names. |
| Synthesis contains obvious factual errors | Agents fabricated claims during debate | Check the ⚠️ Claims Not Verified section. The guardrail reduces fabrication but cannot eliminate it. Verify any statistics, pricing, or availability claims before acting. |
Single-model debate: All agents share one LLM configuration. Diversity comes from persona definitions (system prompts with distinct backgrounds, analytical approaches, biases), not from different model instances. This minimizes setup friction — one API key, one endpoint, predictable cost.
Limitation: All agents share the model's knowledge cutoff and blind spots. The convergence diagnostics include a "possible false consensus" flag when confidence starts high and never shifts.
| File | Load when |
|---|---|
references/convergence.md | Understanding the convergence detection algorithm |
references/debate-protocol.md | Deep dive into phase structure and round design |
references/configuration.md | Provider setup, troubleshooting, model strings |
agent-council/
├── SKILL.md # This file — skill entry point
├── pyproject.toml # Pip package definition
├── README.md
├── LICENSE # MIT
├── agent_council/ # Python package
│ ├── cli.py # CLI entry point
│ ├── config.py # Env var loading
│ ├── state.py # Typed state + Pydantic models
│ ├── convergence.py # Convergence detection
│ ├── graph.py # Debate graph orchestration
│ └── phases/
│ ├── compose.py # Persona generation
│ ├── premortem.py # Failure pre-mortem
│ ├── position.py # Initial positions
│ ├── cross_examine.py # Iterative cross-examination
│ └── synthesis.py # Decision landscape
├── scripts/
│ └── bootstrap.py # First-run installation
├── templates/
│ └── personas.json # Example custom personas
└── references/
├── convergence.md
├── debate-protocol.md
└── configuration.md
Alternatives
PramodDutta/qaskills
Generate optimized test combinations using pairwise (all-pairs) testing algorithms to achieve maximum coverage with minimum test cases across multiple input parameters
PramodDutta/qaskills
Gate RAG pipelines in CI with versioned golden eval sets, per-metric thresholds, baseline drift detection, and a build that fails when retrieval or answer quality regresses.
PramodDutta/qaskills
Generate comprehensive test cases from state machine models covering all states, transitions, guard conditions, and invalid transition attempts for workflow-heavy features
PramodDutta/qaskills
Automatically generate comprehensive test cases from user stories and acceptance criteria using BDD patterns, equivalence partitioning, and risk-based prioritization