Skip to content

fix(droid): match tool names on word boundaries when inferring agent tools#1176

Merged
tmchow merged 2 commits into
EveryInc:mainfrom
LukeTheoJohnson:fix-droid-phantom-tool-inference
Jul 19, 2026
Merged

fix(droid): match tool names on word boundaries when inferring agent tools#1176
tmchow merged 2 commits into
EveryInc:mainfrom
LukeTheoJohnson:fix-droid-phantom-tool-inference

Conversation

@LukeTheoJohnson

@LukeTheoJohnson LukeTheoJohnson commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

Problem

When converting an agent to a Factory Droid, mapAgentTools infers the agent's tool list by scanning its name, description, and body for tool names with bodyLower.includes(claudeTool). A tool name that appears as a substring of an ordinary word is treated as a reference, so a prose only agent that names no tools still gets a list:

body: "Review the request using already gathered context then do tasks
        as a checklist with details. Never open an editor and think globally
        about tradeoffs."

inferred tools: ["Edit", "Glob", "LS", "Read", "Task"]

Each is a false positive: already -> Read, details -> LS, tasks -> Task, editor -> Edit, globally -> Glob. Because the frontmatter tools list restricts the droid to those tools, a spurious match silently narrows the agent's access. An agent that should run with full tools gets locked to five it never asked for.

Fix

Match tool names on word boundaries (\bread\b) instead of as substrings. This is the same approach the kiro converter already uses for its tool-name mapping in claude-to-kiro.ts. Real references still resolve; incidental substrings no longer do.

Tests

Two cases added to tests/droid-converter.test.ts:

  • the prose only agent above now infers no tools (was ["Edit", "Glob", "LS", "Read", "Task"])
  • an agent that references Read and Bash still infers ["Execute", "Read"]

Full droid suite green (14/14); tsc --noEmit clean.

Note

The draft #358 also touches mapAgentTools: it adds a fast path for agents that declare an explicit tools field. Agents without one (the case above) still fall through to the substring inference.

…tools

mapAgentTools inferred an agent's tool list with bodyLower.includes(), so common words produced phantom tools: "globally" gave Glob, "tools"/"skills" gave LS, "already" gave Read, "tasks" gave Task. An inferred list restricts the droid to those tools, so a false positive silently narrows the agent's access. Match on word boundaries instead, the same way the kiro converter's tool mapping already does.
@LukeTheoJohnson
LukeTheoJohnson force-pushed the fix-droid-phantom-tool-inference branch from a75c7e0 to dfe8ee7 Compare July 19, 2026 06:09
@LukeTheoJohnson
LukeTheoJohnson marked this pull request as ready for review July 19, 2026 06:11

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: dfe8ee79ea

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread src/converters/claude-to-droid.ts
The word-boundary switch stopped `\bquestion\b` matching inside the CamelCase AskUserQuestion, so an agent that used it alongside another tool lost the AskUser mapping (Codex review). Key on the full lowercased tool name instead, which restores the mapping and drops the bare-word "question" false positive.
@tmchow
tmchow merged commit a60bd82 into EveryInc:main Jul 19, 2026
2 checks passed
@github-actions github-actions Bot mentioned this pull request Jul 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants