Sticky prompt header no longer appears when scrolling (regression between 2.1.241 and 2.1.247)

Status Open
Reported on v2.1.241
Maintainer reply None cached
Activity 0 comments · opened Aug 30, 2026

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

  1. macOS, Apple Terminal.app
  2. claude with "tui": "fullscreen"
  3. Send several messages so the transcript overflows the viewport
  4. 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, light and dark-ansi themes

Ruled out

  • Theme, both built-in and custom
  • Terminal window geometry (reproduced at 120 and 213 columns)
  • The tui setting (/tui reports fullscreen)
  • 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.2422.1.251 mentions this feature.

View original on GitHub ↗