[子セッションが呼び出し元のアカウントを継承しないよう改善] - Agents/channels: route cross-agent subagent spawns through the target agent's bound channel account while preserving peer and workspace/role-scoped bindings, so child sessions no longer inherit the caller's account in shared rooms, workspaces, or multi-account setups.
OpenClaw v2026.4.19-beta.1で導入された修正のトラブルシューティングガイドです。
トラブルシューティング: クロスエージェントサブエージェントが誤ったアカウントIDで生成される問題
リリース: v2026.4.19-beta.1
重要度: Medium
コンポーネント: openclaw-agents, openclaw-routing
症状
Matrix(または他のチャネルプラグイン)でマルチエージェントデプロイメントを実行している場合、以下の現象が 발생할ることがあります。
- 他のエージェントに代わって生成された子セッションが、ターゲットエージェントのバインド済みアカウントではなく、呼び出し元.callersのIDで投稿を行います。
- 共有ルームやワークスペースでは、发言者の帰属先が正しく表示されず、サブエージェントからのメッセージが生成エージェントから送信された 것처럼見えます。
- エージェントが異なるルームやピアコンテキストごとに異なるアカウントにバインドされている場合、サブエージェントはルームごとのバインドを考慮せず、最初に解決されたアカウントを使用します。
- マルチアカウント設定では、自身がバインドしたIDの下で動作するはずの子エージェントが、呼び出し元のアカウントの下で動作してしまいます。
原因
親セッションが別のターゲットエージェント用に子エージェントを生成问题时、ルーティングロジックがターゲットのバインド済みアカウントを正しく解決していませんでした。代わりに、ターゲットのバインディングが参照される前に deliveryContext.accountId が呼び出し元のアカウントでシードされていました。
resolveFirstBoundAccountId ヘルパーは元々は channel + agent のみでマッチしていたため、複数のルームやピアにバインドされたエージェントは、アクティブなルームやピアコンテキストに関係なく「最初のバインディング優先」セマンティクスを受け取るしていました。これにより、共有ルームシナリオでの发言者IDの不整合や非決定論的な動作が発生していました。
さらに、配信ターゲット(例:room:<id>、channel:<id>、conversation:<id>)のプレフィックス解析がチャネルプラグイン間で一貫しておらず、正しいピア識別子の抽出に失敗することがありました。
解決手順
1. 修正済みリリースへのアップグレード
v2026.4.19-beta.1 以降にアップグレードしてください。このリリースでは以下が導入されています。
src/agents/subagent-spawn.tsのresolveRequesterOriginForChild(...)- 呼び出し元のアカウントではなく、ターゲットエージェントのバインド済みアカウントを優先します。src/routing/bound-account-read.tsのresolveFirstBoundAccountIdにおける4層優先順位モデル - ピア認識マッチングをサポート。
2. 配信ターゲットプレフィックス処理の確認
チャネル設定が正規化された配信ターゲットプレフィックスを使用していることを確認してください。修正により、以下のプレフィックスが一般的に削除されます。
// 汎用プレフィックス剥がし(`room:`、`channel:`、`conversation:` などのパターンマッチ)
const rawPeerId = agentTo.replace(/^[a-z][a-z0-9_-]*:/, '');
チャネルプラグインがカスタム2パートプレフィックス(例:line:group:<id>)を使用している場合、プラグインの inferTargetChatType が実装되어いて曖昧さ解消ができることを確認してください。なければ、剥がしは最初のプレフィックスのみを削除し、2番目のセグメントから種類を推定します。
3. マルチルームバインディングの再設定(該当する場合)
エージェントが単一のフォールバックアカウントで複数のルームにバインドされていた場合、新しい優先順位モデルはピアごとに選択するようになりました。各ルームのバインディングが明示的に設定されていることを確認してください。
// 例: ルームごとに異なるアカウントにバインドされたエージェント
agent: {
bindings: [
{ channel: "matrix", agent: "agent-id", peer: "room-id-1", accountId: "account-1" },
{ channel: "matrix", agent: "agent-id", peer: "room-id-2", accountId: "account-2" }
]
}
検証
アップグレード後ライifecycleテストスイートを実行して修正を確認してください。
pnpm test:changed src/agents/openclaw-tools.subagents.sessions-spawn.lifecycle.test.ts
15개의 라이프사이클 테스트가 모두 통과해야 합니다. 특히 다음シナリオを確認してください。
- ターゲットエージェントのバインド済みアカウントが使用される — 共有ルームで別のエージェント用の子を生成する場合、呼び出し元のアカウントではなくターゲットのアカウントが使用されます。
- 同一エージェント生成は呼び出し元を保持 — 同じエージェント用に子を生成する場合も呼び出し元のアカウントが使用されます(不必要的な再解決なし)。
- プレフィックスstrippingが機能する —
room:<id>やconversation:<id>などのターゲットが正しくピアバインディングに解決されます。 - 埋め込みマーカー種の推論 —
room:@user:serverのようなMatrix形式のターゲットが正しくdirectとして分類されます。
ライブ検証については、バインドされたMatrixルームでサブエージェントを生成し、ターゲットエージェントのIDで投稿されることを確認してください。
よくある落とし穴
チャネルプラグインの
inferTargetChatTypeが欠落している: チャネルプラグインがinferTargetChatTypeを実装していない場合、修正はプレフィックスからの種類推論に依存します。2パートプレフィックスが認識されていることを確認するか、フックを実装してください。明示的なピアバインディングのないマルチルームエージェント: 複数のルームにバインドされたエージェントは、ピア固有のバインディングが存在しない場合、チャンネル専用のバインディングにフォールバックする可能性があります。曖昧さを避けるために、各ルームに明示的なピアバインディングを追加してください。
種の同等性:
groupとchannelの種はワイルドカードマッチングで同等として扱われます(resolve-route.tsのpeerKindMatchesを反映)。バインディングが一貫した種のラベルを使用していることを確認してください。ピアなしの呼び出し元(cron配信): ヘルパーは下位互換性を維持しています —
peerId/peerKindを渡さない呼び出し元は、ピアなしフォールバック層 통해以前的と同じバインディングを受け取ります。
関連するエラー
ログで以下が表示される場合、アップグレードで解決されるはずです。
- Matrixルームでの親セッションと子セッション間の
deliveryContext.accountIdの不一致 - 共有ルームデプロイメントでのサブエージェントメッセージの誤った送信者への帰属
- ルーム間の非決定論的なアカウント選択を引き起こす「最初のバインディング優先」動作
参照: PR #67508 — Route cross-agent subagent spawns through target agent’s bound channel account
リリース: v2026.4.19-beta.1