You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Bug]: iOS Live Activity compact status text wraps onto two lines when another Live Activity shares the Dynamic Island #15682
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
Enable Live Activities in the T3 Code iOS app and start an agent turn so the AgentActivity Live Activity appears.
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.
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.
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.
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.
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.
Activity
juliusmarminge commentedon Oct 4, 2026
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
mainat4ee6bfd50e, and I didn't find another issue for it.compactTrailinginapps/mobile/src/widgets/AgentActivity.tsxis a bareTextwith just the semibold 11pt font and the phase tint.activeLabel, which is one of:N activewhile something is runningDoneorFailedonce nothing is activeOut of datewhen the activity goes staleApprovalorInputwhen a row needs youDonebreaks asDon/ewhile the pill still has empty space.renderCompactRow) and the watch card status also lacklineLimit(1). Those sit in wider stacks, though, and aren't the pill in your screenshots.Likely fix area
Options for
compactTrailing, using modifiers@expo/uialready provides (fixedSizeis used inSubscriptionUsage.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.minimumScaleFactoron its own would shrink the text to fit the narrow slot and leave the empty space unused. It would mainly help longer labels likeOut of dateorApproval.AgentActivity.test.tschecks 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.
ochodnicky commentedon Oct 11, 2026
Having the same issue ➕ its a bit annoying
onlydole commentedon Oct 21, 2026
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.
fix(mobile): keep compact Dynamic Island status readable
fix(mobile): Dynamic Island status no longer wraps next to other Live…
chore: merge latest upstream main into develop (#3)