SessionStart: plugin hook's `hookSpecificOutput` format silently drops concurrent user hook's flat `additionalContext`

Resolved 💬 2 comments Opened Mar 7, 2026 by sgalliver Closed Mar 9, 2026

Bug Report

Preflight checklist

  • [x] I've searched existing issues and this hasn't been reported (related: #28372, which covers a parallel race condition in the same merging layer)
  • [x] This is a single bug

Description

When a plugin-registered SessionStart hook outputs the hookSpecificOutput nested format and a user-registered hook outputs the flat additionalContext format, only the plugin's context reaches Claude — the user hook's context is silently dropped.

The docs state: "Multiple hooks' values are concatenated" (hooks.md, SessionStart additionalContext field). That's not what happens here.

Steps to Reproduce

  1. Enable a plugin that registers a SessionStart hook outputting:

``json
{"hookSpecificOutput": {"hookEventName": "SessionStart", "additionalContext": "plugin content"}}
`
(e.g.
explanatory-output-style@claude-plugins-official`)

  1. Register a user SessionStart hook in settings.json that outputs:

``json
{"additionalContext": "user content"}
``

  1. Start a new session.

Expected: Claude receives both "plugin content" and "user content" concatenated.
Actual: Claude only receives "plugin content". The user hook's output is silently dropped.

Additional context

  • The user hook runs successfully (exit 0) and produces valid JSON — verified by running it manually.
  • Swapping the format of the user hook to use hookSpecificOutput doesn't change the outcome.
  • The SessionStart:startup hook success: Success message appears in Claude's context, confirming the hook fired — but the additionalContext value never arrives.
  • Workaround: Consolidate both hooks into a single user hook and disable the plugin.

Environment

  • Claude Code version: current as of 2026-03-06
  • macOS (darwin 25.3.0, Apple Silicon)
  • Plugin: explanatory-output-style@claude-plugins-official

View original on GitHub ↗

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