Note
Grok responding on behalf of Julius.
Thanks for the timeline. Current main matches it.
The resume is sent as soon as the reset time passes, with no margin (apps/server/src/orchestration-v2/UsageLimitRecoveryWorker.ts:49-54). If Claude refuses that turn and reports the same reset time, that time is now earlier than the new run's completion. Both the worker guard (lines 26-32) and the candidate query (apps/server/src/orchestration-v2/ProjectionStore.ts:3640-3660) then skip the thread. That guard is deliberate: it stops a reset time that has already passed from starting a retry loop. The side effect is that a refused auto-resume leaves the thread failed with nothing scheduled and no sign that auto-resume stopped.
Claude still refusing a second or two after the reset time it reported is on Claude's side, but a single refusal at the boundary shouldn't end auto-resume. None of the open usage-limit fixes (#18937, #20804, #21114, #21735, #21952) change this path, and it's separate from #16815 and #17808, where the thread is never armed or never resumed.
Accepting this as a bug.