claude-council について
重大な意思決定を複数の助言者の視点、ピアレビュー、議論、異論を残す最終統合へ導く Claude スキルです。実行内容と結果を記録し、ペルソナの改善案にもつなげます。
主な機能
- 015つの構造化された助言者の視点
- 02ピアレビューと合意度の採点
- 03合意度に応じた議論
- 04異論を残す結論の統合
- 05意思決定ログと結果の追跡
- 06ペルソナ改善案の提案
活用シーン
- 01重大なビジネス上の判断を検討
- 02複数の視点で選択肢を比較
- 03過去の評議と結果を振り返る
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ torpedod/ claude-council --skill claude-councilインストール後、Claude Code で/claude-councilを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/report-template.htmlevals/evals.jsonjournal/.gitkeepreferences/bias-audit.mdchairman.mddebate-round.mddecision-science.mdmodes.mdpeer-review.mdpersonas.mdscripts/journal_append.shjournal_outcome.shjournal_search.shmeta_analysis.sh詳細
LLM Council
インストールパスの前提: このスキルは
~/.claude/skills/claude-council/へのインストールを前提としています。別の場所(例:~/.claude/plugins/<name>/skills/claude-council/)にインストールした場合は、ステップ 0、2、10 のスクリプトパスを適宜変更してください。
重大な意思決定を、5つの構造化された思考レンズ、ピアレビューのラウンド、合意があまりに簡単にまとまった場合の強制的な討論、そして異論を残す二人の議長による統合にかけます。実行ごとにジャーナルへ記録し、結果を自己改善ループに反映して、時間をかけてペルソナの改良を提案します。
対象外: 事実の確認、デバッグ、単一分野の技術的な質問、簡単なはい/いいえの判断、感情的なサポート。どの選択肢も本当に難しいと感じない場合は、そのまま直接回答してください。
ステップ 0 — 特殊な呼び出しを最初に処理する
/claude-council outcome <sha1> <note>— sha1 のプレフィックスを使って~/.claude/skills/claude-council/journal/council-log.jsonlから実行を検索し、そのoutcomeフィールドを更新して、確認します。完了です。/claude-council meta—bash ~/.claude/skills/claude-council/scripts/meta_analysis.shを実行し、生成された修正ファイルのパスを提示します。完了です。- その他の呼び出し → ステップ 1 に進みます。
ステップ 1 — トリアージ
次のいずれかに該当する場合は拒否し、直接回答してください。
- 事実に関する質問/正解が1つだけの質問(「フランスの首都は?」など)
- 単一分野の技術的な質問 — 有能な実務者ならツイート1件で答えられる内容
- 重大性が明示されていない — AskUserQuestion で「なぜ重大な判断なのですか?」と一度だけ尋ねます。ユーザーが曖昧な反応をした場合は中止します
- 明白な答えがある二択(「テストしていないコードを金曜日に本番環境へデプロイする?」など)
- すでに決定済みで、承認を求めている — 異議を唱えてほしいのか、確認してほしいのかを尋ねます。確認であればスキップします
- 感情的なサポートを求める内容 — 丁寧にその旨を伝え、Council の対象にしません
ステップ 2 — 実行前のジャーナル検索
シェルに安全に渡せるよう、生の質問をエスケープします。すべてのシングルクォートを '\'' に置き換えてから、シングルクォートで囲みます。$ESCAPED_QUESTION に格納してください。生のユーザーテキストを bash に直接渡してはいけません。質問中の $(...)、バッククォート、\ の並びが実行されるおそれがあります。
bash ~/.claude/skills/claude-council/scripts/journal_search.sh "$ESCAPED_QUESTION"
sha1 のプレフィックスまたはキーワードの重複で一致する過去の実行が1件以上ある場合は、1行の要約(「DATE の関連 Council — X を推奨 — 結果:Y」)を提示し、過去の判定を最大2件、**「過去の Council のコンテキスト」**として、整形した質問に含めます。
ステップ 3 — 質問の整形とバイアス監査
3a. ワークスペースのスキャン — CLAUDE.md、memory/、ユーザーが参照したファイルを Glob で検索します。新しさと CLAUDE.md の優先順位に基づいて選んだ最大3ファイルを対象にします。整形した質問は約4kトークン以内に収め、切り詰めた場合はトランスクリプトに記載します。CLAUDE.md または memory/ ファイルが見つからない場合は、トランスクリプトに「ワークスペースのスキャン:プロジェクトのコンテキストは見つかりませんでした。Council はユーザーが提供したコンテキストのみで進行します。」と記載します。
質問が曖昧な場合は、AskUserQuestion を一度だけ使って明確にします。その後、{{FRAMED_QUESTION}} を作成します。
DECISION: <core question>
CONTEXT: <workspace + user context>
STAKES: <what's at stake>
OPTIONS: <options named by user, if any>
PRIOR: <prior council context if any>
ステップ 9 の SHA 計算で使用できるよう、整形した質問の全文をシェル変数 FRAMED_QUESTION に格納します。テキスト内のシングルクォートをエスケープします(' → '\'')。
3b. バイアス監査 — Quick モードではスキップします(レイテンシのコストに見合わないため。references/modes.md を参照)。Standard/Deep では、references/bias-audit.md のプロンプトを使って Agent() を1回呼び出します。{{FRAMED_QUESTION}} を渡します。構造化されたバイアスフラグのリストが返されます。以下の形式で整形した質問に追加します。
BIAS FLAGS: <list — these are signals, not verdicts>
バイアス監査の結果が「BIAS AUDIT: Clean — no significant distortions detected.」の場合は、BIAS FLAGS: セクションを整形した質問に一切含めません。HTML レポートでは、{{BIAS_FLAGS_HTML}} を空文字列として出力します。
ステップ 4 — モードの選択
エスカレーションの詳細なロジックについては、references/modes.md を読んでください。概要:
| モード | 条件 | 約呼び出し回数 |
|---|---|---|
| Quick | "quick" の接尾辞/重大性 < $1k/≤ 1日で元に戻せる | 4 |
| Standard | デフォルト | 13–15 |
| Deep | "deep"/重大性が高い/信頼度が低い場合に自動エスカレーション | 16 + 1 Codex |
ステップ 5 — ファンアウト(エージェント呼び出しの並列実行)
5 つすべてのペルソナプロンプトについて、references/personas.md を読み込みます。1 回のターンでディスパッチします。
- Standard/Deep:
Agent(subagent_type="general-purpose", description="<persona>", prompt=<FRAMED_QUESTION を置換した persona_prompt>)を 5 件、並列で呼び出します - Quick: 3 人のアドバイザー(Red Team、Executor、First Principles)
Deep モードの強化: Deep モードでは、First Principles と Expansionist のプロンプトの末尾に、次の文を追加します。「最も有力な案と次点だけでなく、3 つすべての再構成案/選択肢について、それぞれの詳細な理由とともに返してください。」
すべてのペルソナプロンプトでは、回答の末尾に次の付録を含める必要があります。
=== CONFIDENCE ===
confidence: high | medium | low
assumptions: <bulleted premises>
what_would_change_my_mind: <1-3 signals>
unknowns: <missing facts>
Deep モードでは、Codex Decision Science の処理はアドバイザーの回答後(ステップ 6)に実行します。並列では実行しません。これにより Codex は、ユーザーが挙げた選択肢だけでなく、アドバイザーが提示した選択肢も評価できます。
ステップ 6 — Codex Decision Science の処理(Deep モード/「with codex」)
references/decision-science.md を読み込みます。{{FRAMED_QUESTION}} とアドバイザーの回答から選択肢を抽出します。
Codex の呼び出し:
利用可能なタイムアウトコマンドを検出します。標準の macOS では適切にフォールバックします。
if command -v timeout >/dev/null 2>&1; then
TIMEOUT_CMD="timeout 120"
elif command -v gtimeout >/dev/null 2>&1; then
TIMEOUT_CMD="gtimeout 120"
else
TIMEOUT_CMD=""
fi
if command -v codex >/dev/null 2>&1; then
CODEX_OUTPUT=$(printf '%s' "$DECISION_SCIENCE_PROMPT" \
| $TIMEOUT_CMD codex exec --sandbox read-only --skip-git-repo-check -) \
|| CODEX_OUTPUT=""
fi
安全性に関する注意: プロンプトは heredoc ではなく printf '%s' を使って標準入力に渡します。これにより、プロンプト内の $、バッククォート、メタ文字がシェルによって展開されるのを防ぎます。オーケストレーターは、references/decision-science.md の決定科学プロンプト全体に {{FRAMED_QUESTION}} と {{OPTIONS_LIST}} をリテラルテキストとして置換したものを含むシェル変数 $DECISION_SCIENCE_PROMPT を事前に作成する必要があります。
フォールバック(Codex が存在しない、タイムアウトした、またはエラーになった場合):Agent(subagent_type="general-purpose", prompt=<decision-science prompt>)。CODEX_USED=false を設定します。Codex が正常に実行された場合は、CODEX_USED=true を設定します。これらはリテラルの JSON ブール値 true または false(引用符なし)でなければなりません。ステップ 10 の --argjson には有効な JSON が必要です。
Decision Science の出力の解析: 出力には JSON ブロックの後に、プレーンテキストの RANKING/DOMINATED/KEY ASSUMPTION セクションが続きます。{ ... } の境界を照合して JSON ブロックを解析します(スキーマにネストされたオブジェクトはありません)。いずれかのブロックで JSON の解析に失敗した場合は、未加工のテキストを取得して議事録に提示し、評議を中断してはなりません。プレーンテキストのセクションは、最後の JSON ブロックの後に続きます。
ステップ 7 — 匿名化+相互レビュー+強制ディベート
7a. 匿名化 — 手順:
$SHAの先頭 4 桁の 16 進数をシードとして、A-E のランダムな並べ替えを生成します(質問ごとに決定的で、ジャーナルの差分ノイズを低減します)。対応関係をトランスクリプトに記録します。- 自己紹介が含まれている場合、各回答の最初の行を削除します。
- 構造上のサニタイズ — 匿名化されたテキストからアイデンティティが漏れるペルソナ固有のパターンを、正規表現で置換します。
THE FAILURE MODE/THE ROOT CAUSE/THE MISSED SIGNAL/THE ALTERNATIVE→POINT 1/POINT 2/POINT 3/POINT 4REFRAMING [ABC]→PERSPECTIVE [1/2/3]、STRONGEST:/RUNNER-UP:→PRIMARY:/SECONDARY:OPTION [XYZ]→ALTERNATIVE [1/2/3]、DOMINANT:→RECOMMENDED:FIELD:/NAIVE READ:/BUBBLE SPOTS:/CROSS-DOMAIN INSIGHT:→LENS:/INITIAL READ:/ASSUMPTIONS:/INSIGHT:OODA STAGE→PHASE ASSESSMENT、RICE SCORING/RICE Score→PRIORITY SCORING/Priority Score、STATUS: DRAFT→NOTE: INCOMPLETE DATA
=== CONFIDENCE ===ブロックは変更せずに保持します(すべてのペルソナでこの形式を共有します)。
7b. 相互レビュー(Standard/Deep) — レビュアープロンプト全文は references/peer-review.md を読んでください。匿名化した A–E の回答すべてとレビュアープロンプトを受け取る Agent() 呼び出しを、5 つ並列で実行します。
スコアの抽出: 各レビュアーの Q4 の回答は、単一の整数 1~5 である必要があります。正規表現 CONSENSUS STRENGTH:\s*(\d)(大文字と小文字を区別しない)を使って抽出します。レビュアーが整数以外の値、または範囲外の値を出力した場合は、既定値の 3(中立)を使用し、トランスクリプトに警告を記録します。抽出した 5 つのスコアの算術平均を計算し、小数第 1 位に丸めます。
コンセンサスの要約の作成: 相互レビューを収集した後、次の内容をまとめた 2~3 文の CONSENSUS_SUMMARY を作成します。(a)アドバイザーの多数派が推奨する内容、(b)支配的な理由付け、(c)レビュー間で共通する条件や留保。これを変数 $CONSENSUS_SUMMARY として保存します。これは references/debate-round.md の Prosecutor プロンプトと Defender プロンプトに代入されます。
7c. 強制ディベート — コンセンサスの強度の平均が 4.0 以上の場合(または Deep の場合は常に)、references/debate-round.md を使って 2 回の Agent() 呼び出しを順次実行します。Standard モードで平均が 2.0 を超え 4.0 未満の場合は、ディベートを省略します(敵対的な圧力を必要としない健全な意見の相違です)。平均が 2.0 以下の場合は、ディベートを省略し、トランスクリプトに「ディベートラウンドを省略 — コンセンサスが不十分です(スコア:X/5)。」と記録します。
- Prosecutor — コンセンサスを攻撃します。応答を待ちます。
- Defender —
{{PROSECUTOR_RESPONSE}}を Prosecutor の出力に置き換えてから、呼び出しを実行します。Prosecutor が応答を返すまで、Defender は実行できません。
プロンプト全文は references/debate-round.md を読んでください。
ステップ 8 — 二人の議長と異論の保持
議長への送信前に匿名化を解除します: ステップ 7a の A-E マッピングを使って、各回答にペルソナラベルを復元します。references/chairman.md の議長プロンプトは、ペルソナラベル付きの入力(Red Team: ...、First Principles: ... など)を想定しています。サニタイズ済みのピアレビュー版ではなく、元の(匿名化されていない)回答テキストを使用してください。
references/chairman.md を読みます。2 回のウェーブで 3 回の Agent() 呼び出しを行います:
ウェーブ A(並列): 1 回のターンで両方を送信します:
- Chairman-Consensus(多数派寄り)— 標準の 5 セクションの判定
- Chairman-Dissent(少数派寄り)— 異論を軸にした同じ構成
ウェーブ B(両方の返答後に逐次実行): 3. 異論保持パス — 両方の議長の出力を受け取り、コンセンサスによって弱められた洞察をまとめた Dissent Ledger(2〜5 個の箇条書き)を作成します
最終判定 = Chairman-Consensus の出力 + 末尾に追加した Dissent Ledger。
判定ヘッダーの指定:
Council confidence: high | medium | low (n/5 high, n/5 medium, n/5 low)
Dominant assumption: <single shared premise>
Breakers: <top 2 signals that flip the recommendation>
エスカレーションの確認(Standard モードのみ — Deep では再エスカレーションしません):
以下のいずれかに該当する場合、エスカレーションを実行します:
chairman_confidenceがlow- 3 人以上のアドバイザーが
confidence: lowを出力 - 「Where the council clashes」セクションで、どちらの側も「より説得力がある」と判断されなかった項目が 2 つ以上ある
該当した場合:AskUserQuestion — 「Council の信頼度が低くなっています(理由:{which trigger})。より詳細な分析のため、Deep モードにエスカレーションしますか?」
- はいの場合:ステップ 5 から Deep モードで再実行し、以前のアドバイザーの出力をコンテキストとして渡して、アドバイザーが最初からやり直すのではなく、内容を精緻化できるようにします。
- いいえの場合:Standard の判定を続行し、HTML レポートでは信頼度ヘッダーを
confidence-low(赤)のスタイルで表示します。 - すでに Deep モードの場合:再エスカレーションしません。信頼度の低い判定を続行し、その旨を目立つように記載します。
ステップ 9 — 出力を生成する
タイムスタンプ + sha1:
TS=$(date -u +%Y-%m-%dT%H:%M:%SZ)
FILE_TS=$(date -u +%Y%m%d-%H%M%SZ)
SHA=$(printf '%s' "$FRAMED_QUESTION" | shasum | cut -c1-8)
オーケストレーターでは、ステップ 3 の出力から FRAMED_QUESTION がシェル変数として設定されている必要があります。printf '%s' を使うと、末尾の改行がハッシュに影響するのを防げます。-u は UTC を強制します。FILE_TS はファイル名に使用できる形式、TS はジャーナル用の ISO 8601 形式です。
ファイル名: council-report-${FILE_TS}-q${SHA}.html、council-transcript-${FILE_TS}-q${SHA}.md
出力ディレクトリ: $PWD — まず書き込み可能か確認します。代替先:~/Documents/claude-council-reports/
HTML トークン → ソースの対応付け:
| トークン | ソース | 備考 |
|---|---|---|
{{TITLE}} | フレーム化された質問の DECISION 行の先頭 80 文字 | <>&"' をすべて HTML エスケープ してください |
{{TIMESTAMP}} | $TS(ISO 8601 UTC) | |
{{MODE_LABEL}} | "Quick" / "Standard" / "Deep" | |
{{MODE_CLASS}} | "quick" / "standard" / "deep"(CSS 用の小文字) | |
{{CODEX_BADGE_HTML}} | codex が実行された場合は <span class="badge codex">Decision Science</span>、それ以外は空文字列 | |
{{CONFIDENCE_HEADER_HTML}} | 判定の確信度ヘッダーを、Council confidence の行、Dominant assumption、Breakers を含む <div class="confidence-block confidence-{level}"> としてレンダリングします | confidence-high、confidence-medium、confidence-low のいずれかのクラスを使用します |
{{QUESTION_HTML}} | フレーム化された質問の全文 | XSS を防ぐため、<>&"' をすべて HTML エスケープ してください |
{{BIAS_FLAGS_HTML}} | バイアス監査の出力を <div class="bias-flags"><strong>Pre-council bias scan</strong>...</div> に含めます。Quick または監査で問題がなければ空文字列です | |
{{VERDICT_HTML}} | Chairman-Consensus の判定(Markdown → HTML:## H2 → <h2>、- bullet → <ul><li>、段落 → <p>) | |
{{DISSENT_LEDGER_HTML}} | 異論の箇条書きを <div class="dissent-ledger"><strong>Dissent Ledger</strong><ul><li>...</li></ul></div> に含めます。Clean または Quick の場合は空です | |
{{AGREEMENT_GRID_HTML}} | 「Where the council agrees」を、アドバイザー間の合意を示す <table class="grid-table"> を含む <div class="card"> として出力します。Quick の場合は空です | |
{{RICE_TABLE_HTML}} | Executor RICE を <div class="card"><div class="card-title">RICE Analysis</div><div class="card-body"><table class="rice-table">...</table></div></div> として出力します。RICE データがない場合は空です | |
{{DECISION_SCIENCE_MATRIX_HTML}} | Decision Science JSON を <div class="card"><div class="card-title">Decision Science</div><div class="card-body"><table class="ds-table">...</table></div></div> として出力します。実行されていない場合は空です | 行には、dominant に dominant クラス、dominated に dominated クラスを指定します |
{{DEBATE_HTML}} | 議論を、prosecutor 側と defender 側を含む <div class="card"><div class="card-title">Debate Round</div><div class="card-body"><div class="debate-callout">...</div></div></div> として出力します。スキップされた場合は空です | |
{{ADVISORS_HTML}} | 各アドバイザーを <details class="advisor-{kebab}"><summary>{Name} <span class="conf-{level}">{level}</span></summary><div class="detail-body">{text}</div></details> として出力します | kebab:red-team、first-principles、expansionist、outsider、executor |
{{REVIEWS_HTML}} | 各レビューを <details><summary>Reviewer {N}</summary><div class="detail-body">{text}</div></details> として出力します。Quick の場合は空です | |
{{FOOTER_HTML}} | LLM Council · Mode: {mode} · SHA: {sha} · <a href="{transcript_path}">Full transcript</a> |
HTML: assets/report-template.html を読み込み、上の表に従ってすべてのトークンを置換し、書き込みます。darwin では open <path> で開きます。
トランスクリプト: 次の内容を含む Markdown ファイルを書き込みます:呼び出し時刻、フレーム化された質問、匿名化マップ、ペルソナ名付きのすべてのアドバイザーの応答、すべてのピアレビュー、議論のトランスクリプト(実行された場合)、両方の議長出力、異論の台帳、判定全文、Decision Science マトリックス(実行された場合)。
HTML サニタイズに関する注意: 表で「HTML エスケープ」と記されているトークン(TITLE、QUESTION_HTML)にはユーザーの生テキストが含まれるため、<>&"' をエスケープする必要があります。残りの *_HTML トークン(VERDICT_HTML、ADVISORS_HTML、REVIEWS_HTML、DEBATE_HTML、BIAS_FLAGS_HTML、FOOTER_HTML)はオーケストレーターが生成した HTML です。オーケストレーターが制御されたテンプレートから構築し、生のユーザーテキストを直接挿入しないため、安全です。これらのトークン内にユーザー提供テキストが含まれる場合(たとえば、判定内で質問が繰り返される場合)、トークン単位ではなく、挿入時点で HTML エスケープする必要があります。
置換後に確認: grep '{{' <html_path> の結果が 0 件であることを確認します。未入力のトークンが残っている場合は空文字列に置き換え、トランスクリプトに警告を記録します。
ステップ 10 — ジャーナルへの追記+ユーザープロンプト
今回の実行で収集した値から、ジャーナルのペイロードを作成します。すべてのフィールドが必須です。
{
"ts": "$TS",
"question_sha1_prefix": "$SHA",
"mode": "<Quick|Standard|Deep — the mode actually used, including escalation>",
"codex_used": <true if Decision Science ran via Codex; false otherwise>,
"biases_flagged": [<list of bias names from Step 3b, or empty array if Quick/clean>],
"advisors_confidence": {
"red_team": "<high|medium|low from Red Team's CONFIDENCE block>",
"first_principles": "<from First Principles>",
"expansionist": "<from Expansionist>",
"outsider": "<from Outsider>",
"executor": "<from Executor>"
},
"chairman_confidence": "<high|medium|low from the verdict header>",
"recommendation_one_liner": "<one sentence — the Recommendation section's first sentence>",
"dissent_ledger": [<each DISSENT PRESERVED bullet as a string, or empty array if Clean>],
"html_path": "<absolute path to the HTML report written in Step 9>",
"transcript_path": "<absolute path to the transcript written in Step 9>",
"outcome": null
}
有効な JSON 文字列として作成します。jq -n を使って安全に構築してください(推奨文に含まれる引用符や特殊文字を処理できます)。
PAYLOAD=$(jq -n \
--arg ts "$TS" \
--arg sha "$SHA" \
--arg mode "$MODE" \
--argjson codex "$CODEX_USED" \
--argjson biases "$BIASES_JSON" \
--argjson conf "$ADVISORS_CONF_JSON" \
--arg chair_conf "$CHAIRMAN_CONF" \
--arg rec "$RECOMMENDATION" \
--argjson dissent "$DISSENT_JSON" \
--arg html "$HTML_PATH" \
--arg transcript "$TRANSCRIPT_PATH" \
'{ts:$ts, question_sha1_prefix:$sha, mode:$mode, codex_used:$codex,
biases_flagged:$biases, advisors_confidence:$conf,
chairman_confidence:$chair_conf, recommendation_one_liner:$rec,
dissent_ledger:$dissent, html_path:$html, transcript_path:$transcript,
outcome:null}')
bash ~/.claude/skills/claude-council/scripts/journal_append.sh "$PAYLOAD"
シェル変数の値は、実行結果から次のように設定します。
$TS、$SHA— ステップ 9 から$MODE—"Quick"、"Standard"、または"Deep"$CODEX_USED—trueまたはfalse(引用符なしの JSON ブール値)$BIASES_JSON— JSON 配列。例:'["anchoring","sunk cost"]'または'[]'$ADVISORS_CONF_JSON— JSON オブジェクト。例:'{"red_team":"high","first_principles":"medium","expansionist":"high","outsider":"low","executor":"medium"}'$CHAIRMAN_CONF—"high"、"medium"、または"low"$RECOMMENDATION— Recommendation セクションの最初の文$DISSENT_JSON— 異論の箇条書きの JSON 配列、または'[]'$HTML_PATH、$TRANSCRIPT_PATH— ステップ 9 で取得した絶対パス
ユーザーには次のように伝えます。"評議会を記録しました(sha: $SHA)。結果を記録するには:/claude-council outcome $SHA <短いメモ>。5 回以上実行したら、/claude-council meta を実行すると、ペルソナの改善案を確認できます(jq が必要です)。"
続けて、HTML ファイルのパスと、チャットでの 1 段落の要約(推奨事項+最初に行うこと 1 つ)を表示します。それ以上は表示しません。