fix(web,mobile): replies to mid-run messages stay visible when a run folds#28171
Problem
When the user sends a message while a run is working, it becomes a steer inside that run. Once the run settles, the turn fold keeps only the run's last assistant message visible, so the agent's reply to the mid-run question is folded away and the user sees no answer. Reproduced on main (79f1fadfc6) in the web app with a real Claude run (one steer) and a real Codex run (two steers): after settling, each steer is followed only by a "Continued for Ns" row, and the replies ("I'd use 'Multiplies x by N'…", "No—each function is exported under its own name", "No—this task only removes the specified comments…") are hidden inside it.
Change
In a settled, folded run, the first assistant message after each steer stays visible, the same way the run's terminal message already does. Back-to-back steers count once. Everything else still folds: work, other progress notes, the "Worked for" and "Continued for" rows and their durations. The rule is applied in both fold implementations: web/desktop deriveTurnFolds (MessagesTimeline.logic.ts) and mobile deriveThreadFeedRunFolds (threadActivity.ts). Each tracks the runs awaiting a steer reply while it walks the timeline and leaves that message out of hiddenEntryIds.
Scope and approval
Fixes pingdotgg/t3code#28161
Triaged via the automated issue flow.
Verification
MessagesTimeline.logic.test.ts"keeps the agent's reply to each steer visible after the settled turn folds" andthreadActivity.test.ts"keeps the agent's reply to each steer visible after the settled run folds": prompt → progress note → work → steer → reply → progress note → work → second steer → reply → work → final. They fail on main because the replies are hidden. They pass here, and the progress notes and work stay folded. A mutation that keeps every message after a steer visible makes both fail.The existing "shows a created chat after a steer only when that steer's segment is open" test got one extra progress message, so its steer segment still has something to fold now that the reply stays visible.
Full files: web 92/92, mobile 44/44.
vp run check:changedpasses (format, lint, knip, typecheck, tests, React compiler).Web app on the same database, before (79f1fadfc6) and after (bfb4e88bf2), 1280×800, light theme:
Thread Before After Claude, one steer Reply hidden under "Continued for 1m 12s"; only the final summary visible Reply visible below "Continued for 1m 12s", then the final summary Codex, two steers Both replies hidden under "Continued for 22s" and "Continued for 39s" Both replies visible below their rows; progress notes and commands still folded Codex, "Continued for 22s" expanded (after only) — Reasoning, reply, progress notes and commands in chronological order The screenshots of these states are not attached yet.
Not checked: the native mobile client in the app (covered by the mobile unit test above), the recordings of expand/collapse and of a steer settling, and providers other than Claude and Codex.
Model and harness: Claude Opus 5.5 (lead, tests, implementation, review) and GPT-6.1 (review) in Claude Code and Codex, through T3 Code.
🤖 Generated with Claude Code
Checks
Added 4 commits
- test: reproduce #28161 hidden replies to steers in settled turn folds11181ce
- test: cover two steers and a progress note after the reply (#28161)9a2ac5e
- Merge remote-tracking branch 'origin/main' into fix/issue-28161abe711b
- fix(web,mobile): keep the reply to a steer visible when a settled run foldsbfb4e88
Approvability
Verdict: Approved at abe711b
Macroscope's review found this PR approvable — Replies to mid-run messages remain visible when completed runs fold on web and mobile. The change is confined to timeline presentation, without altering stored conversations or run execution.
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: fix/issue-28161
- File: .coderabbit.config.ts
- Commit: abe711b
- Layers: Repository TS config
- Review profile: CHILL
- Plan: Team
- Run ID:
f4720f1d-2f2e-44fc-b32f-878e7c155b03
External image Commits
Reviewing files that changed from the base of the PR and between 15fe2832727893cbdd2214383f9f971474849695 and abe711b821e4b12d889ec0f7a2c335ff489c26b1.
External image Files selected for processing: 4
apps/mobile/src/lib/threadActivity.test.tsapps/mobile/src/lib/threadActivity.tsapps/web/src/components/chat/MessagesTimeline.logic.test.tsapps/web/src/components/chat/MessagesTimeline.logic.ts
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.
Walkthrough
Web and mobile turn-fold logic now keeps the first assistant message after each steer visible. Regression tests check that steer replies and final answers remain visible while other progress messages are folded.
Changes: Steer reply visibility
Layer / File(s) Summary Identify and preserve steer replies
apps/mobile/src/lib/threadActivity.ts,apps/mobile/src/lib/threadActivity.test.ts,apps/web/src/components/chat/MessagesTimeline.logic.ts,apps/web/src/components/chat/MessagesTimeline.logic.test.tsBoth clients track runs awaiting a steer reply and exclude the first subsequent assistant message from folded entries. Tests cover multiple steers, progress messages, and final answers. The mobile logic recognizes both steerandpromoted_queued_to_steerintents.Estimated code review effort: 2 (Simple) | ~10 minutes
Change: Bug fix · Severity of issue fixed: Medium
Suggested reviewers:
t3dotgg,maria-rcks
Merge Risk: External image Minimal · up to abe71
The first assistant message after a steer remains visible in settled folds. No merge-blocking risk was identified.
Pre-merge checks: Passed 4
Check name Status Explanation Title check Passed The title names the primary change: in a settled folded run, replies to mid-run messages (steers) stay visible. It names both affected areas (web and mobile) and uses the repository's conventional com… Description check Passed The description follows the template's sections: Problem, Change, Scope and approval, and Verification. The Problem section gives the expected behavior and reproduction steps. The Change section expla… Linked Issues check Passed Issue #28161requires settled folds to keep the first assistant reply after each steer visible across web/desktop and mobile. The web change tracks pending steer replies inderiveTurnFolds; the mobi…Out of Scope Changes check Passed The pull request changes only the two linked fold implementations and their focused regression tests. The implementation and tests directly support issue #28161. No unrelated product behavior or unrel…Full details: Title check
Explanation
The title names the primary change: in a settled folded run, replies to mid-run messages (steers) stay visible. It names both affected areas (web and mobile) and uses the repository's conventional commit style. The changeset matches it: the test and logic changes in MessagesTimeline.logic.ts and threadActivity.ts keep the first assistant message after each steer visible when a run folds.
Full details: Description check
Explanation
The description follows the template's sections: Problem, Change, Scope and approval, and Verification. The Problem section gives the expected behavior and reproduction steps. The Change section explains the fix and why it applies to both the web and mobile fold implementations. Verification lists the focused tests, the results, the before/after web app checks, and what was not checked. The Scope and approval section links issue
#28161and notes it was triaged through the automated flow. Gaps: the screenshots are not attached yet, although the template asks for before/after screenshots for UI changes. The author states this openly. The 'Scope and approval' section cites an automated triage flow rather than explicit maintainer approval, so a maintainer should confirm that this meets the CONTRIBUTING.md requirement. The author also did not include the trailing model/harness line in the template's format, but the description does name the model and harness at the end.
Full details: Linked Issues check
Explanation
Issue
#28161requires settled folds to keep the first assistant reply after each steer visible across web/desktop and mobile. The web change tracks pending steer replies inderiveTurnFolds; the mobile change applies the same rule inderiveThreadFeedRunFolds. Both exclude retained reply IDs from folded entries. The changes preserve back-to-back steer handling and retain terminal replies. New web and mobile regression tests verify multiple steer replies remain visible while progress notes and work remain folded. The issue's other suggestions about fold hints, interrupted or cancelled runs, and agent instructions are not required by this focused change.
Full details: Out of Scope Changes check
Explanation
The pull request changes only the two linked fold implementations and their focused regression tests. The implementation and tests directly support issue
#28161. No unrelated product behavior or unrelated files are present in the reviewed diff.
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
Hit this too. Tested your patch against main 8b44f42: it fixes the disappearing replies, and 181 relevant tests pass. Native iOS UI not tested.
Thanks for this. #29859 makes the same change and is the one being kept.
#29859 covers the same disappearing steer replies and also preserves answers that arrive after an initial status update. That closes the remaining gap in keeping only the first assistant message after each steer visible.
Your reproduction and multiple-steer regression cases remain useful coverage for the shared bug. We should carry that coverage into the broader fix.
Closing as a duplicate.