[Bug]: iOS Subscription usage widget stays empty after opening the app, while Usage → Limits shows quotas#22973
Before submitting
- I searched existing issues and did not find a duplicate for this symptom.
- I included enough detail to reproduce or investigate the problem.
Area
apps/mobile
Steps to reproduce
- Use T3 Code iOS 2.0.0 on iOS 27.0.1, with Codex and Claude quota data available.
- Add the Subscription usage Home Screen widget.
- Open T3 Code and visit Usage → Limits. Current quota numbers load for Codex and Claude.
- Return to the Home Screen and check the widget.
Expected behavior
Opening the app refreshes the widget with the available quota numbers, as described in the subscription widget guide. The widget may expire again later, but a foreground refresh should restore it.
Actual behavior
The widget keeps showing "Open T3 to refresh" for both Codex and Claude, with no quota rows, even though Usage → Limits inside the app shows current numbers.
The captured widget shows an observation time of October 21 at 8:21 AM. The screenshot was taken around 8:50 AM. That initial expired display is consistent with the current 15-minute freshness limit. The failure is that opening the app and visiting Limits does not restore the numbers.
Impact
Major degradation or frequent failure. The subscription widget remains empty; the in-app Limits screen works.
Version or commit
- iOS app: 2.0.0
- iOS: 27.0.1
- Source inspected: main at
680152e27b2a961686389ca69a1557cbb2c55f08 - Environment/server version has not been collected.
Source-only reproduction of a possible cause
A synthetic check against current main found a way for a newly observed snapshot to produce the same empty widget state:
- The quota snapshot is checked at 16:45.
- Its session window reports 0% used with a reset timestamp of 16:30.
- Its weekly window reports 30% used with a future reset timestamp.
- Publishing the widget timeline at 16:45 hides both windows and shows "Open T3 to refresh".
- Changing only the session reset timestamp to 17:30 restores both rows.
subscriptionUsageProps uses the minimum of the observation time plus 15 minutes and every reported reset timestamp as the whole provider's expiry. A reset timestamp before the observation therefore expires all that provider's rows immediately, including its weekly row.
Relevant source:
- Expiry calculation
- Expired timeline clears quota rows
- Foreground refresh hook
- Documented refresh behavior
The synthetic case has not been matched to the phone's actual provider timestamps. The device report establishes that in-app quotas load while the widget stays empty. It does not yet establish whether the failure comes from expiry calculation, timeline publication, or the native widget runtime.
Related work
- #21163 adds the missing Agent Activity Home Screen layout. This report concerns Subscription usage.
- #14861 adds background updates for Agent Activity.
- #22218 preserves known usage readings across failed source refreshes and explicitly retains the widget's unavailable-state behavior.
- #15682 tracks Dynamic Island label wrapping, which is a separate problem.
Workaround
Use Usage → Limits inside the app. Opening that screen does not refresh the Home Screen widget in this case.