Sticky prompt header no longer appears when scrolling (regression between 2.1.241 and 2.1.247)
Summary
The sticky prompt header — the one-row bar that pins your previous message to the top of the viewport while you scroll back through a conversation — no longer appears. Bisected to a change between 2.1.241 and 2.1.247.
Expected
Scrolling back through the transcript pins the nearest preceding user prompt to the top row. Scrolling further past it swaps in the prompt before that, so the message you are currently reading under is always visible.
Actual
No bar appears, at any scroll position, in any conversation length.
Reproduction
- macOS, Apple Terminal.app
claudewith"tui": "fullscreen"- Send several messages so the transcript overflows the viewport
- Scroll back with Page Up / arrow keys
Confirmed working on 2.1.241 and not working on 2.1.251 on the same machine, same terminal, same settings, tested back to back:
# bar appears
CLAUDE_CONFIG_DIR=/tmp/cc241 DISABLE_AUTOUPDATER=1 ./claude-2.1.241
# bar never appears
claude
Environment
- macOS 26.5.2, arm64
- Apple Terminal.app 2.15
tui: "fullscreen"- Reproduced under built-in
dark,lightanddark-ansithemes
Ruled out
- Theme, both built-in and custom
- Terminal window geometry (reproduced at 120 and 213 columns)
- The
tuisetting (/tuireportsfullscreen) - Scroll method — wheel and keyboard (
up/down/pageup/pagedown) - Session type — plain interactive, and a forked copy of a background session
CLAUDE_CODE_DISABLE_VIRTUAL_SCROLL,CLAUDE_CODE_DISABLE_MOUSE,CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN,CLAUDE_CODE_NO_FLICKER— none set- Not tmux, not a screen-reader session, no persisted fullscreen auto-disable state
Possible cause
Between the two versions the virtual message list changed where it reads scroll state from:
// 2.1.241
function ({ messages, scrollRef, columns, …, trackStickyPrompt }) {
const sticky = scrollRef.current?.isSticky() ?? true
}
// 2.1.247 and later
function ({ messages, scrollViewport, columns, …, trackStickyPrompt }) {
const sticky = scrollViewport.handle?.isSticky() ?? true
}
2.1.241 contains no scrollViewport symbol at all. 2.1.247, 2.1.248 and 2.1.251 all do. The gate expression itself (trackStickyPrompt: !isTranscript && isFullscreen()) is unchanged across all four.
The producer only searches backwards for a prompt to pin when that flag is false. Since the default is ?? true, any render path where scrollViewport.handle is absent disables the feature silently, with no error and no fallback — which would match the observed symptom.
Nothing in the changelog for 2.1.242–2.1.251 mentions this feature.