Skip to content

[Bug]: An ended iOS Live Activity stays frozen on the Lock Screen when the app opens with no work running #16241

Open

Description

@jlipworth

Area

apps/mobile

Summary

#15254 dismisses ended Live Activities, but only inside LiveActivityFactory.start(), so only when the app creates a new card. Opening the app with no agent work running never calls start(). A card that iOS has already ended therefore stays frozen on the Lock Screen, and the app has no way to see it. #12656 handled this on every foreground. It was closed as superseded by #15254, but #15254 kept only the dismiss-before-start part.

Steps to reproduce

  1. iPhone, T3 Connect linked, Live Activity Updates on. Keep one card in use long enough for iOS to end it. Done is sent as an update, not an end, so one card is reused from turn to turn and can reach the ~8-hour limit in normal use. fix(mobile): an expired Live Activity no longer leaves a second card #15254's simulator method (end card A with the default dismissal policy) reproduces the ended state without the 8-hour wait.
  2. The card disappears from the Dynamic Island but stays on the Lock Screen showing its last content.
  3. Open T3 Code while no agent work is running on any linked environment, then lock the phone.

Expected behavior

Opening the app dismisses the ended card. A new card is armed the next time work runs, as it is today.

Actual behavior

The ended card stays on the Lock Screen for up to 4 hours, showing stale content that can no longer be updated. Opening the app any number of times doesn't remove it. Only swiping it away, or opening the app while a turn is running (which goes through start()), clears it.

Observed on a real iPhone: a frozen "Done" card on the Lock Screen, absent from the Dynamic Island when unlocked. New turns were arriving as plain push notifications instead of card updates, and reopening the app didn't change that. After swiping the card away, the next turn armed a fresh card and updates resumed. I didn't inspect the activity state on the device, so the ~8-hour limit is the most likely cause, not a confirmed one.

Root cause (main @ 25d5c7c)

Suggested fix

Move the ended-card loop from start() into its own factory method in the expo-widgets patch (for example dismissEnded(), still scoped to the factory's name). Call it at the top of the foreground reconcile, before getAgentLiveActivities(), and keep calling it from start(). This restores the foreground half of #12656, which already had tests for this path. Like #15254, it needs a store build.

Related

Workaround

Swipe the card away on the Lock Screen, or open the app while a turn is running.

Version or commit

main @ 25d5c7c

Activity

  1. juliusmarminge commented on Oct 5, 2026

    @juliusmarminge
    Member

    Note

    Grok responding on behalf of Julius.

    Triage

    Thanks again, @jlipworth! The pointers to #15254, #12656 and the upstream getInstances() change made this quick to trace.

    What I found

    Likely fix area

    • One option is the split suggested in the report: a factory-scoped dismissEnded() in the expo-widgets@58.0.11 patch (still filtered by content.state.name and .ended, using .immediate dismissal), called at the top of refreshActiveLiveActivityRemoteRegistration before getAgentLiveActivities(), kept in start(), and reused in endLocalLiveActivities.
    • A dismiss failure should probably be logged without blocking registration of a visible card. Binaries without the new native method would throw, so that call likely needs a guard.
    • This needs a store build. As noted in fix(mobile): an expired Live Activity no longer leaves a second card #15254, the Expo fingerprint doesn't hash root patches/, so an OTA wouldn't ship the native method. fix(mobile): dismiss ended Live Activities on foreground #12656's cleanup-before-discovery tests may be reusable.

    A maintainer will decide on the fix direction.

  2. added
    bugSomething is broken or behaving incorrectly.
    via-triageFiled through npx t3 triage
    on Oct 5, 2026
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

    bugSomething is broken or behaving incorrectly.via-triageFiled through npx t3 triage

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions