From joesys-skills
Use when the user invokes /ai-council to consult three frontier AI models (Claude, GPT, Antigravity) in parallel and synthesize their responses into a consensus analysis
How this skill is triggered — by the user, by Claude, or both
Slash command
/joesys-skills:ai-councilThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Dispatch the same question to three frontier AI models (Claude, GPT via Codex, Antigravity) in parallel, then synthesize their responses into a structured analysis highlighting consensus and tensions.
Dispatch the same question to three frontier AI models (Claude, GPT via Codex, Antigravity) in parallel, then synthesize their responses into a structured analysis highlighting consensus and tensions.
This skill MUST NOT:
--no-save is NOT specified, saving to docs/ai-council/YYYYMMDD-<topic>/ is mandatory, not optional.Parse the user's /ai-council arguments:
--no-save — opts out of writing output files (saving is on by default)--path <dir> — overrides the default save location (default: docs/ai-council/). Relative paths resolve from the current working directory.If the question is empty or unintelligible, use AskUserQuestion to ask the user to clarify.
Read shared/skill-context.md for the full protocol. In brief:
.claude/skill-context/preferences.md — if missing, invoke /preferences (streamlined).How preferences shape this skill:
| Preference | Effect on AI Council |
|---|---|
| Detail level | Controls how verbose the synthesis is |
| Assumed knowledge | Shapes the synthesis voice — beginner gets more explanation of model disagreements |
| Tone | Formal synthesis vs. conversational comparison |
Pass the user's communication style preferences to the synthesis phase (Phase 4). The individual model legs receive the user's raw question, not preferences — each model should respond naturally.
Automatically gather relevant context before dispatching. No user approval needed.
If context gathering partially fails (e.g., a file is unreadable or WebSearch is unavailable), proceed with whatever context was successfully gathered.
Construct the prompt in four parts:
"You are the [Claude/GPT/Antigravity] representative on a multi-model AI council. Give your independent analysis. Be explicit about your confidence level and reasoning. State your position clearly."
The gathered context from Phase 1.
Reword the user's question into a clear, logical form with explicit framing (constraints, goals, scope). The refinement should clarify, not alter. Add explicit constraints and scope that are implied by context, but MUST NOT change the user's intent. When in doubt, use the original wording.
"Original question from the user: [verbatim user input]"
Read shared/delegation-common.md § Prompt Delivery and shared/model-defaults.md for the standard prompt delivery pattern and current CLI command templates.
MUST always write prompts to temporary files using mktemp and pipe them to CLI tools. Use single-quoted heredoc delimiters to prevent shell expansion:
CODEX_PROMPT=$(mktemp /tmp/council-codex-XXXXXX.txt)
AGY_PROMPT=$(mktemp /tmp/council-antigravity-XXXXXX.txt)
CLAUDE_PROMPT=$(mktemp /tmp/council-claude-XXXXXX.txt)
cat > "$CODEX_PROMPT" << 'PROMPT_EOF'
<prompt content>
PROMPT_EOF
# (repeat for each leg with leg-specific preamble)
Then pipe each prompt file to its corresponding CLI. Substitute the placeholders below with the current invocations from shared/model-defaults.md:
cat "$CODEX_PROMPT" | <CODEX_CMD>cat "$AGY_PROMPT" | <AGY_CMD>cat "$CLAUDE_PROMPT" | <CLAUDE_CMD> --name "council-<topic>"Clean up temporary files after all legs complete: rm -f "$CODEX_PROMPT" "$AGY_PROMPT" "$CLAUDE_PROMPT"
MUST launch all three legs simultaneously in a single response (three parallel tool invocations). Sequential dispatch defeats the speedup and is a defect.
MUST deliver via stdin pipe (see Prompt Size Safety). Substitute <CODEX_CMD> with the current invocation from shared/model-defaults.md § Codex.
cat "$CODEX_PROMPT" | <CODEX_CMD>
The adapter runs agy non-interactively and appends -p itself — do not add -p. MUST deliver the prompt via stdin pipe (shell metacharacters break direct arguments). Substitute <AGY_CMD> with the current invocation from shared/model-defaults.md § Antigravity.
cat "$AGY_PROMPT" | <AGY_CMD>
Choose the mechanism based on whether the prompt is self-contained:
Use subagent (Agent tool) when Phase 1 fully resolved all context the question needs. The prompt is self-contained and the Claude leg won't need to read additional files or search the web during execution. Spawn with model: "opus" and pass the full four-part prompt. Subagent is faster — no CLI startup overhead.
Use CLI when the question references specific files or codepaths that Phase 1 could not fully resolve, and the Claude leg would benefit from tool access to explore further. Substitute <CLAUDE_CMD> with the current invocation from shared/model-defaults.md § Claude CLI, and append --name for resumability:
cat "$CLAUDE_PROMPT" | <CLAUDE_CMD> --name "council-<topic>"
| Condition | Action |
|---|---|
| 1 leg fails | Proceed with 2/3 responses, name the unavailable leg in the synthesis, offer retry after presenting |
| 2 legs fail | Proceed with 1/3, warn user the council is degraded, offer retry |
| All 3 legs fail | Report failures, suggest checking CLI installations and auth setup |
When the user accepts a retry and it succeeds, update the synthesis and output files to incorporate the new response.
Produce a structured synthesis with five fixed sections.
2–3 sentence overview of what the council was asked and the overall direction of responses.
A table showing each leg's confidence level per topic/dimension.
| Topic | Claude | GPT | Antigravity |
|---|---|---|---|
| Dimension A | High | High | High |
| Dimension B | Medium | High | Not addressed |
Where all responding legs agree — stated clearly with supporting reasoning.
Where legs diverge — each leg's position stated fairly, with the nature of the disagreement explained (e.g., "Claude and GPT favor X for reason A, while Antigravity argues Y due to reason B").
The parent's own recommendation, informed by all three but not just majority-rules. Weigh the quality of reasoning, not just the count.
After presenting the synthesis, always offer:
/codex resume, /antigravity resume, or /claude resume to explore their reasoning further."
/claude resume is not available for this council run.If the user resumes and gets new insight, they can invoke /ai-council again with a refined question. The skill does not auto-update from individual resume sessions.
"This council session surfaced [brief description of the noteworthy finding]. That might make a good devlog post. Want me to run
/devlog scrap --from-contextto capture it?"
Saving is on by default. Files are written to docs/ai-council/YYYYMMDD-<topic>/:
docs/ai-council/20260325-postgresql-vs-mongodb/
├── claude.md
├── codex.md
├── antigravity.md
└── synthesis.md
<topic> is derived from the question (kebab-case, 3–5 words)synthesis.md contains the full synthesis (all 5 sections from Phase 4)synthesis.md is updatedYYYYMMDD-<topic>-2/, YYYYMMDD-<topic>-3/, etc.--no-save skips all file writing--path <dir> overrides docs/ai-council/ (the YYYYMMDD-<topic>/ subdirectory is still created inside)| Phase | Condition | Action |
|---|---|---|
| Phase 1 | WebSearch unavailable | Skip web context, proceed with file/project context only |
| Phase 1 | File read/glob fails | Proceed with whatever context was gathered |
| Phase 2 | Empty or unintelligible question | Use AskUserQuestion to ask the user to clarify |
| Phase 3 | Leg failure/timeout | See Fallback Behavior above |
| Phase 5 | Directory already exists | Append numeric suffix |
| Phase 5 | Disk write error | Warn user, present synthesis in terminal only |
npx claudepluginhub joesys/joesys-skills --plugin joesys-skillsGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.