From my-council
Parallel-critic + separate-synthesis review primitive with a generic persona library for business ideas, research, decisions, and general knowledge-work review. Dispatches a panel of persona agents (skeptic, pragmatist, strategist, customer-voice, operator by default; or business-idea / research / decision panels; or any custom --panel), then runs a separate synthesis pass that reconciles into a single verdict. Optional --mixed <codex|gemini> swaps one Claude critic for a cross-vendor peer. Single-round; no inter-critic debate. Use to pressure-test a pitch, validate a research claim, get a go/no-go decision, or review any document needing diverse-lens scrutiny.
How this skill is triggered — by the user, by Claude, or both
Slash command
/my-council:my-council <file:path | topic> [--type X | --panel a,b,c] [--skip a,b] [--n K] [--mixed <codex|gemini>]<file:path | topic> [--type X | --panel a,b,c] [--skip a,b] [--n K] [--mixed <codex|gemini>]This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
*v0.1.0 — Generic-purpose port of upstream `chrisblattman/claudeblattman/skills/council.md` v1.3. 8 personas, 4 named panels (generic / business-idea / research / decision). Single-round + separate synthesis design. No specflow coupling.*
v0.1.0 — Generic-purpose port of upstream chrisblattman/claudeblattman/skills/council.md v1.3. 8 personas, 4 named panels (generic / business-idea / research / decision). Single-round + separate synthesis design. No specflow coupling.
Dispatches N critic agents in parallel against the same input, collects raw outputs as data, and runs a separate synthesis pass in fresh context that reconciles into a single verdict + structured patch list. Hard cap 5. Single-round only. Never majority-votes on narrative output.
Cross-talk between critics produces conformity drift (arXiv 2510.07517, 2509.05396, 2511.07784); single-round-with-synthesis is the empirically better design (Karpathy 2025; multi-agent literature 2026).
The fastest path that works out of the box, using the bundled personas:
/my-council file:docs/<doc>.md # default: generic panel (5 critics)
/my-council file:docs/<pitch>.md --type business-idea # business-idea panel (4)
/my-council file:docs/<research>.md --type research # research panel (3)
/my-council "Should we accept X?" --type decision # decision panel (2)
All four default panels are backed by persona files shipped in ${CLAUDE_PLUGIN_ROOT}/agents/ — no BYO required.
Environment variables (read at dispatch time; defaults baked in):
MY_COUNCIL_CRITIC_MODEL=opus # or sonnet for cheaper runs
MY_COUNCIL_SYNTHESIS_MODEL=opus
MY_COUNCIL_MAX_CRITICS=5
MY_COUNCIL_DEFAULT_N=3
Models are set here, not in persona frontmatter. Next-model migration = edit two env vars.
Primary: /my-council <topic> or /my-council file:<path> [flags]
Natural-language triggers:
--type business-idea--type research--type decision| Flag | Effect |
|---|---|
--type <name> | Use a named default panel. Names: generic (default), business-idea, research, decision. |
--panel a,b,c | Explicit persona list, in order. Names must match persona file basenames in EITHER the plugin layer OR the user layer (see Persona discovery). Overrides --type if both are given. |
--skip a,b | After resolving the panel via --type or default, remove the listed personas from it. |
--n K | Truncate the resolved panel to the first K members. Useful when the panel's natural size exceeds your needs or MY_COUNCIL_MAX_CRITICS. |
--mixed <vendor> | Swap ONE Claude critic for a cross-vendor peer where <vendor> is codex or gemini. Vendor-to-persona auto-mapping in Phase 4. Graceful fallback to all-Claude if the peer CLI is missing. Direction: Claude → peer only (asymmetry rule). |
Hard cap: MY_COUNCIL_MAX_CRITICS (default 5). Larger resolved panels halt rather than dispatch, with a "narrow with --skip or --n" message.
Resolved from --type or keyword inference. All persona names below reference files shipped in ${CLAUDE_PLUGIN_ROOT}/agents/.
--type | Members | Use case | N |
|---|---|---|---|
generic (default) | skeptic, pragmatist, strategist, customer-voice, operator | anything not fitting a more specific panel — the long tail | 5 |
business-idea | strategist, pragmatist, customer-voice, skeptic | pitches, GTM, market entry, partnership review, product proposals | 4 |
research | researcher, skeptic, ethicist | reports, briefings, claims, market analyses, lit reviews | 3 |
decision | skeptic, operator | go/no-go, accept/reject, single-question decisions | 2 |
Keyword inference (only used if --type not given and the invocation came via natural-language trigger): "research / study / report / claim" -> research; "decision / should I / go-no-go" -> decision; "pitch / business idea / GTM / market entry" -> business-idea; anything else -> generic; ambiguous -> ask one line.
Upstream's paper and grant panels are intentionally not included: my-council does not ship the academic-review personas (academic-editor, harsh-referee, methodologist, grant-strategist, funder-officer) those panels require. Upstream's skill-review panel is also out of scope for v0.1.0 — that panel is mostly useful inside a plugin-development workflow. If you need any of these, author the persona files at ~/.claude/agents/<name>.md and invoke via --panel <list>.
Two-layer filesystem discovery. Merge into a single registry keyed by basename.
${CLAUDE_PLUGIN_ROOT}/agents/*.md. Strip .md. Plugin personas dispatch as subagent_type: my-council:<name>.~/.claude/agents/*.md AND ~/.claude/agents/*-agent.md AND ~/.claude/agents/experts/*.md. Strip .md and any -agent suffix. If the folder does not exist, treat as empty. User personas dispatch as bare subagent_type: <name>.Collision rule: plugin layer wins. The framework's persona contracts must remain stable; a user-level file cannot silently override a plugin persona. On collision, emit exactly one line before dispatch:
my-council: <name> resolved from plugin (user copy at ~/.claude/agents/<name>.md shadowed)
$ARGUMENTS. Determine if the positional is a topic (plain text) or a file path (with or without file: prefix).--panel a,b,c -> use those names verbatim, in order. Ignores --type if both are given.--type X -> look up the named panel in the table above. Unknown name -> halt and list the available names.generic (the documented default).--skip a,b if present: remove those names from the resolved list. Empty result after skip -> halt and ask.--n K if present: truncate to the first K members.general-purpose.MY_COUNCIL_MAX_CRITICS. Larger -> halt with "narrow with --skip or --n" message.If invocation arrived via a natural-language trigger (not explicit /my-council), dispatch one short classification Task call to decide whether this is an invocation or a meta-reference. If META or UNCLEAR, ask one line before continuing. Skip this phase if the invocation was explicit (/my-council ...).
Print one line before the parallel Task calls:
$PANEL_NAME panel: dispatched N critics on $MY_COUNCIL_CRITIC_MODEL
No terminal period. $PANEL_NAME is the resolved panel name (generic / business-idea / research / decision) or custom for --panel invocations. If $MY_COUNCIL_CRITIC_MODEL resolves to a long versioned string (e.g. claude-opus-4-7-20260512), display the short label (e.g. opus-4.7).
--mixed <vendor> set)If --mixed <vendor> was passed (codex or gemini), swap ONE Claude critic in the resolved panel for a cross-vendor peer. Preserves the panel size; only one critic is swapped. Mark the swapped slot so Phase 5 dispatches it as a Bash call to the peer CLI rather than as a Task call.
Vendor-to-persona auto-mapping (first match in the resolved panel wins):
| Peer vendor | Preferred swap targets (in order) | Rationale |
|---|---|---|
codex | skeptic, then operator | empirical rigor + pre-mortem framing (operator's persona explicitly cites Klein, HBR 2007) |
gemini | researcher, then futurist | long-context synthesis + broad domain coverage / forward-aging horizon |
If none of the preferred targets are present in the resolved panel, swap the LAST critic in the resolved order (deterministic, not random).
CLI presence check: before marking the swap, verify the peer binary exists via command -v codex (or command -v gemini). If missing, print exactly one line:
my-council: <vendor> CLI not installed; continuing with all-Claude panel
...and unmark the swap. Graceful degradation; do not halt.
Asymmetry rule: Claude -> peer only. Do NOT propose the inverse (peer-first-then-Claude) panel in the same run; asymmetric dismissal of the Claude critics during synthesis is the known failure mode. One peer swap per run, max.
Send ONE message with N tool calls (true parallelism, not sequential).
For each non-swapped persona, dispatch a Task call:
subagent_type: per the registry built in Phase 1 (plugin-namespaced as my-council:<name> or bare; see Persona discovery).model: value of MY_COUNCIL_CRITIC_MODEL (explicit, overrides any persona frontmatter).description: 3-5 word summary (e.g., "Skeptic review of pitch").prompt: structured prompt containing:
If Phase 4 marked one slot for peer dispatch, include ONE additional Bash call in the same parallel message. Bash invokes the peer CLI with the persona's prompt content. Write the peer's stdout to a tempfile created by mktemp -t my-council-peer-XXXXXX.md (or platform equivalent); capture the path. The peer prompt is the same structured prompt the Task would have received — persona name, parallel-with-others reminder, input, output-shape instruction, no-cross-talk instruction — formatted as plain text for the CLI. Exact invocation is per the vendor's --help (Codex: codex exec ...; Gemini: gemini -p "..." or stdin); the model resolves the right flags at dispatch time.
Collect raw critic outputs. Do NOT inline-synthesize. If a peer was dispatched, the peer output is on disk at the tempfile path; the Claude critics' outputs are in Task results.
One more Task call:
subagent_type: general-purpose (fresh context, no critic conversation history)model: value of MY_COUNCIL_SYNTHESIS_MODELdescription: "Synthesise critic verdicts"prompt: the synthesis template (below) + the resolved panel's branch + raw critic outputs (Reading the peer tempfile inline if applicable) + the original input + N (the panel size)Synthesis template (common preamble):
You are the synthesis pass for a my-council review. N critics ran in parallel
against the same input. You read their raw outputs as DATA (not as conversation).
Produce ONE reconciled verdict per the panel-type branch below.
Hard rules:
- Preserve numbers and citations VERBATIM from critic outputs.
- Do not invent findings.
- Do not majority-vote narrative. Report disagreement honestly.
- One paragraph of operator framing at the top (no more than six sentences), then the structured output.
- If a peer-vendor critic was included, identify it in the per-critic verdict line
(e.g., "gemini-2.5-pro (swapped for researcher)"). Treat it as one critic among N;
do not weight it specially.
Panel-type branches:
generic / business-idea / research:
ship | revise | kill
revise if at least ceil(N/2) critics said REVISE or strongerkill only if a critic flagged a structural blocker the others align onFor research, the verdict vocabulary reads as "publish | revise | retract" in context — same logic, contextual wording.
decision:
Emit the synthesis to the operator. Include the raw critic outputs (and the peer output if applicable) inside a <details> collapsible at the bottom for verification.
Append one row to ~/.claude-assistant/logs/my-council-invocations.csv (or skip if the log file does not exist):
timestamp,run_id,invoked_from,input,panel_resolved,critic_count,mixed_vendor,synthesis_verdict,model_critic,model_synthesis
The CSV schema includes mixed_vendor (empty when --mixed was not used) so cross-vendor runs are trackable in retrospect.
Multiple critics with explicit lenses outperform one general critic on review/decision tasks. The pattern:
echo "$(date +%Y-%m-%d),my-council,TOOL_CALLS,${N_CRITICS}-critics-${PANEL_TYPE}" >> ~/.claude-assistant/logs/skill-performance.csv
--mixed requires the peer CLI on PATH. The skill degrades gracefully if either is missing (one-line notice, continues with all-Claude panel).
command -v codex. Authenticate per OpenAI's instructions before first use.npm install -g @google/gemini-cli. Verify with command -v gemini. Authenticate per Google's instructions before first use.Mixed mode is most useful for empirical claims (does this library exist, does this benchmark hold, is this regex correct, is this API surface real) where cross-model verification adds real signal. For pure judgement work, the lens diversity comes from the persona prompts more than from the underlying model — all-Claude is usually sufficient.
${CLAUDE_PLUGIN_ROOT}/agents/<name>.md — guaranteed present after install, dispatched as subagent_type: my-council:<name>. The user layer at ~/.claude/agents/<name>.md is the operator's extension point: dropping a persona file there makes it dispatchable via --panel <name> with no plugin version bump. On basename collision the plugin copy wins.Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
npx claudepluginhub jcconsult/claude-plugins --plugin my-council