# OpenClaw ドッキングプラン — DTP × OpenClaw 統合設計 --- ## 現状のドッキングポイント(5箇所) ``` ┌──────────────────────────────────────────────────────────────────┐ │ OpenClaw (TypeScript/Node.js) │ │ │ │ ┌────────────────┐ ┌────────────────┐ ┌────────────────────┐ │ │ │ exec-approvals │ │ hooks │ │ sessions-spawn │ │ │ │ スナップショット│ │ イベント発火 │ │ サブエージェント │ │ │ │ 承認/拒否判定 │ │ 外部通知 │ │ 起動/停止 │ │ │ └───────┬────────┘ └───────┬────────┘ └─────────┬──────────┘ │ │ │ │ │ │ │ ┌───────┴────────┐ ┌───────┴────────┐ ┌─────────┴──────────┐ │ │ │ routing │ │ memory │ │ gateway │ │ │ │ セッションキー │ │ sync/search │ │ WebSocket/HTTP │ │ │ │ エージェント │ │ ベクトル検索 │ │ メッセージ配信 │ │ │ │ 振り分け │ │ │ │ │ │ │ └────────────────┘ └────────────────┘ └────────────────────┘ │ │ │ └────────────────────┬─────────────────────────────────────────────┘ │ │ Shell / HTTP │ ┌────────────────────┴─────────────────────────────────────────────┐ │ miyabi-cli-standalone (Rust) │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ gate.rs │ │ lock.rs │ │store.rs │ │protocol │ ← Phase A │ │ │ GATE検証 │ │ ファイル │ │tasks.json│ │.rs │ │ │ │ │ │ ロック │ │永続化 │ │統合窓口 │ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ 既存 │ │ │ dag.rs │ │github.rs │ │approval │ │openclaw │ │ │ │ DAG 823行│ │ GH 947行 │ │.rs 231行 │ │.rs 354行 │ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ └──────────────────────────────────────────────────────────────────┘ ``` --- ## ドッキングポイント詳細 ### 1. exec-approvals ↔ gate.rs **OpenClaw 側**: `exec-approvals-cli.ts` - `loadSnapshot()` / `saveSnapshot()` で承認状態を永続化 - `normalizeAllowlistEntry()` で許可リストを管理 - `resolveAgentKey()` でエージェント特定 **DTP 側**: `gate.rs` - `ensure_impact(task, human_approved)` で HIGH/CRITICAL を承認ゲート - `ensure_issue()` で Issue 存在を検証 **ドッキング方法**: - OpenClaw の `exec-approvals` が DTP の GATE 結果を参照 - DTP の `protocol.record_impact()` が承認を要求 → OpenClaw が approval snapshot に記録 - 連携: `miyabi gate impact --risk HIGH` → exit code 1(承認待ち)→ OpenClaw が承認 → `miyabi gate impact --risk HIGH --approve` **改善が必要**: - [ ] gate.rs に `--approve` フラグ対応(承認者 ID + 理由を記録) - [ ] exit code で承認状態を返す(0=承認済み, 1=承認待ち, 2=拒否) ### 2. hooks ↔ protocol.rs イベント **OpenClaw 側**: `hooks/` - `loadHookEntries()` でフックを登録 - `registerInternalHook()` でイベント発火 - イベント: ツール実行前後、セッション開始/終了、メッセージ送受信 **DTP 側**: `protocol.rs` の各メソッド - register_task → `task_registered` イベント - assign_and_lock → `lock_acquired` イベント - record_merge → `task_completed` イベント **ドッキング方法**: - DTP の各 protocol メソッドが完了後に hook を発火 - OpenClaw の hooks システムが DTP イベントを購読 - 連携: `miyabi gate register` 実行 → stdout に JSON イベント → OpenClaw hook がキャッチ **改善が必要**: - [ ] protocol.rs の各メソッドに `--emit-event` オプション(JSON イベントを stdout に出力) - [ ] OpenClaw hooks に DTP イベント用のフックテンプレートを追加 ### 3. sessions-spawn ↔ orchestration.rs **OpenClaw 側**: `subagent-spawn.ts` - `spawnSubagentDirect()` でサブエージェントを起動 - セッションキーで管理 **DTP 側**: `orchestration.rs` - `Orchestrator` で並列実行 - `ParallelConfig` で同時実行数制御 **ドッキング方法**: - OpenClaw main が DTP のタスクを受け取る - `miyabi gate dispatchable` で実行可能タスクを取得 - 各タスクを `spawnSubagentDirect()` でサブエージェントに配布 - サブエージェントが `miyabi gate assign` → 作業 → `miyabi gate pr` → `miyabi gate merge` **改善が必要**: - [ ] `miyabi gate dispatchable --format json` でマシン可読出力 - [ ] 各タスクに `assigned_agent` フィールドを OpenClaw agent ID で記録 ### 4. memory ↔ store.rs **OpenClaw 側**: `memory/` - `syncMemoryFiles()` でファイル同期 - `searchVector()` / `searchKeyword()` でメモリ検索 - `indexFileEntryIfChanged()` でインデックス更新 **DTP 側**: `store.rs` - `tasks.json` の読み書き - atomic rename で永続化 **ドッキング方法**: - `tasks.json` を OpenClaw のメモリ同期対象に含める - OpenClaw の `syncMemoryFiles()` が `project_memory/tasks.json` を各ノードに配布 - 検索: `searchKeyword("task-001")` で特定タスクの状態を取得 **改善が必要**: - [ ] `project_memory/` を OpenClaw memory sync の対象パスに追加 - [ ] tasks.json の変更を OpenClaw memory index に自動反映 ### 5. routing ↔ dag.rs タスク振り分け **OpenClaw 側**: `routing/` - `resolveAgentIdFromSessionKey()` でエージェントを特定 - `normalizeAgentId()` / `sanitizeAgentId()` **DTP 側**: `dag.rs` - `TaskGraph` で依存関係管理 - `build_levels()` で並列実行グループ計算 **ドッキング方法**: - DTP の DAG レベルに基づいて、OpenClaw routing がエージェントを振り分け - Level 0 のタスク → 即座にディスパッチ - Level 1 のタスク → Level 0 完了後にディスパッチ - 連携: `miyabi gate dag --format json` → OpenClaw が読んで routing 判定 **改善が必要**: - [ ] dag.rs の出力に `assigned_agent` を含める - [ ] OpenClaw routing が DTP DAG レベルを考慮するアダプタ --- ## ドッキング実行シーケンス ``` OpenClaw main (Gateway) │ ▼ 1. miyabi gate register --issue 45 --title "認証移行" │ → tasks.json に登録、GATE 0 検証 │ → exit 0 (成功) or exit 2 (Issue なし) │ ▼ 2. miyabi gate dispatchable --format json │ → 実行可能タスク一覧を返す │ ▼ 3. openclaw sessions spawn --agent kade │ → サブエージェント(カエデ)を起動 │ ▼ 4. miyabi gate assign task-001 --agent kade --node macbook --files "src/auth.rs" │ → ファイルロック獲得、implementing に遷移 │ → exit 0 (成功) or exit 1 (ロック競合) │ ▼ 5. (カエデが実装) │ ▼ 6. miyabi gate branch task-001 feature/issue-45-auth │ ▼ 7. miyabi gate pr task-001 78 │ → reviewing に遷移 │ ▼ 8. openclaw sessions spawn --agent sakura │ → サクラにレビュー依頼 │ ▼ 9. miyabi gate merge task-001 │ → GitHub API で merge 検証 │ → ロック解放、Done に遷移 │ → 後続タスク解放 │ ▼ 10. openclaw hooks emit "task_completed" --task task-001 │ → Telegram 通知、worklog 記録 ``` --- ## 改善が必要な項目まとめ | # | 項目 | 場所 | 難易度 | Phase | |---|------|------|--------|-------| | 1 | `--approve` フラグ + 承認者記録 | gate.rs | 低 | A | | 2 | exit code 標準化 (0/1/2) | CLI | 低 | B | | 3 | `--emit-event` JSON イベント出力 | protocol.rs | 中 | B | | 4 | `--format json` 全コマンド対応 | CLI | 低 | B | | 5 | `assigned_agent` の OpenClaw ID 記録 | store.rs | 低 | A | | 6 | OpenClaw hooks に DTP テンプレート | OpenClaw 側 | 中 | C | | 7 | memory sync に tasks.json を追加 | OpenClaw 側 | 低 | C | | 8 | routing が DAG レベルを考慮 | OpenClaw 側 | 中 | C 以降 | **#1-5 は miyabi-cli-standalone 側(Phase A/B で対応可能)** **#6-8 は OpenClaw 側(Phase C 以降で対応)** --- ## リスク評価 | リスク | 影響 | 対策 | |--------|------|------| | OpenClaw Gateway が落ちている | DTP CLI は動くが通知が飛ばない | DTP は GitHub SSOT に依存、Gateway は補助 | | tasks.json の同期タイミングズレ | 別ノードが古い状態を見る | memory sync の頻度を上げる or git push で共有 | | サブエージェントがクラッシュ | ロックが残る | TTL + stale 検出で自動解放 | | exec-approvals と gate.rs の二重承認 | 混乱 | DTP gate を authority にし、exec-approvals は参照のみ | --- _This plan defines how OpenClaw docks with DTP. Implementation starts after Phase A/B are complete._