Council
Portable multi-model AI council and agent skills for Claude Code, Codex, and other coding agents.
npx -y skills add Synchromy/synchromy-skills --skill councilAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Convene a multi-model adversarial council to resolve a contentious decision. Spins up N fresh-context members across model families (Anthropic + OpenAI/Codex + Moonshot by default; Z.ai and xAI in gauntlet tier when provisioned) playing structured roles (Skeptic, Builder, Strategist, Operator), runs them through Position -> Cross-rebuttal -> Chair-synthesis, and emits a markdown decision packet with TL;DR, recommendation, named dissents, open questions, and transcript appendix.
SKILL.md
7.9 KB, as published. Nobody here has run it
council - multi-model adversarial decision skill
council takes a contentious decision and converges on a recommendation through structured debate across multiple model families. The output is a portable markdown decision packet, not a write to any private knowledge base.
Use it when adversarial reasoning beats a single-model answer: architectural calls, vendor or substrate choices, scope reshapes, irreversible-ish migrations, or decisions with hidden cost and goal-fit risk.
Do not use it for routine factual lookups, code edits, quick taste calls, or questions where you already know the answer and want a rubber stamp.
Setup / Preflight
Install the Codex plugin or Codex CLI for the GPT seat. The GPT/OpenAI family routes through codex exec; this skill does not require or read a raw OpenAI API key. The default GPT model is gpt-5.5, which is available when Codex is authenticated via ChatGPT login. If your Codex is authenticated with an API key instead, that path exposes gpt-5.2-codex; set COUNCIL_CODEX_COMMAND or reassign the gpt seat with --assign accordingly.
1Password is the documented default for provider keys, but no vault is baked in. Set COUNCIL_OP_VAULT to the vault holding your key items, and council resolves each family's key at dispatch. Override any single family with a full COUNCIL_<FAMILY>_OP_REF reference if your item names differ. If neither is set, council falls back to the env key in the last column.
| Family | Used for | 1Password lookup (item inside COUNCIL_OP_VAULT) | Env fallback |
|---|---|---|---|
| Anthropic | Claude member and chair seats | Anthropic API Key (or COUNCIL_ANTHROPIC_OP_REF) | ANTHROPIC_API_KEY |
| OpenAI/GPT | GPT seat via Codex | Codex plugin login, no provider key read by council | none |
| Moonshot/Kimi | Kimi member seat | Moonshot API Key (or COUNCIL_MOONSHOT_OP_REF) | MOONSHOT_API_KEY |
| Z.ai/GLM | GLM gauntlet seat or assignment override | Z.ai API Key (or COUNCIL_ZAI_OP_REF) | ZAI_API_KEY |
| xAI/Grok | Grok gauntlet seat or assignment override | xAI API Key (or COUNCIL_XAI_OP_REF) | XAI_API_KEY |
So with COUNCIL_OP_VAULT=MyVault, the Anthropic key resolves from op://MyVault/Anthropic API Key/credential. Secrets are resolved at dispatch time with op read; they are never written to disk and never printed. Use --keys env on machines without the 1Password CLI.
The diversity you get is the diversity you provision. If only one family is available, council will warn and run a single-family panel instead of failing because non-selected provider keys are missing.
Invocation
python3 skills/council/council.py \
--goal "<what we are trying to achieve, single line>" \
--topic "<the contentious question>" \
[--backend api|gateway] # default: api
[--keys auto|op|env] # default: auto
[--members skeptic,builder,strategist,operator] \
[--tier cheap|standard|expensive|gauntlet] # default: standard
[--slug <kebab-slug>] # default: derived from --topic
[--context-files path1,path2] # paths to include in member prompts
[--assign role=model,...] # override per-role model alias
[--out ./council-packets/<slug>.md] # default packet path
[--stdout] # print packet instead of writing
[--dry-run] # plan only, no calls
[--yes] # skip pre-call confirm
--goal is required. The Strategist role needs an explicit goal to test whether the proposal is on-axis or drift.
Backends
--backend api is the default portable path:
- Anthropic seats call the Anthropic Messages API.
- The GPT seat calls the Codex plugin /
codex exec. - Moonshot, Z.ai, and xAI seats use their OpenAI-compatible provider APIs.
- Missing non-selected provider keys are not fatal. Missing selected families are substituted with provisioned families and called out in the plan.
--backend gateway keeps an explicit OpenAI-compatible gateway path for users who already operate one. Configure it with --gateway-url, --gateway-token, and --gateway-agent, or COUNCIL_GATEWAY_URL, COUNCIL_GATEWAY_TOKEN, and COUNCIL_GATEWAY_AGENT. The gateway path is opt-in and has no import-time dependency on any local gateway config.
Provider status (beta)
This skill is beta. The Anthropic seats and their request shape are verified against current provider documentation, and the GPT-via-Codex seat is verified locally. The Moonshot, Z.ai, and xAI seats are configured per each provider's current documentation but have not yet been live-tested end to end. If one of those seats errors, check its model ID, base URL, and token parameter in council.py against the provider's current docs, and please open an issue. The Anthropic-only path (--tier cheap, or any run where only an Anthropic key is provisioned) is the most proven.
What It Does
- Phase 1 - Position papers, parallel: each member gets the goal, topic, optional context files, and its role prompt.
- Phase 2 - Cross-rebuttal, parallel: each member sees the other members' position papers and writes one rebuttal.
- Phase 3 - Chair synthesis: the chair receives the full debate and writes the decision packet.
Total calls are 2N + 1. For the default four members, that is nine calls.
Default Roles
| Role | Bias | Surfaces |
|---|---|---|
| Skeptic | Default-no. Hidden cost. Prove it. | Premature commitment, sunk-cost reasoning |
| Builder | Default-yes. Smallest concrete next step. | Analysis paralysis, over-abstraction |
| Strategist | Goal-fit anchor. Reject drift. | Scope creep, locally-optimal-globally-wrong |
| Operator | Default-revisit. Three-month pain. Escape hatch. | Reversibility myopia, lock-in, soak neglect |
Custom roles work via --members skeptic,builder,security. Labels not in prompts/ use a one-shot fallback prompt derived from the role name.
Cost Tiers
Estimates are approximate and use the static model registry in council.py. The dispatcher refuses plans estimated over $5.
| Tier | Members | Chair | Approx |
|---|---|---|---|
cheap | Claude Sonnet only | Claude Sonnet | about $0.10 |
standard | Claude Sonnet + GPT/Codex + Kimi + Claude Sonnet | Claude Opus | about $0.30 |
expensive | Claude Opus + GPT/Codex + Kimi + Claude Opus | Claude Opus | about $1.20 |
gauntlet | Claude Opus + GPT/Codex + Kimi + Grok | Claude Opus | about $1.80 |
Run --dry-run --stdout first. It prints the model assignment plan, estimated cost, credential availability by family, prompt previews, and warnings without making model calls.
Output
Default output is a markdown decision packet:
./council-packets/<slug>.md
Use --out <path> to choose a destination or --stdout to print. Packets include frontmatter, the chair decision, and an appendix containing all position papers and rebuttals.
The chair packet shape is:
- TL;DR
- Recommendation
- Dissents (named)
- Open questions for the decision owner
- Appendix: full position papers and rebuttals
Files
skills/council/
SKILL.md
council.py
prompts/
skeptic.md
builder.md
strategist.md
operator.md
chair.md
Out of Scope
- Native chat or Discord command routing.
- Private knowledge-base writes.
- Provider-specific transcript storage.
- Multi-round debate beyond the single rebuttal phase.
- A raw OpenAI API-key path for the GPT seat.