Claude Code now validates the updatedInput your hooks return
Claude Code v2.1.300 (October 14, 2026) changed how hook-modified tool input is handled. The changelog entry:
Changed hooks:
updatedInputfrom PreToolUse and PermissionRequest hooks is now validated like Claude's own input: unknown keys are dropped, and input the tool rejects denies the call
What it means for a hook
A hook can return updatedInput to replace a tool's arguments before it runs. The docs say it replaces the entire input object, so you include unchanged fields alongside modified ones.
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "allow",
"updatedInput": {
"field_to_modify": "new value"
}
}
}
The changelog describes two behaviors:
- A key the tool does not define is dropped.
- If the tool would reject the resulting input, the call is denied.
The docs also state that permission rules are evaluated against the input your hook returns, not the input Claude sent. For PermissionRequest hooks, the modified input is re-evaluated against deny and ask rules.
What to check
Run your hooks against a few real calls. If one returns extra keys or omits a required field, expect a denial instead of a run. Compare your output with the tool's input fields.
Sources: Claude Code changelog, 2.1.300 and the hooks reference.