Repository navigation
fix(web): threads open at the newest message, not thousands of pixels above it - #19663
Conversation
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This is a focused web bug fix that preserves measured initial scroll positioning without changing saved-position behavior, with targeted browser regression coverage. Its runtime impact is localized to thread opening and reuse, with no sensitive, schema, deployment, or static-analysis changes. You can add or adjust custom eligibility rules. Learn more. |
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
When the timeline list mounted fresh for a thread, the restore effect's scrollToEnd replaced LegendList's initialScrollAtEnd, which keeps retargeting the end while rows measure. The thread stopped at the estimated end, often thousands of pixels above the newest message. Skip that call when the list mounted for this thread. A list reused across a thread switch still scrolls to the end. Takes over #18074. Co-authored-by: Aaron Queen <bompus@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
34709d2 to
bc7efe2
Compare
Dismissing prior approval to re-evaluate bc7efe2
Upstream pingdotgg#20402 made MessagesTimeline compile by keeping the list identity in state and building rows with useIncrementalTimelineRows. The fork kept its older version of those parts (it had adopted the open upstream pingdotgg#19663, which changes the same code), so the compiler skipped the whole file: refs read during render in five places and one memo it could not keep. Ported from nightly 3315: the list identity lives in state, the latest-run effect remembers which list its previous run belonged to, rows come from useIncrementalTimelineRows, handoff runs and stable rows are held in state, and the video attachment asset follows only the fields it reads. The fork's own fields (unreachableRevertTurnCounts, remembered disclosures) stay. Fork rank 0bq. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Taking over this one. I will preserve saved reading positions, verify the cold-entry fix against current main, and push the focused update here. |
Dismissing prior approval to re-evaluate 714165e
… above it (pingdotgg#19663) Co-authored-by: Aaron Queen <bompus@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Julius Marminge <julius0216@outlook.com> (cherry picked from commit a0fd206)
## What's Changed * fix(mobile): settings no longer tell you to update when you're up to date by @shivamhwp in pingdotgg/t3code#21688 * test(web): fix the workflow script test that times out on busy CI runners by @shivamhwp in pingdotgg/t3code#21699 * fix(mobile): a file shared into a new task shows in the composer before you send by @shivamhwp in pingdotgg/t3code#21659 * fix(desktop): a cold WSL distro gets 30 seconds to boot instead of 10 by @SunkenInTime in pingdotgg/t3code#21070 * fix(web): detect software keyboard before handling composer Enter by @Yash-Singh1 in pingdotgg/t3code#21763 * fix(mobile): the Git sheet uses the standard list rows by @juliusmarminge in pingdotgg/t3code#21785 * fix(server): changed files keep their real paths for renames and non-ASCII names by @Atharvsinh-codez in pingdotgg/t3code#20175 * fix(server): a message promoted into a stopping run stays queued by @lbgos in pingdotgg/t3code#16926 * perf(mobile): streaming re-renders less on the open thread screen by @juliusmarminge in pingdotgg/t3code#20963 * feat(usage): show even-pace marks on Limits bars by @flamboh in pingdotgg/t3code#14477 * fix(web): Usage hourly labels follow the Time format setting by @mInrOz in pingdotgg/t3code#15575 * fix(web): stop repeating the subagent name in the waiting banner by @saphid in pingdotgg/t3code#16022 * fix(web): Cmd+O no longer opens the editor more than once by @5knnbdwm in pingdotgg/t3code#18983 * fix(web): hoist favorited legacy models to the top of the model picker by @TonybynMp4 in pingdotgg/t3code#11933 * fix(server): a rollback blocked by Git's index lock says so instead of a generic error by @shivamhwp in pingdotgg/t3code#11340 * fix(mobile): expanded tool-call groups keep following new calls by @nekohasekai in pingdotgg/t3code#15747 * fix(web): going back in the command palette keeps the search that led there by @saphid in pingdotgg/t3code#15940 * fix(web): changing a project's model no longer keeps the old model's options by @yaacovcorcos in pingdotgg/t3code#16581 * fix(web): preserve snapshot thumbnail context and detail by @maria-rcks in pingdotgg/t3code#18440 * fix(web): keep expanded tool actions usable from the keyboard by @saphid in pingdotgg/t3code#18831 * fix(usage): Claude usage no longer lists a `<synthetic>` model by @tris203 in pingdotgg/t3code#14672 * fix(server): release webhook claims when acceptance fails by @saphid in pingdotgg/t3code#18820 * fix(desktop): make the annotation editor border and shadow actually render by @PollyGlot in pingdotgg/t3code#9406 * fix(server): Claude follow-ups no longer fail in Auto on models without Auto by @Gigioxx in pingdotgg/t3code#15687 * fix(web): reopening Connections picks up new network addresses by @lnieuwenhuis in pingdotgg/t3code#15840 * fix(client): MCP apps can no longer trap you in full screen; it opens only after a tap by @shivamhwp in pingdotgg/t3code#18548 * fix(web,mobile): disabled provider instances no longer badge their siblings by @tris203 in pingdotgg/t3code#14545 * fix(web): threads open at the newest message, not thousands of pixels above it by @t3dotgg in pingdotgg/t3code#19663 * fix(mobile): report rejected shared settings writes by @juliusmarminge in pingdotgg/t3code#9356 * fix(claude): show automatic compaction while it runs by @maria-rcks in pingdotgg/t3code#15631 * fix(web): keep the parent thread highlighted while viewing its subagent by @saphid in pingdotgg/t3code#15163 * fix(web): show pull request checkout error detail by @saphid in pingdotgg/t3code#15007 * fix(server): mark unvisited thread completions unread by @maria-rcks in pingdotgg/t3code#15607 * fix(web): started threads no longer offer a machine picker that does nothing by @tris203 in pingdotgg/t3code#19900 * fix(web): provider model names no longer get cut off by their slug by @ilyaliao in pingdotgg/t3code#16522 * fix(claude): mid-sentence skill chips keep the full request by @ScottN-PV in pingdotgg/t3code#15253 * fix(web): preserve unsaved keybinding edits when saving another binding by @pnupu in pingdotgg/t3code#11109 * fix(connections): retry unsupported saved direct connections by @none23 in pingdotgg/t3code#15107 * fix(web): show readable messages for structured thread errors by @juliusmarminge in pingdotgg/t3code#21483 * fix(web): custom shortcuts work when Local environment is off by @Mnigos in pingdotgg/t3code#15825 * fix(web): keep thread notification tags within the Windows toast limit by @satyalyadav in pingdotgg/t3code#12289 * fix(web): pinned thread marker stays put when hovering the row by @flamboh in pingdotgg/t3code#11122 * fix(web): keep a typed question answer when you open a new thread by @Gigioxx in pingdotgg/t3code#13865 * fix(web): renumber following items when continuing a plain-Markdown numbered list by @saphid in pingdotgg/t3code#14332 * fix(web): clicking a logged request route no longer opens it in the editor by @lnieuwenhuis in pingdotgg/t3code#15838 * fix(desktop): reject offscreen annotation screenshot crops by @maria-rcks in pingdotgg/t3code#18441 * fix(web): NVDA browse mode reaches the new-thread project picker again by @akj in pingdotgg/t3code#17877 * fix(web): stop composer banner glass overlap by @t3-code[bot] in pingdotgg/t3code#8034 * fix(web): keep pasted decorators as text by @Gigioxx in pingdotgg/t3code#8415 * fix(shell): avoid interactive job control in environment probes by @LouisDeconinck in pingdotgg/t3code#11275 * fix(web): a closed proactive diff stays closed when you return to a thread by @ilyaliao in pingdotgg/t3code#14705 * fix(web): render powerline separators at cell edges by @SadriG91 in pingdotgg/t3code#5607 * fix(server): provider failures say why a turn could not start by @saphid in pingdotgg/t3code#16303 ## New Contributors * @Atharvsinh-codez made their first contribution in pingdotgg/t3code#20175 * @lbgos made their first contribution in pingdotgg/t3code#16926 * @yaacovcorcos made their first contribution in pingdotgg/t3code#16581 * @pnupu made their first contribution in pingdotgg/t3code#11109 * @LouisDeconinck made their first contribution in pingdotgg/t3code#11275 * @SadriG91 made their first contribution in pingdotgg/t3code#5607 **Full Changelog**: pingdotgg/t3code@v0.1.1-nightly.20261019.3360...v0.1.1-nightly.20261019.3373 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.1-nightly.20261019.3373
## What's Changed * fix(mobile): settings no longer tell you to update when you're up to date by @shivamhwp in pingdotgg/t3code#21688 * test(web): fix the workflow script test that times out on busy CI runners by @shivamhwp in pingdotgg/t3code#21699 * fix(mobile): a file shared into a new task shows in the composer before you send by @shivamhwp in pingdotgg/t3code#21659 * fix(desktop): a cold WSL distro gets 30 seconds to boot instead of 10 by @SunkenInTime in pingdotgg/t3code#21070 * fix(web): detect software keyboard before handling composer Enter by @Yash-Singh1 in pingdotgg/t3code#21763 * fix(mobile): the Git sheet uses the standard list rows by @juliusmarminge in pingdotgg/t3code#21785 * fix(server): changed files keep their real paths for renames and non-ASCII names by @Atharvsinh-codez in pingdotgg/t3code#20175 * fix(server): a message promoted into a stopping run stays queued by @lbgos in pingdotgg/t3code#16926 * perf(mobile): streaming re-renders less on the open thread screen by @juliusmarminge in pingdotgg/t3code#20963 * feat(usage): show even-pace marks on Limits bars by @flamboh in pingdotgg/t3code#14477 * fix(web): Usage hourly labels follow the Time format setting by @mInrOz in pingdotgg/t3code#15575 * fix(web): stop repeating the subagent name in the waiting banner by @saphid in pingdotgg/t3code#16022 * fix(web): Cmd+O no longer opens the editor more than once by @5knnbdwm in pingdotgg/t3code#18983 * fix(web): hoist favorited legacy models to the top of the model picker by @TonybynMp4 in pingdotgg/t3code#11933 * fix(server): a rollback blocked by Git's index lock says so instead of a generic error by @shivamhwp in pingdotgg/t3code#11340 * fix(mobile): expanded tool-call groups keep following new calls by @nekohasekai in pingdotgg/t3code#15747 * fix(web): going back in the command palette keeps the search that led there by @saphid in pingdotgg/t3code#15940 * fix(web): changing a project's model no longer keeps the old model's options by @yaacovcorcos in pingdotgg/t3code#16581 * fix(web): preserve snapshot thumbnail context and detail by @maria-rcks in pingdotgg/t3code#18440 * fix(web): keep expanded tool actions usable from the keyboard by @saphid in pingdotgg/t3code#18831 * fix(usage): Claude usage no longer lists a `<synthetic>` model by @tris203 in pingdotgg/t3code#14672 * fix(server): release webhook claims when acceptance fails by @saphid in pingdotgg/t3code#18820 * fix(desktop): make the annotation editor border and shadow actually render by @PollyGlot in pingdotgg/t3code#9406 * fix(server): Claude follow-ups no longer fail in Auto on models without Auto by @Gigioxx in pingdotgg/t3code#15687 * fix(web): reopening Connections picks up new network addresses by @lnieuwenhuis in pingdotgg/t3code#15840 * fix(client): MCP apps can no longer trap you in full screen; it opens only after a tap by @shivamhwp in pingdotgg/t3code#18548 * fix(web,mobile): disabled provider instances no longer badge their siblings by @tris203 in pingdotgg/t3code#14545 * fix(web): threads open at the newest message, not thousands of pixels above it by @t3dotgg in pingdotgg/t3code#19663 * fix(mobile): report rejected shared settings writes by @juliusmarminge in pingdotgg/t3code#9356 * fix(claude): show automatic compaction while it runs by @maria-rcks in pingdotgg/t3code#15631 * fix(web): keep the parent thread highlighted while viewing its subagent by @saphid in pingdotgg/t3code#15163 * fix(web): show pull request checkout error detail by @saphid in pingdotgg/t3code#15007 * fix(server): mark unvisited thread completions unread by @maria-rcks in pingdotgg/t3code#15607 * fix(web): started threads no longer offer a machine picker that does nothing by @tris203 in pingdotgg/t3code#19900 * fix(web): provider model names no longer get cut off by their slug by @ilyaliao in pingdotgg/t3code#16522 * fix(claude): mid-sentence skill chips keep the full request by @ScottN-PV in pingdotgg/t3code#15253 * fix(web): preserve unsaved keybinding edits when saving another binding by @pnupu in pingdotgg/t3code#11109 * fix(connections): retry unsupported saved direct connections by @none23 in pingdotgg/t3code#15107 * fix(web): show readable messages for structured thread errors by @juliusmarminge in pingdotgg/t3code#21483 * fix(web): custom shortcuts work when Local environment is off by @Mnigos in pingdotgg/t3code#15825 * fix(web): keep thread notification tags within the Windows toast limit by @satyalyadav in pingdotgg/t3code#12289 * fix(web): pinned thread marker stays put when hovering the row by @flamboh in pingdotgg/t3code#11122 * fix(web): keep a typed question answer when you open a new thread by @Gigioxx in pingdotgg/t3code#13865 * fix(web): renumber following items when continuing a plain-Markdown numbered list by @saphid in pingdotgg/t3code#14332 * fix(web): clicking a logged request route no longer opens it in the editor by @lnieuwenhuis in pingdotgg/t3code#15838 * fix(desktop): reject offscreen annotation screenshot crops by @maria-rcks in pingdotgg/t3code#18441 * fix(web): NVDA browse mode reaches the new-thread project picker again by @akj in pingdotgg/t3code#17877 * fix(web): stop composer banner glass overlap by @t3-code[bot] in pingdotgg/t3code#8034 * fix(web): keep pasted decorators as text by @Gigioxx in pingdotgg/t3code#8415 * fix(shell): avoid interactive job control in environment probes by @LouisDeconinck in pingdotgg/t3code#11275 * fix(web): a closed proactive diff stays closed when you return to a thread by @ilyaliao in pingdotgg/t3code#14705 * fix(web): render powerline separators at cell edges by @SadriG91 in pingdotgg/t3code#5607 * fix(server): provider failures say why a turn could not start by @saphid in pingdotgg/t3code#16303 ## New Contributors * @Atharvsinh-codez made their first contribution in pingdotgg/t3code#20175 * @lbgos made their first contribution in pingdotgg/t3code#16926 * @yaacovcorcos made their first contribution in pingdotgg/t3code#16581 * @pnupu made their first contribution in pingdotgg/t3code#11109 * @LouisDeconinck made their first contribution in pingdotgg/t3code#11275 * @SadriG91 made their first contribution in pingdotgg/t3code#5607 **Full Changelog**: pingdotgg/t3code@v0.1.1-nightly.20261019.3360...v0.1.1-nightly.20261019.3373 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.1-nightly.20261019.3373
A long thread opened from an empty or loading pane could stop well above its newest message. Our restoration scroll replaced LegendList’s measured initial end target with an estimated one.
The timeline now records the thread on which a list instance first mounted and leaves that initial end target intact. Saved reading positions and switches that reuse an existing list retain their restoration behavior.
Original fix by @t3dotgg in #19663, building on @bompus’s investigation. Contributor commits and credit are preserved.
Verification:
MessagesTimeline.browser.test.tsx; the existing reading-position test also covers reopening and thread switches. Removing the fix makes cold entry stop 20,912px above the end. Final focused suites: 72 browser and 205 unit tests passed (277 total).Before (main):
After:
Cold-entry recording: Before · After
The settled/snoozed empty-footer variant was not verified live.
Not verified: macOS, Windows, iOS, Android or Electron desktop. Native mobile has a separate timeline and is outside this fix. Safari/WebKit and Electron remain human checks.
Tests: GPT-6 Astra; implementation: GPT-6.1 Sol; adversarial reviews: Claude Opus 5.5 and GPT-6 Sol. Codex and Claude Code harnesses, delegated through T3 Code.