github / github/copilot-cli

Spurious "Unknown tool name" warning when a cross-family sub-agent inherits the parent tool list

オープン
#4,457 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

area:agents area:tools
主要言語
Shell
スター
11.2k
フォーク
1.9k
平均マージ
14時間 16分
マージ済み PR(30日)
6

説明

Describe the bug

Spawning a cross-model-family sub-agent re-validates the parent session's tool allowlist/excludedlist against the sub-agent's tool registry. Because apply_patch is registered only for OpenAI Codex models, a valid Codex-session config emits a spurious warning the moment a Claude sub-agent starts:

Unknown tool name in the tool excludedlist: "apply_patch"

The name is not unknown — apply_patch is a first-class CLI tool ("Add apply_patch toolchain for OpenAI Codex models", per the changelog). It is simply not in the Claude registry. The message misreports a legitimate cross-family situation as a config typo.

This surfaces most often with rubber-duck, because its complementary model strategy deliberately selects the opposite model family, making it by far the most common cross-family spawn in normal use.

Steps to reproduce
copilot -p "Use the task tool with agent_type='rubber-duck' and model='claude-opus-5' asking it to reply PING." \
  --model gpt-5.3-codex \
  --excluded-tools apply_patch \
  --allow-all-tools

The parent (gpt-5.3-codex) accepts apply_patch silently. The warning appears only when the Claude sub-agent spawns.

Isolating the trigger

Controlled 2×2 — identical parent model and identical flags, varying only the sub-agent:

Sub-agent spawned Warning
none 0
gpt-5.3-codex (same family) 0
claude-opus-5 (cross-family) 1 (reproduced on 2/2 runs)

The cross-family spawn is the sole variable. Same behaviour via --available-tools (reported as tool allowlist instead of tool excludedlist).

Model-family dependence of the registry, confirmed independently:

Command Result
--available-tools apply_patch --model claude-opus-5 warns
--available-tools apply_patch --model gpt-5.3-codex silent
Expected behaviour

A tool name that is valid for some model family should not be reported as unknown. Either:

  1. Validate against the union of all model families' registries, warning only for names unknown everywhere (genuine typos); then silently filter per-family at spawn time; or
  2. If a per-family notice is genuinely wanted, word it accurately — e.g. Tool "apply_patch" is not available for claude-opus-4.5; excluded from sub-agent — rather than "Unknown tool name".
Actual behaviour

The user is warned about a consequence of a decision the CLI made on its own (rubber-duck selecting a complementary model). The warning is unactionable: removing apply_patch defeats the intent for the Codex parent, and keeping it emits the warning on every session that spawns a cross-family sub-agent.

Root cause

The emitter is sessionPlanToolFilterDiagnosticsForSessionJson in prebuilds/darwin-arm64/runtime.node. Calling it directly reproduces the exact strings:

const h = require("./prebuilds/darwin-arm64/runtime.node");
const f = h.sessionPlanToolFilterDiagnosticsForSessionJson;

f("sess", JSON.stringify({ availableTools: ["apply_patch"] }));
// -> Unknown tool name in the tool allowlist: "apply_patch"

f("sess", JSON.stringify({ excludedTools: ["apply_patch"] }));
// -> Unknown tool name in the tool excludedlist: "apply_patch"

The configured list is checked against the session's registered tool names, with no awareness that the registry varies by model family. Warnings dedupe per name per session via warnedUnknownTools / markWarned.

Impact

Cosmetic. The tool list is still applied correctly and nothing breaks — but the message is misleading, unactionable, and appears in the common rubber-duck path, which trains users to ignore configuration warnings.

Related

Same weak spot as #4432 (cross-family sub-agent handling), though distinct: #4432 is functional (the wrong model actually runs), this one is presentational.

Environment
  • Copilot CLI 1.0.79, darwin-arm64 (macOS, Apple Silicon)
  • Reproduced with parent gpt-5.3-codex, sub-agent claude-opus-5

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

prebuilds/darwin-arm64/runtime.node の sessionPlanToolFilterDiagnosticsForSessionJson から始め、クロスファミリーのサブエージェントを使って issue にある allowlist と excludedlist のケースを再現します。ツールレジストリがどのように選択され、warnedUnknownTools/markWarned がどのように使われているかを追跡します。別のモデルファミリーに属する有効なツールで “Unknown tool name” 警告が出なくなり、どこでも未知の名前では引き続き出るようになれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
javascript, shell
領域
cli, tooling
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
静か
明瞭さ
おおむね明確
初心者へのやさしさ
45/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。