Claude Code now explains and prevents a deadlock when a classic hook other than SessionStart, Setup, or SessionEnd tries to wait on the turn it's holding
What
Hooks are scripts that run at certain points in a session (for example, when a session starts or ends). Claude Code has "classic" hooks (classic.*) for these events, plus other hook-like calls such as command.run and tool.call.
A new check now catches the case where a call from a classic.* hook — other than SessionStart, Setup, or SessionEnd — would block waiting on the very turn that hook is currently holding. Previously this could silently deadlock. Now it produces a specific, clear error explaining the problem and suggesting the call be made from turn.complete instead. This check is wired in as the fallback case alongside the same checks already used for command.run, tool.call, and similar calls.
Why
This turns a confusing hang into an understandable error message, and tells you exactly how to fix it (move the call to turn.complete), so hook authors aren't left guessing why their hook froze.