From claude-council
Spawns independent Claude subagents as a local-only council when no external AI providers are configured. Each member answers from a single role blind to others, then synthesizes perspectives. Invoked via --local or as a fallback.
How this skill is triggered — by the user, by Claude, or both
Slash command
/claude-council:local-council-executionThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
When no external providers are configured, convene a council of independent
When no external providers are configured, convene a council of independent Claude subagents instead. Each member answers from one role, blind to the others; you then synthesize the spread of perspectives.
Read this first — the honest framing is not optional. Every member is Claude. They share priors and training, so agreement between them is weak signal, not validation. The value here is independent angles and blind-spot coverage, not consensus. The output you produce MUST make this explicit and MUST NOT present member agreement as if it were cross-vendor corroboration.
A local council is the fallback for when no real providers exist — it is not a default way to "use the council". Only proceed if one of these holds:
--local, orIf you reached this skill any other way, verify providers are actually absent before spawning anything:
bash ${CLAUDE_PLUGIN_ROOT}/scripts/query-council.sh --list-default 2>&1 | head -1
If that lists one or more providers and the user did not ask for --local,
STOP — do not spawn local members. Run the standard cross-vendor flow
(council-execution) so the real providers answer, since same-model role-play is
strictly weaker than the cross-vendor council the user can actually get.
Source the libs once:
source ${CLAUDE_PLUGIN_ROOT}/scripts/lib/prompts.sh
source ${CLAUDE_PLUGIN_ROOT}/scripts/lib/roles.sh
If the user passed --roles, it already says both which lenses and how many
members — use it directly and skip the size question:
local_council_roles "<--roles value>"
Otherwise, ask the user how many members to convene, then resolve that many:
AskUserQuestion:
Question: "How many independent perspectives should the local council convene? More members means broader angle coverage, but a longer run and synthesis."
Header: "Members"
multiSelect: false
Options:
- "4 (Recommended) - balanced breadth"
- "3 - quick, three sharpest lenses"
- "5 - thorough"
- "6 - exhaustive"
Then pass the chosen number as the count:
local_council_roles "" "<chosen number>"
local_council_roles returns a comma-separated role list (e.g.
devil,simplicity,security,scalability). Each role becomes one council member;
N = number of roles. It draws from a diverse ordering and clamps to the 8
available roles — a user who wants more or specific lenses can pass --roles
(e.g. --roles=security,devil,simplicity,scalability,dx,compliance). If you want
to be safe, validate_roles "<list>" returns non-zero on an unknown role.
Build the text each member will answer:
--file or auto-context (the same context the
cross-vendor flow would send). Include it inline so members can reason about it
even though they will also read referenced files themselves.For each role, build the role-injected prompt and spawn one member. See
agent-prompt-template.md for the exact prompt and the
build_prompt_with_role call.
Launch all members in a single message (multiple Agent tool calls) with:
subagent_type: "general-purpose"run_in_background: trueThe member framing (independent, blind to the others, commit to the assigned lens, return format) lives in the prompt itself — see the template. Launching them together runs them concurrently and keeps each one blind to the others.
You are notified automatically as each background member finishes. Wait for ALL of them before synthesizing. If a member fails or times out, note it and continue with the rest.
Lead with this banner verbatim (it sets honest expectations):
Local council — these perspectives all come from Claude playing different roles, not from different AI vendors. Treat agreement as a shared starting point to pressure-test, not as independent confirmation.
Then, for each member, display its perspective under a header naming the role
(use get_role_name "<role>" for the display name):
## 🗳️ {ROLE_NAME}
{member's Position / Key points / Risks & blind spots / Confidence}
Because members share a model, frame the synthesis around spread and coverage, NOT agreement strength:
mkdir -p .claude/council-cache
Write the full output (banner + all member perspectives + synthesis) to
.claude/council-cache/local-council-{TIMESTAMP}.md where TIMESTAMP is the
current Unix timestamp. Then tell the user:
Local council saved to
.claude/council-cache/local-council-{TIMESTAMP}.mdFor cross-vendor perspectives, configure a provider key or install a CLI (/claude-council:statusshows what's available).
npx claudepluginhub hex/claude-marketplace --plugin claude-councilSpawns parallel Claude subagents to query providers, evaluate response quality, and return structured insights with confidence ratings and blind spot analysis. For complex architectural decisions or with --agents flag.
Runs a configurable multi-LLM council with personas, budget caps, synthesis, veto gates, and optional implementation handoff via the orchestrate.sh runner.
Orchestrates three-phase LLM consensus protocol coordinating Claude, OpenAI Codex, and Google Gemini CLIs for collaborative code review, multi-model problem-solving, and decision-making.