SessionStart hook output is not actionable — model cannot respond before first user message
Summary
There is no way to get Claude to reliably perform an action at session startup (e.g., display a task list). Despite multiple reinforcing mechanisms, the model consistently ignores startup instructions in favor of responding to the user's first message.
What I've tried (all simultaneously)
- CLAUDE.md instructions — "Always check and display the task list at the start of a conversation"
- Feedback memory — Saved memory explicitly telling the model to show tasks first
- SessionStart hook — Outputs a system-reminder: "IMPORTANT: You MUST display the task list (TaskList) as the very first thing before responding to the user"
All three are present in context. The hook fires correctly (verified in session logs). The model still skips straight to responding to the user's message.
Root cause (suspected)
The SessionStart hook output becomes a system-reminder in the model's context, but the model doesn't get a "turn" to act on it until the user sends their first message. At that point, the user's message takes priority and the system-reminder is treated as low-priority background context.
What would fix this
One or more of:
- Give the model a turn after SessionStart hooks fire, before the first user message — let it respond to hook output independently
- A native "startup prompt" feature — a configurable prompt that the model responds to at session start before user input
- Hook output that displays directly to the user's terminal — bypassing the model entirely (e.g., stderr from a hook could print to screen)
Environment
- Claude Code v2.1.76
- macOS (Darwin 23.6.0)
- Multiple sessions over several hours attempting to solve this
This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗