ワークフロー&基本ツール · zscole/adversarial-spec

adversarial-spec

すべてのモデルが合意するまで、複数のLLM(GPT、Gemini、Grokなど)と議論を重ねて製品仕様書を反復的に改善します。敵対的開発アプローチを用いて仕様書の新規作成やブラッシュアップを行いたい場合に使用します。

L4 高権限 · 段階的認可と監査V1 コミット固定コマンド実行ネットワーク通信ファイル書き込みDual-pass Audit
Author zscoleGitHub zscole/adversarial-spec ↗Stars 556License MIT(仓库根 LICENSE;GitHub API spdx=MIT;pyproject license = {text = "MIT"})Commit f90cf0c36c
管理レベルは Skill の能力と推奨統制措置を示すものであり、品質や安全性の認証、利用可否の判定ではありません。使用の可否はユーザーおよび管理者が決定します。Agent 環境によって制約が異なるため、自動保護を仮定しないでください。第三者製 Skill の著作権は原著作者に帰属し、利用リスクは利用者が負います。

1仕組みと動作原理

本メカニズムの核心は単なる『複数モデルの呼び出し』ではなく『Claude自身が議論に参加すること』にある:SKILL.mdは、対立モデルの結論を提示するだけでなく、Claude自身の独立した批判(critique)と統合判断(synthesis)を併記し、それをユーザーに明示することを求めている。

skills/adversarial-spec/SKILL.md
**Important: Claude is an active participant in this debate, not just an orchestrator.** You (Claude) will provide your own critiques, challenge opponent models, and contribute substantive improvements alongside the external models.
Step 4では固定の出力テンプレート(--- Round N --- / Opponent Models / Claude's Critique / Synthesis)が規定されており、『どの指摘が誰によるものか、Claude自身が何を補足し、何を棄却したか』を個別項目として提示することで、マルチモデルレビューがブラックボックス化するのを防いでいる。

実際の実行レイヤーは同梱されたPython CLI(debate.py + 5つのモジュール)であり、skillは所定のコマンドラインを介してstdin経由でドキュメントをスクリプトに渡す。スクリプトはlitellmを使用して各プロバイダーを並行呼び出しし、`[AGREE]` / `[SPEC]`タグを解析する。

skills/adversarial-spec/SKILL.md
python3 "$(find ~/.claude -name debate.py -path '*adversarial-spec*' 2>/dev/null | head -1)" critique --models MODEL_LIST --doc-type TYPE <<'SPEC_EOF'
スクリプトのパスはfindコマンドを用いて~/.claude配下から動的に特定されるため、本skillはプラグインとしてユーザーのホームディレクトリに配置される形式となっている。呼び出しはheredocを用いたstdin渡しで行われる(debate.py内の'spec = sys.stdin.read().strip()')。

呼び出し経路は2種類に分かれる:APIキーを利用するモデルはlitellmを一元的な出口とし、サブスクリプション型モデル(ChatGPT/Googleアカウント)はローカルCLIの子プロセスを経由し、argv/stdinにドキュメントを結合してcodex / geminiに渡す。

skills/adversarial-spec/scripts/models.py
cmd = [ "codex", "exec", "--json", "--full-auto", "--skip-git-repo-check", "--model", actual_model, "-c", f'model_reasoning_effort="{reasoning_effort}"', ]
Gemini側では'gemini', '-m', actual_model, '-y'が実行され、プロンプトはstdin経由で渡される(models.py内のcall_gemini_cli_model)。利用可能性の検出はproviders.pyに実装されている:CODEX_AVAILABLE = shutil.which("codex") is not None / GEMINI_CLI_AVAILABLE = shutil.which("gemini") is not None。

収束判定はセマンティックな評価ではなくモデル出力のテキストトークンに基づいて行われる:いずれかのモデルに[AGREE]が含まれていなければ次のラウンドへ進む。最初の2ラウンドで早期合意した場合は、手抜き防止のための追加詰問(--press)が強制される。

skills/adversarial-spec/SKILL.md
**Handling Early Agreement (Anti-Laziness Check):** If any model says `[AGREE]` within the first 2 rounds, be skeptical.
PRESS_PROMPT_TEMPLATE(prompts.py)は、ドキュメント全体を通読したことの確認、レビュー済みセクションを最低3つ列挙すること、合意理由の説明、および残余の懸念事項の提示をモデルに要求する。スクリプト側では'--press'オプションが対応する。最大ラウンド数はSKILL.mdにのみ記載されており('Maximum 10 rounds per cycle')、コード内での強制制限はない。

長時間の議論の中断とロールバックに対応:セッション状態、ラウンドごとのチェックポイント、共通設定がそれぞれディスクに永続化され、sessionとprofileは分離して管理される。

skills/adversarial-spec/scripts/session.py
SESSIONS_DIR = Path.home() / ".config" / "adversarial-spec" / "sessions" CHECKPOINTS_DIR = Path.cwd() / ".adversarial-spec-checkpoints"
providers.pyではPROFILES_DIR = Path.home() / ".config" / "adversarial-spec" / "profiles"およびGLOBAL_CONFIG_PATH = Path.home() / ".claude" / "adversarial-spec" / "config.json"(Bedrockの有効化状態などを保存)が定義されている。SKILL.mdにも'Sessions are stored in `~/.config/adversarial-spec/sessions/`'および'each round's spec is saved to `.adversarial-spec-checkpoints/`'と記載されている。

任意のHuman-in-the-Loop(人間参加型)チャネルとしてTelegramボットに対応:各ラウンド終了時にサマリーをユーザーへ送信し、60秒間のポーリングで受信したフィードバックを次回ラウンドに統合する。無応答の場合は自動で継続する。

skills/adversarial-spec/scripts/telegram_bot.py
TELEGRAM_API: str = "https://api.telegram.org/bot{token}/{method}"
token != ''の場合に有効化される('token = os.environ.get("TELEGRAM_BOT_TOKEN", "")')。SKILL.mdには'After each round: Bot sends summary to Telegram / 60 seconds to reply with feedback (configurable via --poll-timeout) / Reply incorporated into next round / No reply = auto-continue'と明記されている。

エンタープライズ向けの代替チャネル:AWS Bedrockへ切り替えることで、すべてのモデル呼び出しをBedrockプレフィックス経由に統一でき(コンプライアンスやゲートウェイ要件向け)、設定はホームディレクトリのconfig.jsonに保存される。

skills/adversarial-spec/SKILL.md
**When Bedrock mode is enabled, ALL model calls route through Bedrock** - no direct API calls are made.
コード側:models.pyの'os.environ["AWS_REGION"] = bedrock_region'および'if not model.startswith("bedrock/"): actual_model = f"bedrock/{model}"'。providers.pyのhandle_bedrock_commandがstatus/enable/disable/add-model/remove-model/aliasを処理し、設定はGLOBAL_CONFIG_PATHに書き込まれる。

最終成果物の生成はスクリプトではなくClaude(ホスト)自身が担当する:skillは最終ドキュメントを出力し、カレントディレクトリのspec-output.md(PRDからの継続時はtech-spec-output.md)に書き込むよう指示するが、スクリプト単体ではこのファイルを出力しない。

skills/adversarial-spec/SKILL.md
1. Print the complete, polished document to terminal 2. Write it to `spec-output.md` in current directory
scripts/ディレクトリ全体で'spec-output'をgrep検索してもヒットせず、ファイル書き込みはホスト側のWriteツールの操作であることが裏付けられている(SKILL.mdのallowed-toolsには'Bash, Read, Write, AskUserQuestion'が宣言されている)。スクリプト側はレビュー、差分抽出、エクスポートのみを担当する。

2コア機能

01マルチモデル並行敵対的レビュー(1回のcritique呼び出しで複数プロバイダーへ並列リクエストし、モデルごとの批評または[AGREE]を返却)
022種類のドキュメントテンプレートと対応する批評基準(PRDおよび技術仕様書それぞれの構成チェックリストと7〜8項目のレビュー指針)
03インタビューモード(Interview mode):議論に入る前に、8大テーマを網羅した詳細な要件ヒアリング(AskUserQuestion)を実施
04フォーカスモード(--focus):レビューの焦点をsecurity / scalability / performance / ux / reliability / costに絞り込み
05専門家人格(--persona):security-engineer / oncall-engineer / junior-developer / qa-engineer / site-reliability / product-manager / data-engineer / mobile-developer / accessibility-specialist / legal-complianceおよび任意のカスタム文字列に対応
06コンテキスト注入(--context):既存のAPI仕様書、DBスキーマ、コンプライアンス要件などを添付資料としてレビューモデルへ一括引き渡し
07セッション永続化と中断再開(--session / --resume / セッション一覧表示に加え、ラウンドごとのチェックポイントからのロールバックが可能)
08ラウンド間差分比較とタスク出力(diff --previous/--current、および課題管理ツールへそのまま取り込める形式で出力可能なexport-tasks --json)
09コスト可観測性:モデル別の料金表に基づいてトークン消費量を集計し概算費用を算出、ターミナルサマリー/JSON/Telegram通知へ記録

3外部依存関係

KindDependency / Endpoint
packagelitellm
api多家 LLM 供应商 API(经 litellm 统一出口)
clicodex(OpenAI Codex CLI,走 ChatGPT 订阅)
cligemini(Google Gemini CLI,走 Google 账号)
apiAWS Bedrock(可选企业通道,全部调用可改走 bedrock/ 前缀)
networkTelegram Bot API(可选人工在环)
package开发依赖(pytest/pytest-cov/ruff/mypy/pre-commit)

4推奨統制措置と判定根拠

安全運用のための推奨統制措置
Agent 向け
段階的・都度認可、サンドボックス推奨
管理者向け
承認フロー、ロールバック可能、全履歴監査
判定根拠(ファイルパスと抜粋)
  • scripts/: ローカルスクリプト・コマンドの実行: python3 <…>/debate.py critique|diff|export-tasks|send-final|providers|focus
  • 网络端点: 外部ネットワークアクセスの宣言: litellm → 各ベンダー公式API(OpenAI / Anthropic / Google / xAI / Mistral / Groq / O
  • 本地工作目录: ファイル読み書きおよび成果物出力: ~/.claude/adversarial-spec/config.json(bedrock enable/disable/add-model/ali
監査ノート: 基準に基づく判定:本skillは複数の環境変数クレデンシャル(各LLMのAPIキー、AWS認証情報、Telegramトークン)を明示的に読み取り、ユーザーのドキュメント全文を外部のサードパーティモデルへ送信するため、**『認証情報/環境変数の読み取り + サードパーティ製プラグイン/リモートパッケージ依存を伴う』**に該当します。また、子プロセス実行サーフェス(codex exec --full-auto、gemini -y、同梱のdebate.py/telegram_bot.py)を含みます。外部送信先は想定範囲内(公式API/公式CLI/Bedrock/Telegram Bot API)であり、TLSダウングレードや検知回避、難読化コードは存在しないためレッド判定には引き上げません。ただしクレデンシャルと人間参加型チャネルを伴うため、使用前には参照可能なキーの範囲やドキュメントの社外送信可否を確認してください(エンタープライズ環境ではBedrockチャネルの直接有効化やTelegram機能の無効化を推奨します)。

5二重目の独立検証

  • [ok] 多模型调用确实存在(非纯提示词) — models.py import litellm + from litellm import completion,标准路径 'response = completion(**completion_kwargs)';providers.py CODEX_AVAILABLE/GEMINI_CLI_AVAILABLE 用 shutil.which 探测。
  • [ok] 订阅制模型走 CLI 子进程 — call_codex_model 构造 ['codex','exec','--json','--full-auto','--skip-git-repo-check','--model',…] 并 subprocess.run;call_gemini_cli_model 构造 ['gemini','-m',model,'-y'] 并把 prompt 经 input= 传入。
  • [ok] Telegram 端点与轮询 — telegram_bot.py 'TELEGRAM_API: str = "https://api.telegram.org/bot{token}/{method}"' + 'with urlopen(req, timeout=30)'(urllib,非 requests);poll_for_reply(timeout=60 默认) 与 cmd_notify 均存在。
  • [ok] Bedrock 模式确实可全量接管调用 — is_bedrock_enabled()/get_bedrock_config() 读 GLOBAL_CONFIG_PATH;models.py 在 bedrock 分支设置 AWS_REGION 并给 model 加 'bedrock/' 前缀;handle_bedrock_command 支持 status/enable/disable/add-model/remove-model/alias。
  • [discrepancy] 『Maximum 10 rounds』是否由代码强制 — SKILL.md 写 'Maximum 10 rounds per cycle (ask user to continue if reached)',但对 debate.py 全文检索无任何轮数上限常量/参数(--round 只是当前轮号,--rounds 只用于 send-final 汇报)。结论:轮数上限是提示词纪律,代码不设护栏,已在 how_it_works 第 4 条与 risks 中如实标注。
  • [discrepancy] 『Write it to spec-output.md』的归属 — 第一遍曾按『脚本写文件』记录;第二遍在 scripts/ 全目录检索 'spec-output' 零命中,确认该写入由宿主 Write 工具完成(SKILL.md allowed-tools: Bash, Read, Write, AskUserQuestion)。已改写为『成品交付由 Claude 完成』并据此调整 file_writes。
  • [discrepancy] Python 版本要求一致性 — SKILL.md Requirements 写 'Python 3.10+ with `litellm` package installed',而 pyproject.toml 写 requires-python = ">=3.9" 且 ruff target-version = "py39"、mypy python_version = "3.10"。属文档与打包元数据的轻微不一致(不影响功能判定)。
  • [ok] 成本追踪是否真有实现(非仅文档) — providers.py MODEL_COSTS 价目表 + DEFAULT_COST;debate.py 'Cost: ${cost_tracker.total_cost:.4f}' 与 JSON 输出 'cost': {total, input_tokens, output_tokens, by_model}。

6結論

  • 『単一モデルによる自己満足』を構造化された敵対的レビューへ刷新:複数モデルの並行批評 + ホストモデル自身の見解表明 + 毎ラウンドの項目別Synthesis記録(誰の意見を採用したか/自身で何を追加したか/何を却下したか)。
  • モデルの安易な自己申告による収束を防止:早期の合意には--pressによる再検証(該当セクションの提示、理由の言及、残余懸念の開示)を義務付け、--preserve-intentにより削除時には原文引用と弊害の論証を求めることで、安易な均質化を阻止。
  • 類似ツールを圧倒する完成度の高いエンジニアリング実装:3300行超のスクリプト、4300行超のテスト(ミューテーションテスト設定を含む)、ruff/mypy/pre-commitの完備、セッション復元・差分抽出・タスクエクスポート・コスト統計を網羅したCLI設計。
  • 3系統のプロバイダー抽象化により『どのモデルで議論するか』を自在に選択可能:APIキー、サブスクリプション型CLI、エンタープライズ向けBedrockを同一インターフェースで統合し、利用可能チャネルを事前検証した上でモデル候補を提示。
  • 実用的なHuman-in-the-Loop機構の確立:Telegramを介して各ラウンドのサマリーをプッシュ通知し、60秒間のポーリングで返答を次回議論へ反映できるため、長時間の議論中も端末前に張り付く必要がない。
  • 最適な用途: 推奨対象:PRDや技術仕様書を作成するにあたり、複数ベンダーの異なるモデルから多角的な批判的レビューを受けたい開発・プロダクトチーム;利用可能なAPIキーまたはcodex/geminiのサブスクリプションを保有し、対象ベンダーへドキュメントを送信することに同意できる個人開発者;仕様策定のレビュープロセスを標準化し履歴(各ラウンドのチェックポイント、差分、コストサマリー)を残したいチーム;Bedrockチャネルを利用できる企業コンプライアンス環境。
    不向きな用途: 非推奨対象:社外秘情報を含み、セルフホストまたはBedrock環境を利用できないドキュメントを扱う場合;仕様書の正確性をスキル側で自動検証・保証することを期待するユーザー(本スキルは批判を集約するのみで、事実確認は行いません);複数モデルのAPI利用料の支払いや複数キーの管理を避けたいユーザー;ローカルのcodex/gemini CLIをエージェントに実行させたくない環境(サブスクリプションアカウントと紐づく子プロセス実行を伴うため);敵対的レビューを必要とせず、ドキュメントの迅速な初稿作成のみを求める用途(議論ループにより完了までの時間が大幅に延びます)。
    Install Agent-Ready
    ① Verified Mirror 2026-09-15
    Option A · Direct DownloadDownload adversarial-spec.tar.gz
    sha256: 89a0a6e57cca0f6a…
    Option B · Copy Guide for Agent
    install.json
    Agent はこの JSON ガイドから自動的にダウンロードして検証します。
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit f90cf0c36c.