Strategic project audit with a dual-model C-level council: Claude Opus + GPT-5.4 run as independent experts in parallel, then cross-model synthesis surfaces agreements, contradictions, and blind spots neither model catches alone. Use when you need a rigorous multi-perspective review before a major decision, launch, or architecture change. Automatically installs the OpenAI Codex plugin if not present. Triggers on: /ceo-audit-2-models, "audit the project", "get expert opinions", "multi-model review", "council review", "ceo council", "strategic review", "second opinion on the project".
Launch parallel sub-agents as isolated C-level experts. Every expert receives identical project data. No coordination between agents — isolation produces genuine diversity of opinion. Then run the same roles on both Claude Opus and GPT-5.4 simultaneously and synthesize where they agree, disagree, and diverge.
Cross-model mode is the default and recommended mode: overlapping findings get high confidence, model-unique findings reveal blind spots.
GPT-5.4 experts run through the OpenAI Codex plugin. Check availability before launching any experts.
CODEX=$(find ~/.claude/plugins/cache -name "codex-companion.mjs" 2>/dev/null | sort -V | tail -1)
echo "${CODEX:-NOT_FOUND}"
If NOT_FOUND: install the plugin now:
/plugin marketplace add openai/codex-plugin-cc
/plugin install codex@openai-codex
/reload-plugins
/codex:setup
Then re-run the find command to get the path. Store it in $CODEX for all subsequent GPT calls.
If found: proceed immediately. No setup needed.
Before suggesting experts, understand the project:
CLAUDE.md (or README.md if absent).claude/rules/ for domain contextBased on findings, generate 4-6 expert roles tailored to this specific project. Roles must reflect the project's actual domain, challenges, and current stage — not generic defaults.
Don't copy these — generate fresh roles based on actual context:
| Project Type | Typical Roles |
|---|---|
| SaaS | Head of Engineering, Head of Product, Head of Growth, CFO, UX Researcher |
| Open Source | Community Manager, Technical Architect, DevRel, Security Advisor |
| Content / Media | Content Strategist, Audience Analyst, Monetization Expert, Distribution Expert |
| EdTech | CMO, CFO, CPO, COO, Growth Advisor |
| E-commerce | Head of Supply Chain, Marketing Director, CTO, Customer Experience Lead |
| Agency / Consulting | Sales Director, Delivery Lead, Talent Manager, CFO |
Always ask the user before proceeding. Do not pick roles yourself.
Ask via AskUserQuestion (single-select):
| Mode | Description |
|---|---|
| Cross-model (recommended) | Each role runs on Claude Opus AND GPT-5.4; cross-model synthesis highlights blind spots |
| Claude only | All experts on Claude Opus — faster, no Codex required |
| GPT only | All experts on GPT-5.4 via Codex |
Use AskUserQuestion with multiSelect: true. Show the 4-6 role options you generated in Phase 1 with short descriptions of their focus. The user can always write custom roles via "Other".
Minimum 2 experts. If the user picks only 1, suggest adding one more — productive disagreement requires at least two perspectives.
Gather project state to feed all experts. Prepare this block once — it must be identical for every expert regardless of model.
Read:
git log --oneline -10)docs/)Skip: GitHub stars, clone counts, contributor lists — vanity metrics add noise without strategic signal.
Store the result as DATA_BLOCK. Every prompt in Phase 4 uses the same DATA_BLOCK verbatim.
You are the [ROLE] for [PROJECT NAME]. Analyze the data below from a [DOMAIN] perspective.
Focus on:
- [3-6 specific focus areas relevant to role and project]
Data:
[DATA_BLOCK — identical for all experts]
[Role-specific personality instruction: "show the math", "be the contrarian",
"prioritize by effort/impact ratio", etc.]
Respond in the same language as the data provided.
Only in Cross-model and GPT-only modes.
For each role, generate the XML prompt using gpt-prompt-template.md. Write each to a temp file:
cat > /tmp/ceo-audit-gpt-{role-slug}.txt << 'PROMPT'
[XML prompt content — see gpt-prompt-template.md for structure]
PROMPT
Rules:
DATA_BLOCK, same focus areas, same personality instruction as the Claude version--prompt-file flag to avoid shell quoting issues with long promptsLaunch everything simultaneously. One message = true parallelism.
Task(subagent_type: "general-purpose", model: "opus", prompt: "<CFO prompt>", description: "CFO analysis")
Task(subagent_type: "general-purpose", model: "opus", prompt: "<CTO prompt>", description: "CTO analysis")
Write GPT prompt files first (via Bash), then launch all experts in a single message:
# Claude experts
Task(subagent_type: "general-purpose", model: "opus", prompt: "<CFO Claude prompt>", description: "CFO (Claude Opus)")
Task(subagent_type: "general-purpose", model: "opus", prompt: "<CTO Claude prompt>", description: "CTO (Claude Opus)")
# GPT-5.4 experts
Bash(command: 'node "$CODEX" task --json --prompt-file /tmp/ceo-audit-gpt-cfo.txt',
description: "CFO (GPT-5.4)", timeout: 300000)
Bash(command: 'node "$CODEX" task --json --prompt-file /tmp/ceo-audit-gpt-cto.txt',
description: "CTO (GPT-5.4)", timeout: 300000)
Same as above but only the Bash calls (no Task tool calls).
If Codex is unavailable (auth expired, CLI missing, network error):
⚠️ GPT-5.4 unavailable: [reason]
Switching to Claude-only mode.
Wait for all experts to return results before proceeding to Phase 6.
The synthesis is the entire value of the council. Never skip it.
# Council Session: [DATE]
## Council Members
[List of selected experts and their focus]
## Context
[Current state snapshot — brief]
## [Expert 1]
[Key findings and recommendations]
## [Expert 2]
[Key findings and recommendations]
## Consensus (all agree)
1. ...
## Disagreements
| Expert | Position | Argument |
|--------|----------|----------|
## Decisions
_To be filled after discussion._
GPT responses arrive as JSON — extract the rawOutput field for each expert.
For each role, compare Claude vs GPT findings side by side:
# Cross-Model Council Session: [DATE]
## Council Members
| Role | Claude Opus | GPT-5.4 |
|------|-------------|---------|
| CFO | ✅ | ✅ |
| CTO | ✅ | ✅ |
## Context
[Current state snapshot — brief]
## Per-Role Comparison
### [ROLE] Analysis
**Claude Opus:**
[Key findings — 3-5 bullets]
**GPT-5.4:**
[Key findings — 3-5 bullets]
**Alignment:** 🟢 Agree / 🟡 Partial / 🔴 Contradict
**Details:** [what matches, what diverges]
---
## Cross-Model Synthesis
### 🟢 Overlapping Findings (both models agree)
> High confidence — act on these first
1. [Finding] — both models converge
2. ...
### 🔵 Claude-Only Findings
> Potential GPT blind spots — verify before dismissing
1. [Finding] — Claude sees, GPT misses
2. ...
### 🟣 GPT-Only Findings
> Potential Claude blind spots — mandatory check
1. [Finding] — GPT sees, Claude misses
2. ...
### 🔴 Direct Contradictions
| Topic | Claude position | GPT position | Recommendation |
|-------|----------------|-------------|----------------|
## Model Agreement Score
- Full overlap: N findings
- Partial: N findings
- Contradictions: N findings
- **Agreement rate:** X%
## Top Recommendations (by confidence)
1. [Overlapping — highest confidence]
2. ...
## Decisions
_To be filled after discussion._
Save to docs/council-[DATE].md (or a project-specific path if context suggests one).
| Mistake | Fix |
|---|---|
| Picking roles without asking user | Always use AskUserQuestion first |
| Using Bash to launch Claude experts | Only use Task tool with subagent_type: "general-purpose" |
| Using Task tool for GPT experts | Use Bash + node "$CODEX" for GPT |
| Giving experts different data | Prepare ONE DATA_BLOCK, paste into all prompts verbatim |
| Different focus areas between models | Same role must have identical focus on both models |
| Gathering vanity metrics | Focus on strategy docs, actual metrics, recent decisions |
| Too many experts (6+ per model) | 3-4 per model is optimal for signal-to-noise |
| Skipping synthesis | The synthesis IS the value |
| Skipping cross-model comparison | In cross-model mode, the comparison is the entire point |
| Not checking Codex availability | Always verify $CODEX path before launching GPT experts |
| Passing GPT prompt as CLI arg | Always use --prompt-file to avoid shell quoting issues |
| Hardcoding paths to codex-companion | Always discover dynamically via find ~/.claude/plugins/cache |