Council — Multi-Skill Orchestrator

A Claude Code skill that runs one request through several of your other installed skills in isolation, then either merges their answers into one or judges the single best — so you stop doing the "try skill 1, unsatisfied, new chat, try skill 2…" loop by hand.

Each selected skill runs in its own subagent that sees only that skill's instructions plus your request — nothing else. The main conversation then aggregates the results.


Why

Asking Claude to "use skill X" inside one conversation doesn't guarantee isolation — skills blend, and there's no clean way to compare skill A's take against skill B's on the same request without starting fresh chats manually. Council fixes that by giving each skill its own isolated run and combining the outputs for you.


Install (Claude Code)

Clone straight into your personal skills directory:

git clone https://github.com/himanshufound/council.git ~/.claude/skills/council

Requirements: Python 3 (standard library only — no pip installs) and Claude Code with the Agent/Task tool available. Then start a Claude Code session and run /council.

To update: git -C ~/.claude/skills/council pull.


Usage

  • /council — pick skills, pick a mode, run.
  • /council manage — rename / edit / delete / import / export saved skillsets.
  • Natural language — "run this through a few different skills and compare" will offer to launch Council (it confirms first; it won't silently fan out).

Skillsets are named, reusable groups of skills (e.g. a "Design Review" set = minimalist-ui + web-design-guidelines). Create them once, re-run them anytime. Your most recent run is remembered and offered as a one-click re-run.

Two aggregation modes:

  • Combined — synthesize the distinct strengths of every skill's answer into one coherent response.
  • Best — silently judge which single answer is strongest and present that.

By default you see only the final aggregated answer. Ask "show me each one" afterward and Council reveals the labeled per-skill outputs from that run — no re-running needed.

If a skill errors or is missing, the rest still run and the final answer notes which one dropped out.


What's in this repo

council/
├── SKILL.md                  # the Claude Code skill (orchestration guidance)
├── scripts/
│   ├── discover_skills.py    # scans both skill scopes, parses frontmatter
│   └── skillset_store.py     # read/write/edit/import/export skillsets.json
├── council-lite/
│   └── SKILL.md              # a claude.ai-compatible version (see below)
└── evals/
    └── evals.json            # test prompts used to validate the skill

skillsets.json is not in the repo — it's your private state, created on first run at ~/.claude/skills/council/skillsets.json, and git-ignored.


Claude Code vs. claude.ai — two versions, on purpose

The full skill depends on four things that only Claude Code (and the Agent SDK) provide: parallel isolated subagents, Bash/Python execution, the AskUserQuestion structured picker, and filesystem skill discovery. The claude.ai web app has none of these, so the full skill can't run there.

council-lite/ is a deliberately simpler version that works within claude.ai's constraints:

Council (Claude Code) Council Lite (claude.ai)
Skill discovery Auto-scans ~/.claude/skills/ + project scope You name the skills/approaches
Isolation True separate subagents Sequential passes in one context (best-effort)
Selection UI AskUserQuestion picker Plain conversational prompts
Saved skillsets Persisted JSON store Stateless — chosen each time
Execution Parallel Sequential

Council Lite is genuinely useful but weaker: because claude.ai runs everything in a single context, its "isolation" is Claude producing each answer as independently as it can, not a hard wall. If you need real isolation, use the Claude Code version. Install Lite by uploading the council-lite/ folder as a skill via claude.ai → Settings → Capabilities → Skills.


Isolation & trust model

Read this before adding skills to a council. Isolation is achieved by prompt construction, not sandboxing. A dispatched skill runs in a subagent with the same tool access any subagent has — file reads, Bash, network, etc. Putting a skill on a council grants it exactly the capability it would have if you invoked it directly. Council does not add a security boundary and does not vet the skills it runs.

A skillset is only a list of skill names — it does not bundle the skill files. Importing someone's exported skillset does not install their skills, and never should be treated as a reason to install skills you haven't reviewed. Missing skills are flagged at import time and again at run time, never silently dropped. Only council skills you already trust.


Triggering is deliberately conservative

Council's description intentionally fires only on fairly explicit multi-skill language, and confirms before launching from natural language. This is by design — an orchestrator that silently spawns six subagents on an ambiguous request would be worse than useless. If you'd rather it trigger more eagerly, loosen the description field in SKILL.md.


License

MIT — see LICENSE.