Usage-limit banner hides the snooze action when snooze and auto-resume are both armed#21397

opened6d agobyWWraient

Honest context

This is a follow up to #21384, which was closed as not planned. That closing was about the bigger ask (per-thread snooze and resume choices carrying over to later limits). I accept that part and will take it to Ideas if I want it.

This issue is only about the banner itself. Julius looked at the screenshot below and said the banner should have a snooze button as well, and that it looks like a bug. So I am filing this as a separate, narrow bug.

What the screenshot shows

A thread hit the Claude 5-hour usage limit. The banner reads "Usage limit reached, Resets 10/19/2026, 8:50:00 AM" and shows only "Cancel auto-resume". There is no "Snooze until reset" button and no "Wake now" button, even though the thread has both snooze and resume armed for this reset.

Usage limit banner showing only Cancel auto-resume, with no snooze button

Why this is a bug, from the code

In apps/web/src/components/chat/UsageLimitRecoveryBanner.tsx, "Cancel auto-resume" showing means scheduled is true. The Snooze button renders only when snoozed is false, so its absence means the banner computed snoozed as true: the thread has both snooze and resume armed for this reset. In that combined state the web banner offers nothing for the snooze half.

Mobile disagrees with web here. The same state in apps/mobile/src/features/threads/UsageLimitRecoveryCard.tsx renders a "Wake now" button, so web is the inconsistent one.

On top of that, the snoozed check compares snoozedUntil to the reset time with no clock check. Timer wakes never clear snoozedUntil on the server, so after the reset passes the banner can keep treating the thread as snoozed and the button never comes back for that cycle.

Expected

When both snooze and resume are armed, the banner should still show a snooze state action (matching mobile's "Wake now"), and once the wake time has passed it should stop treating the thread as snoozed so "Snooze until reset" is offered again.

Reproduced on main 70e5e384da in the Linux web dev app using an isolated, seeded usage-limit failure. With matching snooze and auto-resume armed, the recovery banner shows only “Cancel auto-resume”. Canceling auto-resume leaves only “Resume at reset”; waking through the separate snooze status row restores “Snooze until reset” in the banner. This verifies the banner rendering, not a live Claude quota reset. No duplicate found among open issues from the last 90 days.