[FEATURE] SessionStart hook success system-reminders should include hook name or use systemMessage
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:
- Waste tokens (~10 tokens × N hooks per session)
- Provide no context - Claude cannot identify which hook succeeded
- Ignore useful data - Hooks output descriptive
systemMessagefields 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
- User configures 15 SessionStart hooks for various enhancements
- User asks Claude "which hooks ran at session start?"
- Claude sees 15 identical "Success" messages with no identifying information
- Claude cannot answer the question despite hooks outputting descriptive messages
- 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.
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗