Skip to content

[Bug]: Finished or input-waiting threads stay stuck in the mobile Working shelf #24901

Closed as duplicate

Description

@imluckii

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

On the current Android nightly (Working shelf beta on):

  1. Start a thread so it appears in the Working shelf.
  2. Let the run finish, or reach a point where the agent asks for input (approval or user input).
  3. Watch the Home list.

Also reproducible by switching to another app and back while a run finishes.

Expected behavior

A thread that stops working, or that starts waiting on approval/user input, moves out of the Working shelf into the normal visible section right away (input-requesting threads immediately, finished threads after the 2s grace from #24760).

Actual behavior

The thread stays in the Working shelf indefinitely, still shown as working. Collapsing/expanding the shelf, or anything that rebuilds the list, unsticks it. Once stuck it stays stuck because no further events arrive for that thread, so nothing re-renders the list.

Impact

Minor bug or occasional failure

Version or commit

Regression window: 0.1.3-nightly.20261024.3643 (fine) -> 0.1.3-nightly.20261025.3655 and 3669 (stuck). Introduced by #24760 (242d00c), likely interacting with the render-skipping from #24646 (62eb35b).

Environment

Android app (internal APK, versionName 2.1.0 build 464) on Android 15, connected to a remote T3 server on Linux.

Logs or stack traces

No crash; this is a client state bug. Reading the code: createInboxReturnTracker (packages/client-runtime/src/state/threadInbox.ts) only marks a thread as exited during observe(), and observe() re-runs from useThreadListV2 only when the threads array identity changes or the tracker version bumps. After a run's last shell update the array identity stops changing. When the grace timer fires it bumps the version and observe() re-runs, but with the same stale threads closure, so isThreadWorking on the stale shell (runtime still "running") returns true again and re-affirms working: true with no deadline. The exit is reverted and no further timer is armed, so the thread never leaves the shelf. navigationThreadShellsAtom (packages/client-runtime/src/state/threadShell.ts) returning the previous array when arrayElementsEqual contributes to the stable identity.

Workaround

Collapsing and re-expanding the Working shelf (or switching tabs) forces a rebuild and unsticks the rows.

Activity

  1. ilyakam commented on Oct 30, 2026

    @ilyakam

    Same thing. I couldn't find a thread last night. This morning I noticed it was stuck under "Working." See attached:

    Image

    Environment

    Android app (internal APK, versionName 2.2.0) on Android 17, connected to a remote T3 server on Linux.

  2. playcations commented on Oct 31, 2026

    @playcations
    Contributor

    I ran into this too and traced the finished-thread case to the Working list's memo. The React Compiler dropped the grace version from its dependencies, so the list only rebuilt when another thread updated. Fix: #28169.

    I didn't find a cause for threads waiting on input or approval staying in Working: those don't depend on the grace timer, so that part may need a separate look.

  3. kaovilai commented on Nov 4, 2026

    @kaovilai
    Contributor

    confused why #24907 is closed..

  4. imluckii commented on Nov 6, 2026

    @imluckii
    ContributorAuthor

    confused why #24907 is closed..

    I have no clue. Will have my agent look into why that PR got closed

  5. VDrozd-Cyclis commented on Nov 9, 2026

    @VDrozd-Cyclis

    Still observed on iPhone app 2.2.0 with macOS desktop and a remote Linux server, both 0.1.7. Clearing both environment caches, fully closing/reopening the app, and toggling Working section off/on did not resolve it. The manual update check reports Up to date.

    At 13:09 CET on November 9, an idle conversation shows a plain timestamp but remains inside Working, while another row reflects a newly started run. Earlier screenshots show a completed conversation with Done still inside Working. Host inspection confirmed that run completed with no active run; its lastVisitedAt was later than completion. The server answered the phone’s shell snapshot request with HTTP 200 during the incident.

    This supports stale section membership despite some updated row data. The user also reports stale status/read badges. The exact cause and installed JS update revision remain unknown; this is not confirmation of a regression after #28169.

    Phone licenses: effect/@effect/atom-react 4.0.5, expo-updates 58.0.17, react-native-screens 5.0.0-t3.48.

    No deterministic trigger or verified workaround yet. Host-side investigation was read-only.

    Investigated by Codex (GPT-6.1-Sol) in T3 Code.

    Screenshots

    12:55 CET: mobile Working count

    Desktop state accompanying the 12:55 CET mobile screenshot

    12:57 CET: completed row still inside Working

    13:09 CET: idle row still inside Working after toggling the section

    Mobile version and update-check evidence

    Mobile Effect dependency versions

    Mobile Expo Updates dependency versions

    Mobile React Native Screens version

    Manual mobile update check reports Up to date

    Original screenshots from the start of triage

    Initial mobile thread list

    Initial completed thread inside Working

    Initial desktop state

  6. playcations commented on Nov 9, 2026

    @playcations
    Contributor

    The fix in #28169 merged November 1, after the current App Store release, 2.2.0, was published on October 28. That original store build therefore does not include this fix, so this may still be the original bug rather than a regression.

    T3 supports compatible OTA updates, but delivery of this particular fix to the App Store build has not been confirmed. The “Up to date” result alone does not establish which JavaScript revision is running.

    There is a related report in #32350: iOS 2.2.0 (202) was missing another November 1 change while also reporting “Up to date”; that report was closed while waiting for its release to the installed app.

    Sources: merged fix, App Store version history, related report’s closing comment.

  7. juliusmarminge commented on Nov 12, 2026

    @juliusmarminge
    Member

    This is the same problem as #28169, so I'm closing it in favour of that one. If it is different, say how and it will be reopened.

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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions