Fable のオーケストレーション設計
役割分担(ユーザー指定 → 実際の割当)
| 役割 | ユーザー指定 | 実際の実行手段 | 備考 |
|---|---|---|---|
| オーケストレーション・設計・issue 作成・最終判定 | Fable | 親セッション + ワークフロー内の judge エージェント(model: 'fable') | 設計書 docs/spec/ps-design.md、issue 19 件の本文は親が執筆 |
| 調査・検証 | Opus | investigate(/issue-investigate)と review(/pr-review の Claude 側) | 「Opus の使い所わからん」→ 実測ベースの調査と厳格レビューが最適だった(SDK の関数を実際にビルドして訂正、テスト弱体化の検出) |
| E2E・キャプチャ | Sonnet | e2e(/issue-test)、post-merge、実装エージェントの 運転手 | PCSX-Redux CLI + Lua でキャプチャ、画素・メトリクスで判定 |
| コードレビュー | Codex gpt-5.6-sol | review 内で codex exec -s read-only | Opus の所見と統合して 📋 コメント |
| コーディング | Codex gpt-5.6-luna(LunaMax は利用不可) | 実装エージェント(Sonnet)が codex exec --full-auto を運転 | Codex クォータ切れ後は Sonnet 自身が実装 |
| 画像生成 | higgsfield MCP | 親セッションが generate_image_batch | 21 点、プロンプトは設定画を参照画像に |
| git 定型 | Haiku | merge エージェント | gh pr merge --squash --delete-branch、worktree 掃除 |
パイプライン(1 issue = 1 ラン)
e2eとreviewは 並列(parallel([...]))、他は直列- 複数 issue は
parallel(issues.map(runIssue))で 並列に走らせ、worktree(.worktrees/issue-N)で分離 - 判定ルール(judge プロンプトに明記): 両方 LGTM → マージ / 「低」のみ残存で受入条件を満たす → マージ可(残件は issue に記録)/ それ以外 → 差戻し(Codex が着手できる粒度の
fix_instructionsを返す)
設計上の工夫
StructuredOutput でスクリプトが分岐する
js
const SCHEMA_VERDICT = { verdict: 'LGTM' | 'NEEDS_FIX', findings: [...], comment_url, evidence: [...] }
const SCHEMA_JUDGE = { merge: boolean, fix_instructions: string, rationale: string }
const SCHEMA_IMPL = { pr_url, branch, worktree, build_ok, test_ok, summary, codex_runs }各エージェントは自由文の代わりにこの JSON を返すため、if (judge.merge) のような分岐と、次エージェントへの 文脈の受け渡し(impl.summary、e2e.findings、review.findings)が機械的にできます。
共通環境ブロック ENV
全プロンプトの先頭に同じブロックを差し込みました: SDK の環境変数、設計正典・ワークフロー正典のパス、PCSX-Redux CLI の起動法、エビデンス添付スクリプト、ワークフローログ、禁止事項(force push / main 直 push / git add -A)。「毎回必ず読むファイル」を指名することで、エージェントごとの解釈ブレを抑えました。
resume モード
上限やプロセス再起動で止まった issue を、PR がある状態から再開できるように args.resume を追加しました。調査・実装をスキップし、親が書いた fix 指示から修正ラウンドに入ります。
json
{"issues":[2], "resume":{"issue":2, "pr_url":"…/pull/17", "branch":"feature/issue-2-…",
"worktree":".worktrees/issue-2", "fix":"…差戻し指示…", "rounds":2}}親が直接運転する「縮退モード」
Claude サブエージェントが上限で使えない時間帯は、親セッションが同じ手順(Codex luna 実装 → 自分で make test/E2E → Codex sol レビュー → 判定 → マージ)を Bash で直接 回しました(#2 追加ラウンド、#4、#5)。役割分担は崩れますが、ゲート(E2E ✅ + レビュー ✅)は同じ に保っています。
情報の流れ(トレーサビリティ)
すべての判断は GitHub 上のコメントに残す設計です(dev-workflow の traceability.md T-2/T-3)。1 つの PR には典型的に次が並びます:
- 💬 実装ラウンドコメント(エンジン判断・コミット SHA・未達)
- 🧪 E2E 結果(受入条件表・キャプチャ・メトリクス)
- 📋 レビュー(Codex + Claude 統合、重大度付き指摘)
- 🧭 オーケストレーター判定(マージ/差戻しの根拠)
- 🔧 修正対応(差戻し指摘ごとの ✅/⏭)
- 📝 作業実施サマリ(post-merge、8 項目)
例: PR #24(#8 フロー全画面) は 4 ラウンド + 追加ラウンド 2 回、コメント 20 件超。