1仕組みと動作原理
本メカニズムの核心は単なる『複数モデルの呼び出し』ではなく『Claude自身が議論に参加すること』にある:SKILL.mdは、対立モデルの結論を提示するだけでなく、Claude自身の独立した批判(critique)と統合判断(synthesis)を併記し、それをユーザーに明示することを求めている。
**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.
実際の実行レイヤーは同梱されたPython CLI(debate.py + 5つのモジュール)であり、skillは所定のコマンドラインを介してstdin経由でドキュメントをスクリプトに渡す。スクリプトはlitellmを使用して各プロバイダーを並行呼び出しし、`[AGREE]` / `[SPEC]`タグを解析する。
python3 "$(find ~/.claude -name debate.py -path '*adversarial-spec*' 2>/dev/null | head -1)" critique --models MODEL_LIST --doc-type TYPE <<'SPEC_EOF'
呼び出し経路は2種類に分かれる:APIキーを利用するモデルはlitellmを一元的な出口とし、サブスクリプション型モデル(ChatGPT/Googleアカウント)はローカルCLIの子プロセスを経由し、argv/stdinにドキュメントを結合してcodex / geminiに渡す。
cmd = [ "codex", "exec", "--json", "--full-auto", "--skip-git-repo-check", "--model", actual_model, "-c", f'model_reasoning_effort="{reasoning_effort}"', ]
収束判定はセマンティックな評価ではなくモデル出力のテキストトークンに基づいて行われる:いずれかのモデルに[AGREE]が含まれていなければ次のラウンドへ進む。最初の2ラウンドで早期合意した場合は、手抜き防止のための追加詰問(--press)が強制される。
**Handling Early Agreement (Anti-Laziness Check):** If any model says `[AGREE]` within the first 2 rounds, be skeptical.
長時間の議論の中断とロールバックに対応:セッション状態、ラウンドごとのチェックポイント、共通設定がそれぞれディスクに永続化され、sessionとprofileは分離して管理される。
SESSIONS_DIR = Path.home() / ".config" / "adversarial-spec" / "sessions" CHECKPOINTS_DIR = Path.cwd() / ".adversarial-spec-checkpoints"
任意のHuman-in-the-Loop(人間参加型)チャネルとしてTelegramボットに対応:各ラウンド終了時にサマリーをユーザーへ送信し、60秒間のポーリングで受信したフィードバックを次回ラウンドに統合する。無応答の場合は自動で継続する。
TELEGRAM_API: str = "https://api.telegram.org/bot{token}/{method}"
エンタープライズ向けの代替チャネル:AWS Bedrockへ切り替えることで、すべてのモデル呼び出しをBedrockプレフィックス経由に統一でき(コンプライアンスやゲートウェイ要件向け)、設定はホームディレクトリのconfig.jsonに保存される。
**When Bedrock mode is enabled, ALL model calls route through Bedrock** - no direct API calls are made.
最終成果物の生成はスクリプトではなくClaude(ホスト)自身が担当する:skillは最終ドキュメントを出力し、カレントディレクトリのspec-output.md(PRDからの継続時はtech-spec-output.md)に書き込むよう指示するが、スクリプト単体ではこのファイルを出力しない。
1. Print the complete, polished document to terminal 2. Write it to `spec-output.md` in current directory
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| package | litellm |
| api | 多家 LLM 供应商 API(经 litellm 统一出口) |
| cli | codex(OpenAI Codex CLI,走 ChatGPT 订阅) |
| cli | gemini(Google Gemini CLI,走 Google 账号) |
| api | AWS Bedrock(可选企业通道,全部调用可改走 bedrock/ 前缀) |
| network | Telegram Bot API(可选人工在环) |
| package | 开发依赖(pytest/pytest-cov/ruff/mypy/pre-commit) |
4推奨統制措置と判定根拠
- 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
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結論
89a0a6e57cca0f6a…