Spurious "Unknown tool name" warning when a cross-family sub-agent inherits the parent tool list
Personne n'a encore pris cette issue.
- Langage dominant
- Shell
- Étoiles
- 11.2k
- Forks
- 1.9k
- Merge moyen
- 14 h 16 min
- PR mergées (30 j)
- 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
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par sessionPlanToolFilterDiagnosticsForSessionJson dans prebuilds/darwin-arm64/runtime.node et reproduisez les cas d’allowlist et d’excludedlist de l’issue à l’aide de sous-agents inter-familles. Suivez comment les registres d’outils sont sélectionnés et comment warnedUnknownTools/markWarned sont utilisés. Le travail est terminé lorsque les outils valides d’une autre famille de modèles ne produisent plus d’avertissement “Unknown tool name”, tandis que les noms inconnus partout continuent d’en produire un.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- javascript, shell
- Domaine
- cli, tooling
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- Calme
- Clarté
- Plutôt claire
- Accessibilité débutants
- 45/100