Skip to content

[Bug]: iOS Live Activity compact status text wraps onto two lines when another Live Activity shares the Dynamic Island #15682

Closed

Description

@jlipworth

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

  1. Enable Live Activities in the T3 Code iOS app and start an agent turn so the AgentActivity Live Activity appears.
  2. Start a Live Activity from any other app (e.g. a podcast/now-playing, timer, or sports activity) so the Dynamic Island shows two activities side by side.
  3. Look at the T3 pill while the agent is running ("1 active"), then again after it finishes ("Done").

Expected behavior

The compact trailing status stays on one line, e.g. T3 1 active / T3 Done. If space is tight, it should shrink or fall back to a shorter form, not break across lines.

Actual behavior

The compact trailing label wraps onto a second line:

  • 1 active shows as 1 above act…
  • Done breaks in the middle of the word, as Don above e

The T3 pill still has plenty of empty horizontal space, so the label is wrapping inside a narrow trailing slot, not because the pill is full.

Likely cause

apps/mobile/src/widgets/AgentActivity.tsx (main @ 4ee6bfd), compactTrailing:

compactTrailing: (
  <Text modifiers={[font({ weight: "semibold", size: 11 }), foregroundStyle(tint)]}>
    {attentionRow
      ? attentionRow.phase === "waiting_for_approval"
        ? "Approval"
        : "Input"
      : activeLabel}
  </Text>
),

This is the only status Text in the file without lineLimit(1); the banner, watch card, and row texts all have it. When iOS gives the trailing region a narrow proposed width (as it does when the island is shared), SwiftUI wraps the text instead of truncating it.

Suggested fix

  • Add lineLimit(1) to the compactTrailing text, plus minimumScaleFactor(...) or fixedSize() so it shrinks or takes its natural width instead of truncating or wrapping.
  • Optionally use a terser compact label: the count only (1) while running, and the existing phase glyph (checkmark / cross) for Done/Failed, matching what minimal already does. Approval / Input / Out of date can hit the same problem.

Impact

Cosmetic issue

Version or commit

T3 Code iOS 2.0.0; code reference main @ 4ee6bfd

Environment

iPhone 18 Pro Max, iOS 27.2. Reproduced whenever a second app's Live Activity shares the Dynamic Island.

Screenshots

Running — 1 active wraps to 1 / act… (the other app's activity is blurred):

1 active wraps

Finished — Done breaks as Don / e:

Done wraps

Activity

  1. juliusmarminge commented on Oct 4, 2026

    @juliusmarminge
    Member

    Note

    Grok responding on behalf of Julius.

    Triage

    Thanks for the report and the clear screenshots, @jlipworth. The shared-island repro was enough to pin this down.

    What I found

    Confirmed on main at 4ee6bfd50e, and I didn't find another issue for it.

    • The text has no line limit. compactTrailing in apps/mobile/src/widgets/AgentActivity.tsx is a bare Text with just the semibold 11pt font and the phase tint.
    • What it shows. The string is activeLabel, which is one of:
      • N active while something is running
      • Done or Failed once nothing is active
      • Out of date when the activity goes stale
      • Approval or Input when a row needs you
    • Why it wraps. When another Live Activity shares the island, iOS gives the trailing slot a narrow width. Without a line limit, SwiftUI wraps the text to fit that width instead of using its natural width. That's why Done breaks as Don / e while the pill still has empty space.
    • The same gap exists elsewhere. The banner and expanded row status (renderCompactRow) and the watch card status also lack lineLimit(1). Those sit in wider stacks, though, and aren't the pill in your screenshots.

    Likely fix area

    Options for compactTrailing, using modifiers @expo/ui already provides (fixedSize is used in SubscriptionUsage.tsx):

    • fixedSize({ horizontal: true, vertical: false }), so the label takes its natural width.
    • lineLimit(1), so a label that still doesn't fit stays on one line and truncates.
    • minimumScaleFactor on its own would shrink the text to fit the narrow slot and leave the empty space unused. It would mainly help longer labels like Out of date or Approval.
    • Shorter compact copy, as you suggested, is another option.

    AgentActivity.test.ts checks the compact strings but not line breaking, so the wrap would need checking on a device with a second Live Activity running. This code is built into the widget extension, so any fix ships with a new iOS build.

    A maintainer will decide on the fix direction.

  2. added
    bugSomething is broken or behaving incorrectly.
    via-triageFiled through npx t3 triage
    on Oct 4, 2026
  3. ochodnicky commented on Oct 11, 2026

    @ochodnicky

    Having the same issue ➕ its a bit annoying

  4. onlydole commented on Oct 21, 2026

    @onlydole
    Contributor

    Submitted #23035 for this compact-layout defect.

    The fix keeps status labels such as Input and Approval on one line and shows running work as a bold black count inside a filled circle, capped at 99+. The native accessibility label retains the actual total.

    The PR shows the original bug beside the final design, including the final 99+ case, with a continuous six-second native recording at 30 fps. It also includes final native accessibility results, focused check output, and disposable reproduction fixtures. The evidence uses an actual second Live Activity on an iPhone 18 Pro simulator running iOS 27.0. All media are status-bar crops reviewed for personal information.

    The native build and pre-push checks passed. Physical iOS 27.0.1, single-activity visual behavior, VoiceOver speech, relay/APNs delivery, and the stale Out of date presentation remain unverified.

  5. added a commit that references this issue on Oct 22, 2026
    00640fd
  6. added
    needs more infoInitial triage showed no bug. Awaiting more info
    and removed
    needs more infoInitial triage showed no bug. Awaiting more info
    on Oct 22, 2026
  7. added a commit that references this issue on Oct 22, 2026
    96bae54
  8. added a commit that references this issue on Oct 23, 2026
    4743ad1
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