fix(mobile): separate expanded thoughts from the next reply#25300
Expanded groups containing only thoughts skipped the work-log wrapper, so a thought clipped at the height limit touched the next reply. They also lacked the overflow fade used by tool groups.
Wrap the thought group in WorkLogBlock, preserving its continuation spacing rule, and reuse the bottom edge fade while more text remains below. The fade follows scroll position on the UI thread without React updates per scroll.
Closes #25283. This is a focused fix for an existing mobile layout defect.
Verification
- Baseline
c3888da8b4fa39b5edd3d0aa69479068647413cf; fixed690886151cdbe1dd62efa7740e6f430487a1199d. Built the JavaScript bundle with Metro on physical corex and ran it on POCO M3 Pro 5G, Android 13, using isolated projection fixtures with synthetic text. - Opened the thread, expanded Worked and Thought (×3). Before, the clipped line runs into the reply. After, the group keeps its bottom gap and fades hidden text. Scrolled through all three thoughts to the last paragraph; the fade clears and the reply remains reachable. A finger swipe scrolls the nested thoughts while keeping the reply in place. Checked light and dark mode. Three short thoughts remain fully visible without a fade.
vp run check:changedpassed format, lint, both unused-code checks, and affected-package typechecks. Independent Codex review found no required changes. No unit tests added for this visual change.- Only the mobile work-log renderer changes. Web, desktop, providers, contracts, and connection behavior require no changes.
| Before | After |
|---|---|
The recording shows expansion and scrolling to the end, at 2x speed.
https://github.com/user-attachments/assets/e5680374-8826-44e6-a938-dcddd35988f8
End of scroll, dark mode, and short thoughts
Device recordings at 690886151c
Main means the PR's base, c3888da8b4. Same synthetic thread: three long thoughts in a row, then the reply. Each recording expands Worked, then Thought (×3), then scrolls the thoughts.
iOS, iPhone 17 simulator (iOS 27.0)
Main:
https://github.com/user-attachments/assets/b2b12b2a-597e-427c-98ff-5be888d7c970
This PR:
https://github.com/user-attachments/assets/291afb6d-a8fa-4ff3-9722-6465891b98ae
On main the last visible thought line sits right on top of "Done.". On this branch the clipped line fades and the group keeps its gap; scrolled to the end, the fade clears and the reply stays reachable.
Android, POCO F4 (Android 14)
Main:
https://github.com/user-attachments/assets/757e5d34-44c9-458b-a752-07ae3f28ab21
This PR:
https://github.com/user-attachments/assets/84583eec-9f7b-40be-84a2-da7ec1d5625e
Same result: main's clipped line runs into "Done.", this branch fades it and keeps the gap.
Testing
- Head
690886151cdbe1dd62efa7740e6f430487a1199d, basec3888da8b4fa39b5edd3d0aa69479068647413cf. "Main" swaps onlyapps/mobile/src/features/threads/thread-work-log.tsxback to the base version. - Machine: corex (
corex-t3). Isolated server (node apps/server/src/bin.ts serve --base-dir <fixture>) and Metro (vp exec expo start --dev-client --localhost) from a worktree at the head; fixture data is synthetic. - iOS: T3 Code Dev 2.1.0 on shiv's iPhone 17 simulator, reaching corex over
ssh -R; recorded withxcrun simctl io recordVideo. - Android: existing T3 Code Dev 2.0.0 on the POCO F4 over
adb reverse; recorded with the agentos recorder. That binary shows a Clerk compatibility warning; it doesn't touch this screen. - Before each recording I checked the bundle Metro served for
ThreadReasoningGroup(absent on main, present on head).
Implemented by Claude Opus 5.5 through Claude Code. Investigated, tested, and reviewed by gpt-6.1-sol through Codex.
Checks
Added 1 commit
- fix(mobile): expanded thoughts keep their bottom gap and fade when clipped6908861
Approvability
Verdict: Approved at 6908861
Macroscope's review found this PR approvable — This focused mobile UI fix separates expanded reasoning content from the following reply by restoring the existing work-log spacing wrapper and adding an overflow fade. It is confined to one renderer file and does not alter data, APIs, product defaults, or static-analysis configuration.
You can add or adjust custom eligibility rules. Learn more.
No actionable comments were generated in the recent review.
External image Recent review info
External image Run configuration
- Source mode: Auto
- Repository: pingdotgg/t3code
- Branch: issue-watch/25283
- File: .coderabbit.config.ts
- Commit: 6908861
- Layers: Repository TS config
- Review profile: CHILL
- Plan: Advanced
- Run ID:
2d532093-93b7-48f0-b039-6acbb5a1040d
External image Commits
Reviewing files that changed from the base of the PR and between 04a21bb1c1cec0e60aa831bef11e67feae95885e and 690886151cdbe1dd62efa7740e6f430487a1199d.
External image Files selected for processing: 1
apps/mobile/src/features/threads/thread-work-log.tsx
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 8 remain after this review.
Walkthrough
The mobile work log now renders reasoning-only groups through
ThreadReasoningGroup. The component tracks nested scroll position and dimensions, then adjusts an upward edge fade based on the remaining content.Changes: Reasoning group scrolling
Layer / File(s) Summary Render and track reasoning group scrolling
apps/mobile/src/features/threads/thread-work-log.tsxReasoning-only grouped activities now render through ThreadReasoningGroupinstead of inline content in aScrollView. The component tracks scroll offset, content height, and viewport height to adjust the edge fade.Priority: External image Low
Estimated code review effort: 2 (Simple) | ~10 minutes
Change: Bug fix · Severity of issue fixed: Low
Suggested labels:
size:MSuggested reviewers:
juliusmarminge
Merge Risk: External image Minimal · up to 69088
No actionable issue remains for this mobile visual change after normal checks. iOS appearance has not been verified, but that alone does not establish a merge-blocking risk.
Pre-merge checks: Passed 4
Check name Status Explanation Title check Passed The title "fix(mobile): separate expanded thoughts from the next reply" follows conventional commit style and names the primary change. The diff wraps expanded thought-only work-log groups in WorkLogB… Linked Issues check Passed Issue #25283requires a bottom gap for an expanded reasoning-only group and a clear indication when clipped content continues. The PR wraps the reasoning-only group inWorkLogBlock, passes `continue…Out of Scope Changes check Passed The change is limited to apps/mobile/src/features/threads/thread-work-log.tsx. It changes the reasoning-only mobile work-log renderer and adds the supporting scroll-state and fade behavior required …Description check Passed The description follows the repository template closely. It has the Problem, Change, Scope and approval, and Verification areas. The Problem and Change sections are clear. The Problem section names th… Full details: Title check
Explanation
The title "fix(mobile): separate expanded thoughts from the next reply" follows conventional commit style and names the primary change. The diff wraps expanded thought-only work-log groups in WorkLogBlock and adds a bottom edge fade, which keeps a clipped thought from touching the following reply. The title is specific to the changeset and is not misleading.
Full details: Linked Issues check
Explanation
Issue
#25283requires a bottom gap for an expanded reasoning-only group and a clear indication when clipped content continues. The PR wraps the reasoning-only group inWorkLogBlock, passescontinuesWorkLog, and preserves the continuation spacing rule.ThreadReasoningGroupuses a cappedAnimated.ScrollViewand anEdgeFadeoverlay. The fade opacity uses content height, viewport height, and scroll offset in Reanimated shared values, so it clears at the end without React updates per scroll. The PR also reports affected-package checks and Android verification for the mobile layout.
Full details: Out of Scope Changes check
Explanation
The change is limited to
apps/mobile/src/features/threads/thread-work-log.tsx. It changes the reasoning-only mobile work-log renderer and adds the supporting scroll-state and fade behavior required by issue#25283. No unrelated web, desktop, provider, contract, or connection changes are present in the reviewed diff.
Full details: Description check
Explanation
The description follows the repository template closely. It has the Problem, Change, Scope and approval, and Verification areas. The Problem and Change sections are clear. The Problem section names the defect (expanded thought-only groups skip the work-log wrapper, so clipped thoughts touch the next reply) and the missing overflow fade. The Change section states the fix (wrap in WorkLogBlock, reuse the bottom edge fade, UI-thread scroll tracking). The Verification section is detailed. It lists the baseline and head commits, the devices, the test steps, the observed results, and the check command results. It includes before and after media. The Scope and approval section is weak. It says the change is a focused fix for an existing mobile layout defect and cites issue
#25283, which is the closing reference. It does not explain why the fix qualifies without prior approval, but the linked issue covers the triaged bug. The description also includes a few items that are not in the template, such as the agent attribution. Those items do not hurt the check.
Finishing Touches
📝 Generate docstrings
- Commit to this branch
- Create a new PR
🧪 Generate unit tests (beta)
- Commit to this branch
- Create a new PR
- Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Comment @coderabbitai help to get the list of available commands.
Note
Written by gpt-6.1-sol on behalf of Maria
Verified in a real dev environment
No changed behavior could be exercised on this Linux Boat VM. This is an unverifiable result, not a runtime pass.
Inspected the description, diff, discussion, reviews, commit authors, and exact head 690886151cdbe1dd62efa7740e6f430487a1199d. The PR is open and contains no commits by juliusmarminge or t3dotgg. GitCafe also identifies this as #25300. Its stored checks report 28 successful, zero failing, zero pending; those checks do not establish runtime correctness.
The only changed file is apps/mobile/src/features/threads/thread-work-log.tsx. The native-only change wraps expanded reasoning groups in WorkLogBlock and adds a scroll-driven bottom fade. The web client does not render this component.
Device discovery returned:
| 1 | device_list: Agent device access is turned off for this environment. |
| 2 | adb devices -l: List of devices attached (no devices) |
Not verified
The native Android/iOS flow is blocked by unavailable device access. The mobile verification skill explicitly requires stopping verification in this case. No main reproduction, PR runtime pass, real Codex turn, screenshots, or recording was produced. No dev server was started and no source changes were made. The existing fixture-based evidence in the PR description was not reproduced or treated as proof for this run.
Still required on a native client: create a real project and thread, run Codex gpt-6.1-sol, expand Worked and a long reasoning-only group, compare main versus this head, scroll to the end and confirm the fade clears while the following reply remains separated and reachable. Also check short reasoning groups (no fade), mixed/tool groups, continuation spacing, and light/dark themes.
Note
Written by gpt-6.1-sol on behalf of Maria
Verified on Android emulator (API 35) against a real dev server
verified head 690886151cdbe1dd62efa7740e6f430487a1199d on the t3 x86_64 emulator, android api 35. installed the matching development client from the shared cache, ran vp run dev with isolated .t3 state on port 13773 and metro on 8081, and paired the native app using adb reverse.
created android-thought-verification through the mobile app. sent two real codex gpt-6.1-sol turns through the local proxy, with max reasoning. the first produced eight consecutive thought summaries and a final reply. no mocks, replay provider, synthetic projection rows, or demo data were used.
expanded Worked and Thought (×8). at normal android font scale, the complete group fits without a fade. at font scale 2.0, the same persisted thoughts overflow the 384-point cap. compared the pr's base renderer (c3888da8b4fa39b5edd3d0aa69479068647413cf) with the head renderer in the same running app. confirmed the served metro modules for both versions. the base clips abruptly without the overflow cue; the head adds the bottom fade and reply spacing. swiping inside the group scrolls its thoughts while the following reply stays in place. the last thought becomes fully readable and the fade clears at the end. restored font scale 1.0 afterward.
also collapsed and reopened the group. in a separate real thread, codex ran pwd and git status --short; expanded Worked and Ran 2 commands and checked the command rows and following reply.
no source changes were needed. the checkout is clean at the original head. stored ci status currently reports 28 successful, zero failing, zero pending checks; this runtime verification is independent of ci. no new checks were run because no code changed.
before, base renderer, same real thread and font scale:
base renderer clips the expanded real thoughts without an overflow fade
after, pr head:
pr head separates the expanded thoughts from the following reply
11-second recording, nested scrolling with the reply stationary and fade clearing at the end. inspected the capture and exercised playback and seeking after upload:
android nested thought scrolling and fade clearing at the end
last thought fully visible with the bottom fade cleared
Not verified
ios cannot run on this linux vm. dark theme, other providers, and relay/tunnel connections were not exercised. a full checkout and runtime pass on current github/main was not performed; the before capture uses only the pr base's renderer in the pr checkout. current github/main still contains the bare reasoning scroll view, but also has unrelated renderer changes.