en un clic
en un clic
| name | mirofish-orchestrator |
| description | MiroFish CC-Native シミュレーション全体フロー・CLI呼出手順・SubAgent起動手順 |
CC セッション(Opus)がキャリアシミュレーション全体を制御するための手順書。 Python CLI で決定論的処理を行い、SubAgent でクリエイティブ処理を行うハイブリッド方式。
| レイヤー | モデル | 役割 |
|---|---|---|
| オーケストレーター | Opus | 全体制御、ペルソナ生成、レポート生成 |
| SNSエージェント | Sonnet/Haiku | SNS投稿・反応生成 |
| ルーティン処理 | Haiku | 定型的なラウンドアクション |
| 決定論的処理 | Python CLI | イベント評価、ブロッカー計算、スコアリング |
シミュレーション開始前に、ユーザーから必要な情報を収集する。
必ず AskUserQuestion ツールを使って対話的に確認すること。
AskUserQuestion("シミュレーションを開始します。以下を教えてください:
1. 履歴書・職務経歴書のファイルパス
2. シミュレーションの目的(例: 「マネジメントキャリアへの転換可能性を探りたい」)
※ファイルがない場合は、経歴を直接テキストで入力いただいてもOKです。")
→ ユーザー回答
AskUserQuestion("ありがとうございます。追加で確認させてください:
- 現在の年収(概算でOK):
- 家族構成(配偶者・お子さんの有無と年齢):
- 住宅ローン残高(該当する場合):
※答えたくない項目はスキップで構いません。")
→ ユーザー回答 → Phase -1 へ
# エンティティ一覧取得
python -m cc_layer.cli.zep_search --graph-id {graph_id} --mode entities
# クイック検索(セマンティック + BM25)
python -m cc_layer.cli.zep_search --graph-id {graph_id} --query "検索クエリ" --mode quick
# 深い洞察検索(LLMサブクエスチョン分解)
python -m cc_layer.cli.zep_search --graph-id {graph_id} --query "分析クエリ" --mode insight --requirement "要件"
# 全体スナップショット
python -m cc_layer.cli.zep_search --graph-id {graph_id} --mode panorama
# Zepへの書き込み(facts)
python -m cc_layer.cli.state_export --state-file ... --format zep-facts | \
python -m cc_layer.cli.zep_write --graph-id {graph_id} --stdin-facts
# Zepへの書き込み(アクティビティ)
python -m cc_layer.cli.zep_write --graph-id {graph_id} \
--activity '{"agent_name":"名前","action":"Published a post","content":"投稿内容"}'
設計方針: OpenAI API不使用。 決定論的処理はPython CLI、クリエイティブ処理はClaudeのSubAgentが担当。
# 1. ドキュメントからテキスト抽出(Python CLI — OpenAI不要)
python -m cc_layer.cli.text_process \
--input-files resume.pdf cover_letter.txt \
--mode extract --preprocess \
--output-file cc_layer/state/session_xxx/extracted_text.txt
# 2. デフォルトオントロジー生成(Python CLI — OpenAI不要)
python -m cc_layer.cli.ontology_generate \
--default \
--output-file cc_layer/state/session_xxx/ontology.json
# 3. Zepナレッジグラフ構築(Python CLI — Zep API使用、OpenAI不要)
python -m cc_layer.cli.graph_build \
--text-file cc_layer/state/session_xxx/extracted_text.txt \
--ontology-file cc_layer/state/session_xxx/ontology.json \
--graph-name "session_xxx" \
--output-file cc_layer/state/session_xxx/graph_info.json
# → graph_id を取得
# 4. エンティティからベースプロフィール生成(Python CLI — OpenAI不要)
python -m cc_layer.cli.profile_generate \
--graph-id {graph_id} \
--no-llm \
--output-file cc_layer/state/session_xxx/profiles.json
sim_config_generate CLI(OpenAI依存)の代わりに、SubAgentがSimulationParameters JSONを直接生成。
Agent(model=sonnet, prompt="""
Skills: mirofish-career を参照。
cc_layer/prompts/config_agent.md のフォーマットに従い、
以下からSimulationParameters JSONを生成してください。
graph_id: {graph_id}
requirement: {requirement}
profiles: {profiles_json}
document_text: {document_text}
出力: cc_layer/state/session_xxx/sim_config.json に書き出してください。
""")
シミュレーションの現実性を担保する重要ステップ。 Tavilyで最新の労働市場データ・業界動向を取得し、 PathDesigner/PathExpander の入力コンテキストに含める。
# 5a. 業界ナレッジ収集(Tavily + LLM パイプライン)
# 候補者のコンテキストに基づき、関連する業界データを構造化して保存
python -m cc_layer.cli.knowledge_curate \
--ontology-file cc_layer/state/session_xxx/ontology.json \
--candidate-context "{age}歳、{current_role}、{industry}業界{years}年" \
--output-dir cc_layer/state/session_xxx/knowledge/
# 5b. 転職市場データ取得
python -m cc_layer.cli.external_search \
--mode job-market --profession "{profession}" --industry "{industry}"
# → cc_layer/state/session_xxx/knowledge/job_market.json に保存
# 5c. 業界ニュース・トレンド取得
python -m cc_layer.cli.external_search \
--mode industry-news --industry "{industry}" --keywords "{keywords}"
# → cc_layer/state/session_xxx/knowledge/industry_news.json に保存
# 5d. HR動向(リスキリング、採用トレンドなど)
python -m cc_layer.cli.external_search \
--mode hr-trends --keywords "{relevant_keywords}"
# → cc_layer/state/session_xxx/knowledge/hr_trends.json に保存
5b-5dは並列実行可能。 結果は knowledge/ ディレクトリに保存し、後続PhaseのSubAgentに渡す。
# 収集したナレッジを候補者コンテキストに注入する形式で取得
python -m cc_layer.cli.knowledge_search \
--candidate-context "{age}歳、{current_role}" \
--injection-point "top_player" \
--max-chars 3000
# → knowledge_context テキストとして Phase 1 の SubAgent に渡す
TAVILY_API_KEY未設定時: external_search はエラーを返す。knowledge_curate も Tavily依存部分は失敗するが、
既存のローカルナレッジファイル(preset_knowledge/)があれば knowledge_search で利用可能。
Tavilyなしでも最低限のシミュレーションは可能(精度は低下する)。
# 1. Zep からエンティティ取得してプロフィール構築
python -m cc_layer.cli.zep_search --graph-id {graph_id} --mode entities
# 2. プロフィール + フォーム入力から初期状態生成
python -m cc_layer.cli.sim_init \
--profile '{"name":"田中太郎","age":35,"current_role":"シニアエンジニア",...}' \
--form '{"family_members":[...],"marital_status":"married",...}' \
--seed 42 \
--output-dir cc_layer/state/session_xxx
Zep操作(mirofish-zep参照): エンティティ読み取り → プロフィール構築
旧方式(Python決定論的480tick)を廃止。Claudeが実際にキャリアについて推論する。
Agent(model=sonnet, prompt="""
cc_layer/prompts/path_designer_agent.md のフォーマットに従い、
候補者の取りうるキャリアパスを5つ設計してください。
graph_id: {graph_id}
identity: {identity_json}
profiles: {profiles_json}
requirement: {requirement}
document_text: {document_text}
## 現実世界コンテキスト(Tavily取得済み)
knowledge_context: {knowledge_context}
job_market: {job_market_json}
industry_trends: {industry_news_json}
※上記データは最新の労働市場・業界動向。パス設計時に現実の求人市場・トレンドを反映すること。
出力: cc_layer/state/session_xxx/path_designs.json
""")
パス展開前に、候補者コンテキストとパス設計から報酬水準テーブルを生成:
python -m cc_layer.cli.compensation_fetch \
--mode build \
--candidate-context "{age}歳、{current_role}、年収{income}万" \
--paths-file cc_layer/state/session_xxx/path_designs.json \
--format prompt \
> cc_layer/state/session_xxx/compensation_ref.md
TAVILY_API_KEY が設定されている場合、--mode update で Web から最新データを補完可能:
python -m cc_layer.cli.compensation_fetch \
--mode update \
--candidate-context "{age}歳、{current_role}" \
--paths-file cc_layer/state/session_xxx/path_designs.json
path_designs.json の各パスに対して並列起動:
Agent(model=sonnet, prompt="""
cc_layer/prompts/path_expander_agent.md のフォーマットに従い、
以下のキャリアパスを10年間・4期に分けて展開してください。
graph_id: {graph_id}
identity: {identity_json}
path_design: {path_design_json}
requirement: {requirement}
## 報酬水準リファレンス(compensation_fetch生成)
{compensation_ref_md}
## 現実世界コンテキスト(Tavily取得済み)
knowledge_context: {knowledge_context}
job_market: {job_market_json}
※年収水準は報酬水準リファレンスを参照し、現実的な数値を使うこと。
※転職難易度・業界成長率などは現実世界コンテキストを参照。
出力: cc_layer/state/session_xxx/path_expanded_{path_id}.json
""")
5パスを単一メッセージ内の5つの Agent ツールで同時起動
python -m cc_layer.cli.path_score \
--input-dir cc_layer/state/session_xxx/ \
--designs-file cc_layer/state/session_xxx/path_designs.json \
--top-n 5 \
--output-file cc_layer/state/session_xxx/multipath_result.json
LLM呼び出し: 1+5=6回 (旧方式の480tickから大幅削減、かつClaudeが実際に推論)
50キャラクターがSNS上で投稿・反応・フォローし合う社会シミュレーション。 10のTmux CCセッション(各5キャラ)がラウンド単位でファイルベースIPCで同期。
# 1. エージェント定義JSON作成(profiles.jsonベース + 追加NPC)
# ConfigAgent or Orchestratorが生成
# 2. Swarm初期化(エージェントをワーカーに分配)
python -m cc_layer.cli.swarm_sync --mode init \
--session-dir cc_layer/state/session_xxx \
--agents-file cc_layer/state/session_xxx/swarm_agents.json \
--num-workers 10
# 3. 10 Tmuxセッション起動
./.claude/scripts/swarm_launch.sh cc_layer/state/session_xxx 20
for ROUND in $(seq 1 20); do
# 1. ラウンド開始シグナル
python -m cc_layer.cli.swarm_sync --mode prepare-round \
--session-dir cc_layer/state/session_xxx --round-num $ROUND
# 2. 全ワーカー完了を待機(ポーリング)
# check-round の all_done が true になるまで
python -m cc_layer.cli.swarm_sync --mode check-round \
--session-dir cc_layer/state/session_xxx \
--round-num $ROUND --num-workers 10
# 3. アクションをマージ → 次ラウンドのタイムライン生成
python -m cc_layer.cli.swarm_sync --mode merge \
--session-dir cc_layer/state/session_xxx \
--round-num $ROUND --num-workers 10
done
# 全アクションをZep形式でエクスポート
python -m cc_layer.cli.swarm_sync --mode export-zep \
--session-dir cc_layer/state/session_xxx \
--output-file cc_layer/state/session_xxx/swarm_episodes.json
# Zepへ書き込み
python -m cc_layer.cli.zep_write --graph-id {graph_id} \
--stdin-facts < cc_layer/state/session_xxx/swarm_episodes.json
Orchestrator ──prepare-round──▶ ready file
│
┌────────────────────────────┼────────────────────────┐
▼ ▼ ▼
Worker 0 Worker 1 ... Worker 9
read-timeline read-timeline read-timeline
→ SubAgent×5 → SubAgent×5 → SubAgent×5
write-actions write-actions write-actions
│ │ │
└────────────────────────────┼────────────────────────┘
│
Orchestrator ◀──check-round───── │
◀──merge──────────── ▼
timeline_round_N+1.json
コスト概算: 50キャラ × 20ラウンド = 1000アクション。各ワーカーが5キャラ分を1回のSubAgent呼出で生成する場合、10ワーカー × 20ラウンド = 200 SubAgent呼出。
multipath_result.json を読み込み、top N パスに対してクリエイティブ処理を実行。
Phase -1 の profile_generate --no-llm で生成したベースプロフィールを、
Zep RAG + シミュレーション結果を使ってリッチなナラティブペルソナに拡張する。
OpenAI の OasisProfileGenerator が担っていたLLMプロフィール生成をこのSubAgentが置換。
Agent(model=opus, prompt="""
Skills: mirofish-zep, mirofish-persona を参照。
以下のシミュレーション結果とベースプロフィールから、候補者のペルソナを深掘りしてください。
1. Zep RAGで候補者の背景情報(学歴、職歴、関係性)を検索
2. ベースプロフィールの bio/persona を詳細なナラティブに拡張
3. 構造的テンプレートに内的独白・心理描写を追加し、人間味のあるナラティブに拡張
graph_id: {graph_id}
identity: {identity_json}
base_profiles: {profiles_json}
final_states: {top_paths_final_states_json}
""")
top N パスそれぞれに対して並列起動:
Agent(model=sonnet, prompt="""
Skills: mirofish-zep, mirofish-persona, mirofish-career を参照。
以下のキャリアパスの全スナップショットから、10年間のキャリアストーリーを
1000-2000字で生成してください。イベントの因果関係、心情の変化、
ブロッカーによる葛藤を描写してください。
パス: {path_label}
identity: {identity_json}
snapshots: {path_snapshots_json}
""")
並列起動のポイント: 単一メッセージ内で複数の Agent ツールを呼ぶ
イベント発生ラウンドのみ、代表的なSNS投稿を生成:
Agent(model=haiku, prompt="""
あなたは以下のペルソナを持つ人物です。
{persona_text}
今期の出来事「{event_description}」について、
{platform}(Twitter/Reddit)に投稿してください。
""")
Agent(model=opus, prompt="""
Skills: mirofish-zep, mirofish-report, mirofish-career を参照。
以下のデータからキャリアシミュレーションレポートを生成してください。
Zep MCP を使ってグラフから追加情報を検索できます。
graph_id: {graph_id}
multipath_result: {multipath_result_json}
narratives: {narratives_json}
simulation_requirement: {requirement}
出力: cc_layer/state/session_xxx/report.md に書き出してください。
""")
Zep操作: InsightForge(分析セクション)、Panorama(概要)、QuickSearch(補足)
cc_layer/state/session_xxx/
├── extracted_text.txt ← text_process で生成
├── ontology.json ← ontology_generate で生成
├── graph_info.json ← graph_build で生成
├── profiles.json ← profile_generate で生成
├── sim_config.json ← sim_config_generate で生成
├── agent_state.json ← sim_init で生成
├── multipath_result.json ← multipath_run で生成
├── narrative_*.md ← NarrativeAgent(Sonnet) で生成
├── persona_*.md ← PersonaAgent(Opus) で生成
├── report.md ← ReportAgent(Opus) で生成
├── knowledge/ ← knowledge_curate + external_search で生成
│ ├── job_market.json ← 転職市場データ(Tavily)
│ ├── industry_news.json ← 業界ニュース(Tavily)
│ └── hr_trends.json ← HR動向(Tavily)
└── knowledge_context.txt ← knowledge_search で統合済みテキスト
| タイミング | 操作 | コマンド |
|---|---|---|
| Phase 0 完了後 | 初期状態をZepへ書込 | python -m cc_layer.cli.state_export --state-file ... --format zep-facts → Zep MCP |
| Phase 1 完了後 | シミュレーション結果をZepへ書込 | 同上(最終状態で再実行) |
| Phase 3 中 | Zepからグラフ検索 | Zep MCP の search / insight_forge |
failed_paths フィールドを確認、成功パスのみで続行全CLI は --help でself-documenting:
# 前処理パイプライン
python -m cc_layer.cli.text_process --help
python -m cc_layer.cli.ontology_generate --help
python -m cc_layer.cli.graph_build --help
python -m cc_layer.cli.profile_generate --help
python -m cc_layer.cli.sim_config_generate --help
# シミュレーション
python -m cc_layer.cli.sim_init --help
python -m cc_layer.cli.sim_tick --help
python -m cc_layer.cli.multipath_run --help
python -m cc_layer.cli.inject_event --help
# Zep連携
python -m cc_layer.cli.state_export --help
python -m cc_layer.cli.state_import --help
python -m cc_layer.cli.zep_search --help
python -m cc_layer.cli.zep_write --help
# ナレッジ
python -m cc_layer.cli.knowledge_curate --help
python -m cc_layer.cli.knowledge_search --help
python -m cc_layer.cli.external_search --help
python -m cc_layer.cli.compensation_fetch --help
各SubAgent呼び出し・Bash CLIコマンド実行後に、cc_tracker CLIでイベントを記録する。
レポート生成時に token_stats で統合的に可視化できる。
Agent tool の実行完了後、所要時間とステータスを記録:
python -m cc_layer.cli.cc_tracker log-subagent \
--session-dir cc_layer/state/session_xxx \
--model sonnet \
--phase phase_1_step_2 \
--duration-ms {elapsed_ms} \
--status success \
--description "path expansion path_1"
失敗時:
python -m cc_layer.cli.cc_tracker log-subagent \
--session-dir cc_layer/state/session_xxx \
--model sonnet \
--phase phase_1_step_2 \
--duration-ms {elapsed_ms} \
--status failure \
--error "timeout after 30s" \
--description "path expansion path_3"
Python CLI コマンド実行後、exit code とエラー出力を記録:
python -m cc_layer.cli.cc_tracker log-bash \
--session-dir cc_layer/state/session_xxx \
--command "python -m cc_layer.cli.swarm_sync --mode init ..." \
--exit-code $? \
--duration-ms {elapsed_ms}
エラー時(stderr がある場合):
python -m cc_layer.cli.cc_tracker log-bash \
--session-dir cc_layer/state/session_xxx \
--command "python -m cc_layer.cli.sim_tick --round 3" \
--exit-code 1 \
--duration-ms {elapsed_ms} \
--stderr "FileNotFoundError: agent_state.json not found"
# Rich terminal table
python -m cc_layer.cli.token_stats --session-dir cc_layer/state/session_xxx
# JSON出力
python -m cc_layer.cli.token_stats --session-dir cc_layer/state/session_xxx --json
# HTMLダッシュボード
python -m cc_layer.cli.token_stats --session-dir cc_layer/state/session_xxx --html
# CC-Nativeイベントのみ
python -m cc_layer.cli.cc_tracker summary --session-dir cc_layer/state/session_xxx
マルチパスシミュレーション後に、Swarmエージェントの議論でパスの内容を動的に変化させる。
各ラウンドで Phase A→B→C→D のサイクルを回す:
sim_tick × 5パス並列(Python CLI, 0 token)cc_layer/prompts/swarm_round_agent.mdcc_layer/prompts/influence_extractor.mdinject_event CLI)python -m cc_layer.cli.inject_event — 示唆イベントをCareerStateに注入python -m cc_layer.cli.swarm_sync --mode export-conversation — 会話ログ出力python -m cc_layer.cli.sanitizer — Webコンテンツサニタイズフロー全体: cc_layer/prompts/multipath_loop_orchestrator.md
設計仕様: docs/superpowers/specs/2026-03-14-swarm-in-the-loop-design.md