Source Intelligence

DisclaimerUnofficial, and not affiliated with Anthropic. Nearly all of this is read straight out of what ships: npm bundles, captured prompts, published docs. Anthropic's own notes go in verbatim, marked as theirs. The rest is my reading, and every entry carries the strings behind it. If one looks wrong, vote it down and say why.

All of v2.1.227 Home All releases olderv2.1.226 v2.1.228newer
Claude Code v2.1.227

agent() refuses spawns whose tool restrictions cannot be applied

You'll notice
Useful3 Signal3
Subagents

Spawning a sub-agent fails outright if its disallowed-tools list can't actually be applied.

disallowedTools
What

When a workflow spawns a sub-agent, every entry in its disallowedTools list is now checked against the tools that agent would actually get. Anything that cannot be matched aborts the spawn with an explanation instead of quietly running the agent with the restriction dropped. Entries that parse fine but match nothing log a "no-op here" warning and the spawn continues.

Details
  • rejected: a stray space before rule parentheses, unbalanced parentheses, an empty server name in an mcp__ entry, wildcards inside an MCP server or tool name, and * used outside an mcp__ spec
  • also rejected: entries that are not non-empty, non-whitespace-padded strings, and bashCommandClamp entries that do not parse as a Bash permission rule with real content
  • case-mismatched or misspelled MCP entries are caught by a new analyser that classifies each entry as a declared server, a server present in the pool, a near-miss with a suggested correct spelling, or unmatched
Evidence

agent() opts.disallowedTools unparseable entry, Refusing the spawn rather than running it un-narrowed.

Strings lifted out of the shipped bundle, so the claim above can be checked against them.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

See this entry in the whole of v2.1.227 →