[BUG] VS Code extension renders no SessionStart hook output — systemMessage, statusMessage, and additionalContext never reach the user (refile of stale-closed #47692)
Summary
A SessionStart hook has no deterministic, user-visible output channel in the VS Code extension. None of the documented hook output fields put text in front of the user:
systemMessage— not rendered anywhere.statusMessage— ignored; the default spinner shows instead.hookSpecificOutput.additionalContext— reaches the model's context, but is only shown to the user if the model chooses to echo it. There is no direct rendering.
So a hook that needs to show the user a deterministic notice at session start — a bootstrap/status banner, an environment warning, an onboarding message — either can't, or has to rely on the model voluntarily repeating the hook's output, which is not guaranteed.
Refile context
This is a refile per the staleness bot's own invitation. The canonical issue #47692 was auto-closed as stale on 2026-06-28 with no maintainer engagement at any point, and its duplicate #62557 (VS Code not rendering permissionDecisionReason — same root cause: the extension not rendering hook text fields) was auto-closed into #47692 shortly before. Re-confirming the behavior at the current version.
Environment
- Claude Code v2.1.197, VS Code extension, macOS. (
statusMessagewas also reported broken in the CLI on Windows in #47692.)
Reproduction
- Add a
SessionStarthook that returns each of the following (separately):
{"systemMessage": "TEST: is this visible?"}{"statusMessage": "TEST status"}{"hookSpecificOutput": {"hookEventName": "SessionStart", "additionalContext": "TEST context"}}
- Start / resume a session.
- Observe what the user sees.
Actual behavior
systemMessage→ nothing rendered.statusMessage→ default spinner; the message is not shown.additionalContext→ enters model context only; the user sees it only if the model happens to reproduce it in its reply.
Expected behavior
At least one deterministic, user-visible channel for SessionStart hook output — e.g. a rendered systemMessage/notice block — so per-session banners, reports, and warnings display reliably without depending on the model choosing to echo them. Ideally this applies to hook output generally (the permissionDecisionReason non-rendering in #62557 is the same underlying gap).
Impact
Any hook-driven session-start UX (status/bootstrap banners, environment or safety warnings, onboarding notices) is either invisible or model-dependent. The only workaround is a brittle instruction telling the model to echo the hook's additionalContext verbatim — which the model can silently omit, so the "display" is unreliable by construction.
Related
- #47692 (canonical, auto-closed
stale) - #62557 (auto-closed as duplicate of #47692 —
permissionDecisionReasonnot rendered; same root cause)