[FEATURE] SessionStart hook success system-reminders should include hook name or use systemMessage

Resolved 💬 3 comments Opened Jan 6, 2026 by coygeek Closed Feb 28, 2026

Preflight Checklist

  • [x] I have searched existing requests and this feature hasn't been requested yet
  • [x] This is a single feature request (not multiple features)

Problem Statement

When SessionStart hooks succeed, Claude Code injects a generic system-reminder into the conversation context:

<system-reminder>
SessionStart:startup hook success: Success
</system-reminder>

This message is identical for every hook and provides zero useful information to Claude. With multiple SessionStart hooks configured, Claude receives many identical "Success" messages that:

  1. Waste tokens (~10 tokens × N hooks per session)
  2. Provide no context - Claude cannot identify which hook succeeded
  3. Ignore useful data - Hooks output descriptive systemMessage fields that are shown to users but not to Claude

Tested behavior:

claude --print "Count how many times you see 'SessionStart:startup hook success: Success'"
# Result: 14

claude --print "Can you tell which hook each Success message came from?"
# Result: "No. Each message is identical. There's no hook name, file path, or unique identifier."

Meanwhile, users see useful colored output in their terminal:

SessionStart:startup says: 📋 🟢 plan-template: injected
SessionStart:startup says: 🕐 🟢 date_awareness: January 05, 2026
SessionStart:startup says: 📚 🟢 inject_docs: 19 docs

This is because hooks output:

{
  "hookSpecificOutput": {
    "hookEventName": "SessionStart",
    "additionalContext": "<useful content>"
  },
  "systemMessage": "📋 🟢 plan-template: injected"
}

The systemMessage is displayed to users but Claude Code injects a generic "Success" instead.

Proposed Solution

Option A (Preferred): Use the hook's systemMessage in the system-reminder:

<system-reminder>
SessionStart:startup says: 📋 🟢 plan-template: injected
</system-reminder>

Option B: Include the hook name/path in the generic message:

<system-reminder>
SessionStart:plan_template_injector.py hook success: Success
</system-reminder>

Option C: Don't inject system-reminders for successful SessionStart hooks at all. The additionalContext already carries the payload - the "Success" message adds no value.

Alternative Solutions

Current workaround: None. Hooks cannot control what system-reminder is injected - only additionalContext and systemMessage (UI-only).

What I've tried: Outputting descriptive systemMessage values from hooks. These appear in the terminal but Claude never sees them.

Priority

Critical - Blocking my work

Feature Category

CLI commands and flags

Use Case Example

  1. User configures 15 SessionStart hooks for various enhancements
  2. User asks Claude "which hooks ran at session start?"
  3. Claude sees 15 identical "Success" messages with no identifying information
  4. Claude cannot answer the question despite hooks outputting descriptive messages
  5. User is confused why Claude can't see what they see in the terminal

With this fix:

  • Claude would see 📋 🟢 plan-template: injected (same as user)
  • Claude could accurately report which hooks ran and their status
  • No wasted tokens on content-free messages

Additional Context

Test reproduction:

# From any directory with SessionStart hooks configured
claude --print "Count exact matches of 'SessionStart:startup hook success: Success' in your context"
# Returns: N (number of configured hooks)

claude --print "Can you identify which hook each Success message came from?"
# Returns: No - messages are identical

Related: This is similar to how PostToolUse and UserPromptSubmit hooks handle their system-reminders - they include the hook-specific context rather than generic success messages.

Schema reference: Hooks output systemMessage per the hooks documentation, but this field is only used for terminal display, not for Claude's context injection.

View original on GitHub ↗

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