Grep and Glob absent from the tool registry entirely: tengu_non_deferrable_builtins is empty (recurrence of #52004, with the flag identified)
Summary
Grep and Glob are absent from the main session's tool registry entirely — not
deferred, not searchable. This looks like a recurrence of #52004 (closed), but I
was able to trace it to a specific feature flag rather than guessing, so this
report names the flag and rules out the obvious local causes.
The flag: tengu_non_deferrable_builtins is {} (empty) for this account.
$ jq -r '.cachedGrowthBookFeatures |
{non_deferrable: .tengu_non_deferrable_builtins,
deferred_stub: .tengu_deferred_stub_tool,
unsupported_models: .tengu_tool_search_unsupported_models}' ~/.claude.json
{
"non_deferrable": {},
"deferred_stub": true,
"unsupported_models": [
"claude-3-5-haiku",
"claude-3-haiku"
]
}
If tengu_non_deferrable_builtins is the allowlist of built-ins protected from
deferral, an empty value leaves every built-in deferrable. Withtengu_deferred_stub_tool: true, Grep and Glob appear to be deferred and
then fail to re-register as searchable stubs, so they disappear rather than
becoming discoverable via ToolSearch.
Environment
- Claude Code 2.1.233 and 2.1.224 — both reproduce
- Installed via
claude install(native build), not npm - Model: Opus 5 (1M context), Claude Max
- Linux (arm64 devcontainer)
Reproduction
$ claude -p 'List the exact names of every tool available to you right now, comma-separated. Nothing else.'
Agent, Bash, Edit, ListAgents, Read, ReportFindings, ScheduleWakeup, Skill,
ToolSearch, Workflow, Write, CronCreate, CronDelete, CronList, DesignSync,
EnterWorktree, ExitWorktree, Monitor, NotebookEdit, PushNotification,
RemoteTrigger, SendMessage, TaskCreate, TaskGet, TaskList, TaskOutput,
TaskStop, TaskUpdate, WebFetch, WebSearch
No Grep, no Glob — and note every deferred tool (CronCreate …WebSearch) is present, so the deferral mechanism itself is working. In an
interactive session, ToolSearch("select:Grep,Glob") returnsNo matching deferred tools found, and a keyword search for
"search file contents by regex pattern across directory" returns unrelated tools.
What this is NOT — each eliminated by test, not by reasoning
| Hypothesis | Test | Result |
|---|---|---|
| Version regression (#52004 was 2.1.117) | Downgraded latest 2.1.233 → stable 2.1.224 | Still missing |
| Local config disables them | Read .claude/settings.json, .claude/settings.local.json, ~/.claude/settings.json | No tool keys of any kind |
| CLI flags | Inspected the launch cmdline via ps | No --allowedTools / --disallowedTools / --tools |
| MCP tool payload pushing past a deferral threshold | Removed an MCP server contributing ~50 tool definitions | No change |
| Tool search itself | ENABLE_TOOL_SEARCH=0 and ENABLE_TOOL_SEARCH=standard | Byte-identical tool lists |
| --tools default | claude --tools default -p … | Still missing |
| Stale flag cache | cachedGrowthBookFeaturesAt = today | Cache is fresh |
Note also that permissions.deny / --disallowedTools could not cause this by
definition — those gate whether a call is approved, and a denied tool still
appears in the schema. These are absent from the schema.
Subagents are unaffected
Explore and general-purpose subagents have Grep and Glob normally. That
fits the flag explanation: subagents don't run tool search, and Opus 5 is not intengu_tool_search_unsupported_models (only the two Haiku 3 models are), so the
deferral path runs for the main session only.
Impact
The main session has no content search and no filename search except shelling
out to grep/rg/find via Bash. That is a workable fallback, but it is
slower, noisier in context, and interacts badly with permission tooling that is
built around the assumption that file search goes through a first-class tool.
It also silently invalidates guidance in CLAUDE.md-style project docs that say
"prefer the dedicated search tools."
Suggested fix
Populate tengu_non_deferrable_builtins with the core file tools
(Grep, Glob, and presumably Read/Edit/Write/Bash), or makeGrep/Glob structurally non-deferrable. Failing that, if they are meant to
be deferrable, they should at least register as ToolSearch-discoverable stubs
the way Monitor and WebFetch do, instead of vanishing.
Related
- #52004 — same symptom on 2.1.117, closed; root cause was guessed at rather than identified
- #31002 — "Built-in system tools now deferred behind ToolSearch (undocumented change)"
- #54716 — request for a settings-level opt-out of built-in deferred tools