Before submitting
Area
apps/server
Steps to reproduce
- Snooze a thread with Next week.
- Let its session fail after the snooze. In my case two Claude threads ran turns that failed at once with "Claude usage limit reached". The thread comes back as Failed, as intended: a failure newer than the snooze raises its hand.
- Snooze it again with Next week.
Expected behavior
The thread leaves the inbox until the new wake time.
Actual behavior
The command is accepted, but the thread stays in the inbox as Failed. Snoozing again with the same option does the same every time. I did it six times in 12 minutes on one thread. It looks like the snooze hangs or does nothing, with no toast.
Cause
A re-snooze to the same wake time is treated as a duplicate, and the original snoozedAt is kept:
- server:
apps/server/src/orchestration/decider.ts, thread.snooze, the existingSnoozedAt branch
- client optimistic twin:
packages/client-runtime/src/state/threadCommands.ts, snoozedAt: thread.snoozedUntil === input.snoozedUntil ? (thread.snoozedAt ?? now) : now
The raised-hand check in threadRaisedHandWhileSnoozed (packages/client-runtime/src/state/threadSettled.ts) compares session.updatedAt and latestTurn.completedAt against that stale snoozedAt. The failure is still newer, so the thread never classifies as snoozed again until the user picks a different wake time. Presets such as Tomorrow and Next week resolve to fixed clock times, so repeating the same option is the normal case.
Suggested fix
Remove the same-wake-time branch in both places, so an explicit snooze always stamps snoozedAt now. Re-snoozing means "I saw it, not now", so it should reset the raised-hand baseline. Real retries are already deduplicated by commandId receipts, and a double-click only moves the stamp by milliseconds. This is a net deletion. Update the existing decider.snoozed.test.ts case ("re-emits idempotently for a duplicate snooze to the same wake time") to assert a fresh snoozedAt. I can open the PR.
Impact
Minor bug or occasional failure
Version or commit
t3@0.0.43-nightly.20260929.2428 (main d2c9281). The code is unchanged on current main.
Environment
Linux host running t3 serve as a service, macOS desktop client connected remotely, Claude provider. Not specific to remote connections: the server accepted every command.
Logs or stack traces
# orchestration_events for one thread (UTC)
17:30:47.626 thread.snoozed client snoozedUntil 2026-10-05T07:00Z snoozedAt 17:30:47.626
17:45:45.170 thread.session-set provider status error "Claude usage limit reached…"
17:58:01.695 thread.session-set provider status error "Claude usage limit reached…" <- raises hand
17:58:19.209 thread.snoozed client snoozedUntil 2026-10-05T07:00Z snoozedAt 17:30:47.626 <- stale
17:58:33.557 thread.snoozed client …same…
17:58:52.528 thread.snoozed client …same…
18:03:21.077 thread.snoozed client …same…
18:04:53.764 thread.snoozed client …same…
18:10:21.969 thread.snoozed client …same…
# all receipts: accepted; projection_threads.snoozed_at stays 17:30:47.626
A second thread shows the same pattern (snoozed 17:30:40, error at 18:05:45, re-snoozes at 18:08 and 18:10 all keep 17:30:40).
Screenshots, recordings, or supporting files
Both threads after six "Next week" re-snoozes between 17:58 and 18:10. Every command was accepted, and both rows are still in the inbox as Failed:

Workaround
Snooze with a different option, such as Tomorrow or 3 hours. That stamps a fresh snoozedAt and the snooze holds.
Related
Before submitting
Area
apps/server
Steps to reproduce
Expected behavior
The thread leaves the inbox until the new wake time.
Actual behavior
The command is accepted, but the thread stays in the inbox as Failed. Snoozing again with the same option does the same every time. I did it six times in 12 minutes on one thread. It looks like the snooze hangs or does nothing, with no toast.
Cause
A re-snooze to the same wake time is treated as a duplicate, and the original
snoozedAtis kept:apps/server/src/orchestration/decider.ts,thread.snooze, theexistingSnoozedAtbranchpackages/client-runtime/src/state/threadCommands.ts,snoozedAt: thread.snoozedUntil === input.snoozedUntil ? (thread.snoozedAt ?? now) : nowThe raised-hand check in
threadRaisedHandWhileSnoozed(packages/client-runtime/src/state/threadSettled.ts) comparessession.updatedAtandlatestTurn.completedAtagainst that stalesnoozedAt. The failure is still newer, so the thread never classifies as snoozed again until the user picks a different wake time. Presets such as Tomorrow and Next week resolve to fixed clock times, so repeating the same option is the normal case.Suggested fix
Remove the same-wake-time branch in both places, so an explicit snooze always stamps
snoozedAtnow. Re-snoozing means "I saw it, not now", so it should reset the raised-hand baseline. Real retries are already deduplicated bycommandIdreceipts, and a double-click only moves the stamp by milliseconds. This is a net deletion. Update the existingdecider.snoozed.test.tscase ("re-emits idempotently for a duplicate snooze to the same wake time") to assert a freshsnoozedAt. I can open the PR.Impact
Minor bug or occasional failure
Version or commit
t3@0.0.43-nightly.20260929.2428 (main d2c9281). The code is unchanged on current main.
Environment
Linux host running
t3 serveas a service, macOS desktop client connected remotely, Claude provider. Not specific to remote connections: the server accepted every command.Logs or stack traces
A second thread shows the same pattern (snoozed 17:30:40, error at 18:05:45, re-snoozes at 18:08 and 18:10 all keep 17:30:40).
Screenshots, recordings, or supporting files
Both threads after six "Next week" re-snoozes between 17:58 and 18:10. Every command was accepted, and both rows are still in the inbox as Failed:
Workaround
Snooze with a different option, such as Tomorrow or 3 hours. That stamps a fresh
snoozedAtand the snooze holds.Related