Skip to content

[Bug]: iOS: scrolling up in a long thread teleports the viewport and draws rows outside the list bounds #12072

Description

@Pivii
t3code-ios-scroll-jump.mp4

Before submitting

  • I searched existing issues and did not find a duplicate.
  • I included enough detail to reproduce or investigate the problem.

Area

apps/mobile

Steps to reproduce

This one is intermittent and I cannot trigger it on demand. It hits me several times a week. The screen recording below captures a full episode; here is the shape of it:

  1. Open a long thread that contains at least one very tall tool-output row (mine has a skill listing of roughly 100 rows).
  2. Let the agent finish a reply while the viewport is parked somewhere above the bottom.
  3. Tap the scroll-to-bottom button. This works — the feed lands at the end.
  4. Drag up a short distance to re-read the reply.

Expected behavior

A short upward drag moves the viewport by the dragged distance, and rows stay inside the list bounds.

Actual behavior

Three distinct symptoms, all visible in the recording:

  1. The viewport teleports. A short upward drag jumps to the start or the middle of the thread instead of moving by the dragged distance. It flips between the conversation region and the large tool-output table many screens away.
  2. Rows render outside the list bounds. Conversation text is drawn over the navigation header and below the composer, so the list stops clipping its rows.
  3. The scroll-to-bottom chevron floats mid-screen instead of sitting above the composer, which suggests the computed layout is wrong rather than just the scroll offset.

Hypothesis, from reading the source: apps/mobile/src/features/threads/ThreadFeed.tsx already documents this failure mode above getFixedItemSize:

every row above the viewport is assumed to be estimatedItemSize tall, and scrolling up through unmeasured content corrects each row's height as it mounts — the feed visibly jumps

The mitigation from #4874 only assigns fixed heights to the small chrome rows. Message rows return undefined and fall back to LegendList's per-type running average against estimatedItemSize={180}. A single tool-output row an order of magnitude taller than that average would produce a large offset correction the moment it mounts while scrolling up, which matches symptom 1. Symptom 2 looks adjacent to #11813.

Question: #11813 landed after the 1.1.0 App Store build I am on. Does the 1.2.0 train already change this behavior? I am happy to re-test and close this if so — I just have no way to run that build yet.

Impact

Major degradation or frequent failure

Version or commit

App Store 1.1.0

Environment

iPhone 15 Pro Max, iOS 27

Logs or stack traces

Screenshots, recordings, or supporting files

Screen recording attached in a follow-up comment.

Workaround

Tapping the scroll-to-bottom button re-anchors the feed, but the next upward drag can teleport again.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    acceptedfeature request acceptedbugSomething is broken or behaving incorrectly.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions