Spurious "Unknown tool name" warning when a cross-family sub-agent inherits the parent tool list
Nobody has claimed this yet.
- Dominant language
- Shell
- Stars
- 11.2k
- Forks
- 1.9k
- Avg merge
- 14h 16m
- Merged PRs (30d)
- 6
Description
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:
- 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
- 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-agentclaude-opus-5
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with sessionPlanToolFilterDiagnosticsForSessionJson in prebuilds/darwin-arm64/runtime.node and reproduce the allowlist and excludedlist cases from the issue using cross-family sub-agents. Trace how tool registries are selected and how warnedUnknownTools/markWarned are used. Done means valid tools from another model family no longer produce an “Unknown tool name” warning, while names unknown everywhere still do.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- javascript, shell
- Domain
- cli, tooling
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100