explanatory-output-style plugin SessionStart hook hangs all input in 2.1.132

Resolved 💬 3 comments Opened May 7, 2026 by sgalliver Closed May 11, 2026

Summary

The explanatory-output-style@claude-plugins-official plugin registers a
SessionStart hook that hangs the Claude Code harness for 5 seconds,
30 seconds, or up to the 600s hard timeout
before resolving. While the
hook is alive, no user input is processed — including built-in slash
commands like /exit. The hook's script body is trivial
(cat << EOF { ... } EOF; exit 0), so the hang appears to be in the
harness's hook invocation rather than the plugin script.

Affects every new claude process — fresh sessions, --resume, and
--continue — making the harness effectively unusable for users with
the plugin enabled.

Symptoms

  • Slow first prompt on a new session (apparent freeze)
  • Slash commands typed during the freeze appear to silently fail (input

box clears, no command dispatches)

  • Eventually the session "thaws" and behaves normally
  • Sessions started prior to today's marketplace refresh continue working

normally — the hook only fires at session start

Evidence

From four stillborn session JSONLs all dated 2026-05-07:

| Session | Hook duration | Outcome |
|---|---|---|
| bc49f1cc… | 29,948 ms | hook_non_blocking_error |
| 0e4d5f88… | 5,384 ms | hook_non_blocking_error |
| a253ec97… | 600,061 ms | hook_cancelled (10-min cap) |
| 5658b76e… | 600,054 ms | hook_cancelled |

Confirmed live by ps: multiple bash session-start.sh processes from
the plugin in S state (sleeping), oldest from 9:18 AM today. They
never exit on their own.

Reproduction

  1. Install explanatory-output-style@claude-plugins-official from the

official marketplace.

  1. Confirm it's enabled in ~/.claude/settings.json enabledPlugins.
  2. Start a new claude process: claude or claude --continue.
  3. Try any prompt or slash command at the first prompt.
  4. Observe: input is queued but doesn't dispatch until the hook resolves

(5s–600s).

Suspected root cause

The plugin's hook script is trivially fast:

#!/usr/bin/env bash
cat << 'EOF'
{ "hookSpecificOutput": { "hookEventName": "SessionStart", "additionalContext": "..." } }
EOF
exit 0

Running this script directly from a shell takes ~5 ms. The hang is in
how the harness invokes the hook, not the script. Hypothesis: a
recent change in 2.1.131 or 2.1.132 altered hook subprocess setup
(stdin/stdout pipe handling, ${CLAUDE_PLUGIN_ROOT} resolution, or
similar). The plugin's files haven't been modified since 2026-03-30;
the regression aligned with today's marketplace refresh (~09:20 PT,
2026-05-07) when installed_plugins.json was rewritten.

Worth noting: even though the hook is registered without
blocking: true, the harness still waits for it to complete or die
before unblocking input. A non-blocking hook arguably shouldn't gate
user input on its own lifecycle.

Workaround

Disable the plugin in ~/.claude/settings.json enabledPlugins (remove
the "explanatory-output-style@claude-plugins-official": true entry).
Sessions become responsive immediately for new launches.

Environment

  • claude-code: 2.1.132
  • macOS: Darwin 25.4.0
  • Marketplace: claude-plugins-official
  • Plugin: explanatory-output-style@claude-plugins-official v1.0.0
  • Plugin script unchanged since 2026-03-30

---

(Issue drafted by Claude Code 🤖 but reviewed by me before posting)

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗